PyQt5 和 QML 集成问题,“findChild”返回 AttributeError
Posted
技术标签:
【中文标题】PyQt5 和 QML 集成问题,“findChild”返回 AttributeError【英文标题】:PyQt5 and QML integration issue with "findChild" returning AttributeError 【发布时间】:2017-06-29 04:47:26 【问题描述】:我对 PyQt5 和 QML 集成还很陌生。我一直在寻找这个问题很长时间,但找不到与我的情况足够接近的场景。
我遇到的错误如下(我正在使用 PyCharm):
File "D:/PyCharmProjects/SimpleQML.py", line 13, in __init__
self.win = self.root.findChild(QObject, "mainWindow")AttributeError: 'NoneType' object has no attribute 'findChild'
这是我的python代码:
import sys
from PyQt5.QtCore import QUrl, QObject
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQuick import QQuickView
class SimpleQML(QQuickView):
def __init__(self, parent=None):
super(SimpleQML, self).__init__(parent)
self.setSource(QUrl.fromLocalFile("D:/Qt/SimpleQML/SimpleQML.qml"))
self.root = self.rootObject()
self.win = self.root.findChild(QObject, "mainWindow")
if __name__ == '__main__':
app = QApplication(sys.argv)
win = SimpleQML()
win.setTitle("SimpleQML")
win.setResizeMode(QQuickView.SizeRootObjectToView)
win.show()
sys.exit(app.exec_())
这是我的(非常简单的)QML 代码:
import QtQuick 2.6
import QtQuick.Window 2.2
Rectangle
id: mainWindow
objectName: "mainWindow"
visible: true
width: 400
height: 400
color: "#323232"
如果您对 QML 与 PyQt5 的集成有任何建议,我们非常欢迎。
提前谢谢你!
【问题讨论】:
【参考方案1】:你得到的错误是有效的,因为当你使用 rootObject 函数时你得到了 mainWindow 矩形,当你搜索你的孩子时你找不到任何孩子,因为你没有孩子。要检查它,您可以使用:
print(self.root.objectName())
输出:
mainWindow
如果您将 qml 更改为:
import QtQuick 2.6
import QtQuick.Window 2.2
Item
Rectangle
id: mainWindow
objectName: "mainWindow"
visible: true
width: 400
height: 400
color: "#323232"
然后你得到mainWindow
孩子。
【讨论】:
嗨!谢谢你的回答!不幸的是,即使尝试“打印(self.root.objectName())”也不起作用。 'NoneType' 对象没有属性 'objectName' 奇怪的是我已经使用了一段时间的代码并且它工作了,但现在不行了。最令人沮丧的是,我把它送给了一个朋友,它似乎正在工作!我不知道发生了什么 xD 您确定吗?,您可以通过驱动器、保管箱或类似方式共享您的代码 尝试重新安装pyqt。 小部件显示出来了吗? 这就是我拥有的所有代码。好的,那我明天试试重新安装pyqt!我会及时通知你。以上是关于PyQt5 和 QML 集成问题,“findChild”返回 AttributeError的主要内容,如果未能解决你的问题,请参考以下文章
使用 PyQt5 和 pyudev 通知 QML 的“usb 设备插入”事件