自定义Qt设计器小部件的代码?

Joh*_*eil 4 python pyqt qt-designer pyqt5 uic

我需要向使用 Qt Designer 创建的表单中的图形小部件添加一些功能。

例如我通常会这样做:

class custom_gv(QGraphicsView):
    def __init__(self):
        super().__init__()

    def zoom(self):
        # custom code here
Run Code Online (Sandbox Code Playgroud)

但在本例中,图形视图是我在 Qt Designer 中创建的窗口的一部分。我知道您可以在 Qt 设计器中使用“升级到”功能,但我不知道如何在代码中使用该功能,特别是考虑到我使用此方法来使用 Qt 设计器窗口:

from PyQt5.uic import loadUiType

custom_window = loadUiType('ui.ui')

class Window(QMainWindow, custom_window):
    def __init__(self):
        QMainWindow.__init__(self)
        custom_window.__init__(self)
        self.setupUi(self)
Run Code Online (Sandbox Code Playgroud)

那么,当我使用 Qt Designer 时,我该如何自定义窗口中图形视图的代码呢?

ekh*_*oro 6

解决此问题的最常见方法是使用小部件升级。这将允许您用您自己的自定义类替换 Qt Designer 中定义的小部件。执行此操作的步骤如下:

在 Qt Designer 中,选择QGraphicsView要替换的,然后右键单击它并选择升级到...。在对话框中,将升级类名称设置为“custom_gv”,并将头文件设置为包含此类的模块的Python 导入路径(例如“mypkg.widgets”)。然后单击“添加”和“升级”,您将在对象检查器窗格中看到类从“QGraphicsView”更改为“custom_gv”。

当Qt Designerui文件转换为PyQt代码时,它会自动添加一条导入语句,如下所示:

from mypkg.widgets import custom_gv
Run Code Online (Sandbox Code Playgroud)

然后在转换后的代码中它将替换如下内容:

    self.graphicsView = QtWidgets.QGraphicsView(MainWindow)
Run Code Online (Sandbox Code Playgroud)

有了这个:

    self.graphicsView = custom_gv(MainWindow)
Run Code Online (Sandbox Code Playgroud)

因此文件中的代码ui对自定义类一无所知:它只是从其他地方导入的名称。这意味着您可以完全自由地以您喜欢的任何方式编写自定义类。

在 PyQt 中,该机制的工作方式与pyuic模块相同uic。和loadUi函数loadUiType生成与 完全相同的代码pyuic。唯一的区别是该pyuic工具将生成的代码写入文件,而uic模块直接通过exec.