PyQt5迁移PySide2:Qt.FindDirectChildrenOnly选项失效问题求助
PySide2中
findChildren使用Qt.FindDirectChildrenOnly行为不一致的解决方法 在从PyQt5迁移到PySide2的过程中,你遇到了findChildren方法搭配Qt.FindDirectChildrenOnly选项的行为差异:PyQt5仅返回当前控件的直接子控件widget2,但PySide2会返回widget2和深层子控件widget3,没有正确限制递归范围。
解决方法
方案1:直接遍历直接子对象
放弃依赖Qt.FindDirectChildrenOnly选项,改用children()方法获取直接子对象并筛选类型:
from PySide2.QtWidgets import QApplication, QWidget, QLabel from PySide2.QtCore import Qt import sys class widget1(QWidget): def __init__(self): super().__init__() widget2 = QWidget(self) widget2.setObjectName("widget2") widget3 = QLabel( "SomeLabel", widget2) widget3.setObjectName("widget3") # 手动筛选直接子QWidget for w in self.children(): if isinstance(w, QWidget): print(w.objectName()) if __name__ == '__main__': app = QApplication(sys.argv) win = widget1()
children()方法本身只返回当前控件的直接子对象,无需额外递归限制,结果与PyQt5的预期行为一致。
方案2:通过父控件判断过滤
如果需要保留findChildren的调用形式,可以在结果中筛选父控件为当前对象的子控件:
from PySide2.QtWidgets import QApplication, QWidget, QLabel from PySide2.QtCore import Qt import sys class widget1(QWidget): def __init__(self): super().__init__() widget2 = QWidget(self) widget2.setObjectName("widget2") widget3 = QLabel( "SomeLabel", widget2) widget3.setObjectName("widget3") # 过滤出直接子控件 for w in self.findChildren(QWidget): if w.parent() is self: print(w.objectName()) if __name__ == '__main__': app = QApplication(sys.argv) win = widget1()
这种方式先获取所有递归子控件,再筛选出直接子控件,能适配原有代码结构。
原因说明
该问题是PySide2与PyQt5对Qt的FindDirectChildrenOnly选项实现差异导致的,PySide2的该选项未正确过滤深层子控件,手动筛选可以绕过这一实现差异。
内容的提问来源于stack exchange,提问作者MGafaji
相关产品推荐
相关产品推荐

