我正在尝试使用pyqt python创建应用程序。应用程序的主窗口充满了许多停靠小部件,一些停靠小部件仅用于列出某些字符串数据。这些小部件占用更多空间。

python - 在主窗口中增加可用空间-LMLPHP

图片左边的抽屉是我的兴趣所在。单击鼠标即可打开该抽屉。

python - 在主窗口中增加可用空间-LMLPHP

有什么办法可以将这些小部件隐藏在主窗口的一侧并在鼠标悬停在其上方时打开?

或者,如果您知道任何可以执行此操作的pyqt UI元素。请提出建议。

最佳答案

逻辑是检测所需事件并显示小部件,在以下示例中,检测到对QGraphicsView的单击,然后显示最初隐藏的QDockWidget。

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.dock_widget = QtWidgets.QDockWidget()

        self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dock_widget)

        list_widgets = QtWidgets.QListWidget()
        list_widgets.addItems(["item{}".format(i) for i in range(100)])

        self.dock_widget.setWidget(list_widgets)

        self.scene = QtWidgets.QGraphicsScene(self)
        self.view = QtWidgets.QGraphicsView(self.scene)
        it = self.scene.addRect(QtCore.QRectF(0, 0, 300, 400))
        it.setBrush(QtGui.QColor("white"))

        self.view.viewport().installEventFilter(self)

        self.setCentralWidget(self.view)

        self.dock_widget.hide()

        self.resize(640, 480)

        for i in range(4):
            self.menuBar().addAction("Action{}".format(i))

    def eventFilter(self, obj, event):
        if obj is self.view.viewport():
            if event.type() == QtCore.QEvent.MouseButtonPress:
                self.dock_widget.show()

        return super().eventFilter(obj, event)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = MainWindow()
    w.show()

    sys.exit(app.exec_())

10-04 22:27