【问题标题】:PyQt widget seems to "forget" its parentPyQt 小部件似乎“忘记”了它的父级
【发布时间】:2017-10-21 00:21:42
【问题描述】:

向 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 是不是我做错了什么?
  • 对象会以某种方式“忘记”其父对象吗?

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

【问题讨论】:

    标签: python layout pyqt parent-child pyqt5


    【解决方案1】:

    每当一个小部件被添加到布局中时,Qt 会自动重新设置它的父级,以便它成为设置布局的小部件的子级。在__init__ 中调用setParent(使用不同的小部件)不会产生持久效果。

    【讨论】:

    • 感谢您的解释。我通过在__init__ 方法中添加一个新的page 属性解决了这种情况,该属性不会被Qt 的处理劫持。
    猜你喜欢
    • 2015-10-28
    • 2014-05-07
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2011-09-03
    • 2017-06-09
    相关资源
    最近更新 更多