PyQt 设计师提升小部件 - 引用***对象?

Posted

技术标签:

【中文标题】PyQt 设计师提升小部件 - 引用***对象?【英文标题】:PyQt designer promoted widget - reference to top level object? 【发布时间】:2016-12-24 04:42:55 【问题描述】:

在 Qt 设计器中,我有一个自定义 graphicsView 小部件,我将其提升为一个名为 View 的自定义类:

注意它的父级是horizo​​ntalLayout。来自 pyuic 的相应代码如下所示:

class Ui_panelFill(object):
    def setupUi(self, panelFill):
        panelFill.setObjectName("panelFill")
        panelFill.resize(1031, 702)
        self.centralwidget = QtWidgets.QWidget(panelFill)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 20, 1001, 631))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.graphicsView = View(self.horizontalLayoutWidget)
        self.graphicsView.setObjectName("graphicsView")
        ...

程序的核心,例如所有重要的变量和方法,都在一个名为 panelFill 的***类中。

class panelFill(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        uic.loadUi("panelFill.ui",self)

        self.vertices=[[0,0],[0,120],[240,120],[240,0]]
        ...

如何从 View 类的方法中引用 vertices 变量?我希望有类似 self.parent.vertices 的东西,但可惜父级不是 panelFill 对象,它是水平布局。是否有类似 self.superduper().vertices 的东西来获取***父对象的属性而不是直接父对象?

【问题讨论】:

【参考方案1】:

实际上,您的View 的父级是horizontalLayoutWidget,即QWidget - 所有小部件都必须有另一个小部件作为父级。

要获取层次结构中的***小部件,您可以使用图形视图小部件的window() 方法。此方法只是使用parentWidget() 沿着祖先链向上走,直到找到一个没有父级的小部件 - 根据定义,它必须是***小部件(即您的主窗口)。

【讨论】:

谢谢,我刚刚在另一个类似的问题中找到了这个。所以在视图 init 我做 self.top=self.window () 然后做 self.top.vertices

以上是关于PyQt 设计师提升小部件 - 引用***对象?的主要内容,如果未能解决你的问题,请参考以下文章

PyQT - 在特定选项卡中引用小部件

如何使用 PyQt 中的样式表将小部件放在前面?

PyQt:有没有更好的方法在代码中设置对象名称?

pyqt - 将来自 qt 设计器的子小部件定位在父级附近

无法在 Qt 设计器(macos)中显示自定义 PyQt5 小部件插件

PyQt / PySide - 小部件的实际大小