PyQt小部件似乎"忘记"其父

时间:2017-05-21 07:30:28

标签: python layout pyqt parent-child pyqt5

将小部件添加到PyQt5应用程序时,我遇到了一个奇怪的问题。

以下是实际代码,剥离了似乎没有相关的所有内容(如translateUI):

class OllRoot(preferences.Group):
    """Basic openLilyLib installation"""
    def __init__(self, page):
        super(OllRoot, self).__init__(page)
        self.setParent(page)
        self.changedRoot()

        layout = QGridLayout()
        self.setLayout(layout)

        self.directory = widgets.urlrequester.UrlRequester()
        self.directory.changed.connect(self.changedRoot)

        layout.addWidget(self.directory, 0, 1)

    def changedRoot(self):
        print("Self:", self)
        print("Parent:", self.parent())
        self.parent().changed.emit()
        # TODO: Check for proper openLilyLib installation

调用构造函数时,parent()被正确设置为已作为page传入的对象,因此将打印两个正确的对象。

Self: <preferences.openlilylib.OllRoot object at 0x7f855a1de288>
Parent: <preferences.openlilylib.OpenLilyLibPrefs object at 0x7f855a1bcb88>

然而,当我在self.directory窗口小部件changedRoot进行更改时再次调用(因为我已连接它),但现在父母似乎已经消失了:

Self: <preferences.openlilylib.OllRoot object at 0x7f855a1de288>
Parent: <PyQt5.QtWidgets.QWidget object at 0x7f855a1dbc18>

问题:

  • 我对setParent
  • 做错了什么
  • 我对connect
  • 做错了什么
  • 对象是否会以某种方式忘记&#34;它的父母?

PS:可以在此处找到用作模型的可比较文件:https://github.com/wbsoft/frescobaldi/blob/master/frescobaldi_app/preferences/general.py#L56

1 个答案:

答案 0 :(得分:2)

每当窗口小部件被添加到布局中时,Qt都会自动重新设置窗口小部件,以便它成为布局设置的窗口小部件的子窗口。在setParent中调用__init__(使用不同的小部件)将不会产生持久影响。