PyQt5 findChild返回None

时间:2018-03-02 23:34:47

标签: python pyqt qml

我看到其他人问这个问题,但没有我尝试过的。 我正在使用 PyQt 5.10.1。

这是python代码:

app = QGuiApplication(sys.argv)
view = QQuickView()
view.setSource(QUrl("module/Layout.qml"))
print(view.rootContext())
print(view.findChild(QObject, 'launcherComponent'))
import pdb; pdb.set_trace()
sys.exit(app.exec())

这是QML代码:

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Window 2.2

import "calendar/resources" as CalendarComponent
import "weather/resources"  as WeatherComponent
import "launcher/resources" as LauncherComponent

import Test 1.0
import Weather 1.0
import Calendar 1.0
import Launcher 1.0


ApplicationWindow {
    id: appId
    width: Screen.desktopAvailableWidth
    height: Screen.desktopAvailableHeight
    visible: true
    modality: Qt.ApplicationModal
    flags: Qt.Dialog
    title: qsTr("NarcisseOS")
    color: "black"

    LauncherComponent.LauncherComponent {
        id: launcherComponentId
        objectName: launcherComponent
        height: parent.height
        width: parent.width
        anchors.centerIn: parent
    }
}

我尝试了我想到的一切。但是这个findChild函数只返回None。

我尝试重新安装PyQt5。我试图将objectName属性放在一个Rectangle对象中,我想可能是一个更通用的属性。它都不起作用。

感谢您的帮助。

于连

1 个答案:

答案 0 :(得分:1)

您的代码有几个错误:

  • document.write();属性必须是字符串:
objectName
  • 另一个错误是,如果您要使用LauncherComponent.LauncherComponent { id: launcherComponentId objectName: "launcherComponent" height: parent.height width: parent.width anchors.centerIn: parent } ,则不应使用ApplicationWindow,因为QQuickView会创建一个顶层和ApplicationWindow,因此您将拥有2个toplevels而你正在寻找QQuickView的儿子而不是QQuickView孩子的儿子,所以我建议你修改你的.py到:
ApplicationWindow

也就是说,您必须使用import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtQml import * app = QGuiApplication(sys.argv) engine = QQmlApplicationEngine() engine.load(QUrl("module/Layout.qml")) if len(engine.rootObjects()) == 0: sys.exit(-1) print(engine.rootObjects()[0].findChild(QObject, 'launcherComponent')) sys.exit(app.exec_())