定制化Qt Designer小部件的代码?

4

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

例如,我通常会像这样进行操作:

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

    def zoom(self):
        # custom code here

但在这种情况下,图形视图是我在Qt Designer中创建的窗口的一部分。我知道你可以在Qt Designer中使用“提升到”功能,但我不知道如何在代码中利用它,特别是考虑到我使用此方法来使用Qt Designer窗口:

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时,如何定制窗口中图形视图的代码呢?


推广小部件非常简单。您具体不理解什么? - ekhumoro
当我使用LoadUiType方法而不是先将其转换为代码的方法时,在PyQt中如何使用它。 - John O'Neil
它的工作方式完全相同。 - ekhumoro
我该如何编辑推广的类呢?这可能是因为我不太理解tloadUiType的工作原理。 - John O'Neil
1个回答

6
解决这个问题的最常见方法是使用widget promotion。这将允许您用自己的自定义类替换在Qt Designer中定义的小部件。具体步骤如下:
在Qt Designer中选择要替换的QGraphicsView,然后右键单击它,选择Promote to...。在对话框中,将Promoted class name设置为"custom_gv",将Header file设置为包含该类的模块的Python导入路径(例如"mypkg.widgets")。然后点击AddPromote,你会看到在对象检视器面板中,类从"QGraphicsView"变成了"custom_gv"。
当Qt Designer的ui文件转换为PyQt代码时,它会自动添加像这样的导入语句:
from mypkg.widgets import custom_gv

然后在转换后的代码中,它将替换类似于这样的内容:
    self.graphicsView = QtWidgets.QGraphicsView(MainWindow)

通过这种方式:

    self.graphicsView = custom_gv(MainWindow)

因此,在 ui 文件中的代码对于自定义类一无所知:它只是从其他地方导入的名称。这意味着您完全可以按照任何您喜欢的方式编写自定义类。
在 PyQt 中,使用 pyuic 的机制与使用 uic 模块的方式相同。 loadUiloadUiType 函数生成的代码与 pyuic 生成的代码完全相同。唯一的区别在于,pyuic 工具将生成的代码写入文件,而 uic 模块通过 exec 直接加载它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接