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

Customising code of Qt designer widget?

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

例如我通常会这样做:

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

    def zoom(self):
        # custom code here

但在这种情况下,图形视图是我在 Qt Designer 中制作的 window 的一部分。我知道您可以在 Qt 设计器中使用 "promote to" 功能,但我不知道如何在代码中使用它,特别是考虑到我使用这种方法来使用 Qt 设计器 windows:

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)

那么,当我使用 Qt Designer 时,我将如何在 window 中自定义图形视图的代码?

最常见的解决方法是使用 widget promotion。这将允许您用自己的自定义 class 替换 Qt Designer 中定义的小部件。操作步骤如下:

在Qt Designer中,select要替换的QGraphicsView,然后right-click它和select 提升为...。在对话框中,将 Promoted class name 设置为 "custom_gv",并将 Header file 设置为 python包含此 class 的模块的导入路径(例如 "mypkg.widgets")。然后点击添加推广,你会看到class从"QGraphicsView"变为"custom_gv"在“对象检查器”窗格中。

当Qt Designer ui文件转换为PyQt代码时,会自动添加这样的import语句:

from mypkg.widgets import custom_gv

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

    self.graphicsView = QtWidgets.QGraphicsView(MainWindow)

有了这个:

    self.graphicsView = custom_gv(MainWindow)

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

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

加载它