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 设备插入”事件

如何使用 QML 和 PyQt5 创建一个没有标题栏的小通知窗口

PyQt5 和 QML 中的嵌套 ListView

PyQt5 中的前后端分离与 QML

pyqt5 孩子使用 qml 文件访问

使用 PyInstaller 在 --onefile 中使用 QML 构建 PyQt5