将小部件添加到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。
答案 0 :(得分:2)
每当窗口小部件被添加到布局中时,Qt都会自动重新设置窗口小部件,以便它成为布局设置的窗口小部件的子窗口。在setParent
中调用__init__
(使用不同的小部件)将不会产生持久影响。