我需要以使用Qt Designer创建的形式向图形小部件添加一些功能。
例如,我通常会这样做:
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时,如何定制窗口中图形视图的代码?
解决此问题的最常见方法是使用小部件升级。这将允许您用自己的自定义类替换Qt Designer中定义的小部件。执行此操作的步骤如下:
在Qt Designer中,选择QGraphicsView要替换的对象,然后右键单击它,然后选择“ 升级为…” 。在对话框中,将 Promoted类名称 设置为“ custom_gv”,并将 Header文件 设置为包含该类的模块的python导入路径(例如“ mypkg.widgets”)。然后单击 Add 和 Promote ,您将在Object Inspector窗格中看到该类从“ QGraphicsView”更改为“ custom_gv”。
QGraphicsView
当Qt Designerui文件转换为PyQt代码时,它将自动添加如下的import语句:
ui
from mypkg.widgets import custom_gv
然后在转换后的代码中将替换如下内容:
self.graphicsView = QtWidgets.QGraphicsView(MainWindow)
有了这个:
self.graphicsView = custom_gv(MainWindow)
因此,ui文件中的代码对自定义类一无所知:它只是从其他位置导入的名称。这意味着您可以完全自由地以自己喜欢的任何方式编写自定义类。
在PyQt的,这种机制的工作原理与以同样的方式pyuic,因为它与不uic模块。该loadUi和loadUiType作为功能产生完全相同的代码pyuic一样。唯一的区别是该pyuic工具将生成的代码写入文件,而uic模块直接通过加载它exec。
pyuic
uic
loadUi
loadUiType
exec