findChild 使用自定义小部件返回 None

Posted

技术标签:

【中文标题】findChild 使用自定义小部件返回 None【英文标题】:findChild returns None with custom widget 【发布时间】:2013-05-02 02:56:39 【问题描述】:

我在 Python 中创建了一个自定义 Qt 小部件,并设法让它在运行时加载到表单中,但是当我尝试使用 findChild 将它从表单实例中抓取回来时,我得到了 None

小部件已加载,如果我打印出表单上的名称和对象,我可以看到它:

DEBUG:root:<PyQt4.QtGui.QCheckBox object at 0x11358030>
DEBUG:root:Near_Other_Infrastructure
DEBUG:root:<PyQt4.QtGui.QCheckBox object at 0x113582B8>
DEBUG:root:photo
DEBUG:root:<imagewidget.QMapImageWidget object at 0x113586A8>

这是代码:

images = self.forminstance.findChild(QMapImageWidget)

更新:

似乎这样做有效:

images = self.forminstance.findChild(QWidget, "photo")

它返回DEBUG:root:&lt;imagewidget.QMapImageWidget object at 0x113586A8&gt;

虽然我真的更喜欢通过类型获取控件而不使用名称。

有什么想法吗?

【问题讨论】:

我们可以看到您用于将小部件加载到表单中的行吗? 我正在使用 QUiLoader() 和 load 方法加载它。 我也遇到过这种情况。可能是 Qt 或 PyQt 中的错误?你试过 self.forminstance.findChild(QMapImageWidget, "photo")。也就是说,对您有用的是一种解决方法,也许只是运气。您的原始代码也应该可以工作。 【参考方案1】:

我也有这个问题。

一个简单的解决方案是找到一个非自定义基类并进行强制转换。

Custom* ptr = dynamic_cast<QWidget*>(root->findChild<QWidget*>("MyWidgetName"));
if (ptr)

    //...whatever

【讨论】:

以上是关于findChild 使用自定义小部件返回 None的主要内容,如果未能解决你的问题,请参考以下文章

Qt查找孩子findChild

PySide2 findChild 不返回

实现自定义 Gtkmm 小部件:我应该在虚拟 on_* 函数中返回啥?

如何在不导入自定义小部件类包的情况下使用自定义小部件和 uic.loadUi?

QObject::findChild 返回 null,找不到跨 QML 对象

如何设置自定义小部件的背景颜色和边框宽度?