4

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

例如,我通常会做这样的事情:

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

    def zoom(self):
        # custom code here

但在这种情况下,图形视图是我在 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)

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

4

1 回答 1

5

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

在 Qt Designer 中,选择QGraphicsView要替换的,然后右键单击它并选择提升为...。在对话框中,将Promoted class name设置为“custom_gv”,并将Header file设置为包含该类的模块的python 导入路径(例如“mypkg.widgets”)。然后单击AddPromote,您将在 Object Inspector 窗格中看到类从“QGraphicsView”更改为“custom_gv”。

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

from mypkg.widgets import custom_gv

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

    self.graphicsView = QtWidgets.QGraphicsView(MainWindow)

有了这个:

    self.graphicsView = custom_gv(MainWindow)

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

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

于 2017-02-06T20:00:24.273 回答