PyQt: как получить корневой объект из QQmlApplicationEngine

Я пытаюсь отобразить динамический объект с помощью PyQt и QML, но получаю эту ошибку:

win = engine.rootObjects()[0] 

IndexError: индекс списка вне допустимого диапазона

Вот мой код PyQt:

import sys
import os
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQml import QQmlApplicationEngine,QQmlEngine, QQmlComponent
from PyQt5.QtCore import QObject, pyqtSlot, QVariant,QUrl


if __name__ == "__main__":
   app = QApplication(sys.argv)
   engine = QQmlApplicationEngine()
   engine.load('main.qml')
   win = QObject()
   win = engine.rootObjects()[0]
   win.show()
   sys.exit(app.exec_())

(PS: с нединамическим объектом мой код работает нормально)

это мой main.qml

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
ApplicationWindow {
id : root
visible: true
width: 1000
height: 800
title: qsTr("ACTEMIUM")
SwipeView {
    id: swipeView
    anchors.fill: parent
    currentIndex: tabBar.currentIndex
    Page1 {
        Label {
            text: qsTr("Page1")
            anchors.centerIn: parent
        }
    }


    Page2 {
        Label {
            text: qsTr("Second page")
            anchors.centerIn: parent
        }
    }

    Page3 {
        Label {
            text: qsTr("Troisieme page")
            anchors.centerIn: parent
        }
    }
}

footer: TabBar {
    id: tabBar
    currentIndex: swipeView.currentIndex

    TabButton {
        text: qsTr("First")
    }
    TabButton {
        text: qsTr("Second")
    }
    TabButton {
        text: qsTr("Trois")
    }
}

}

и мой импорт Page1.qml QtQuick 2.7

Page1Form {
id: root
button.onClicked: {
    console.log("OK. Entered text: " + textField.text);

    var component = Qt.createComponent("main2.qml")
    if( component.status != Component.Ready )
    {
        if( component.status == Component.Error )
            console.debug("Error:"+ component.errorString() );
        return; // or maybe throw
    }
    var window = component.createObject(root)
    window.show()

}

}

Page1Form.ui.qml :

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0

 Item {
property alias textField: textField
property alias button: button


Rectangle {

    id: rectangle
    x: 0
    y: 0

    width: 1000
    height: 800

    gradient: Gradient {
        GradientStop {
            position: 0.031
            color: "#ffffff"
        }

        GradientStop {
            position: 0.901
            color: "#000000"
        }


    }

    RowLayout {
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.topMargin: 20
        anchors.top: parent.top

        TextField {
            id: textField
            placeholderText: qsTr("ENTRER TEXTE")
        }

        Button {
            id: button
            text: qsTr("OK")


        }


    }


 }
 }

person karahman    schedule 15.03.2017    source источник
comment
Пожалуйста, предоставьте QML-код   -  person folibis    schedule 15.03.2017
comment
это мой основной qml   -  person karahman    schedule 16.03.2017
comment
Зачем тебе это надо? Корневой объект (ApplicationWindow) уже устанавливает для свойства visible значение true. В большинстве случаев это плохая идея — обращаться к движку QML и извлекать ссылки на объекты.   -  person Kevin Krammer    schedule 16.03.2017
comment
но почему, когда я запускаю Python, у меня возникает ошибка IndexError: индекс списка вне диапазона   -  person karahman    schedule 16.03.2017


Ответы (1)


Я делаю это следующим образом:

app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
ctx = engine.rootContext()
ctx.setContextProperty("qmlapp", engine) #the string can be anything 
engine.load('main.qml')
win = engine.rootObjects()[0]
win.show()

Но вряд ли это ваша проблема. Я видел ошибку, когда у меня был #character в QML. Например, если вы случайно забыли кавычки в следующем:

background: Rectangle {
    id: rect
    border.color: menuBorderColor
    color: #AAA000  //forgot quotes
}

Это заставит python жаловаться на индекс списка вне допустимого диапазона. Тщательно проверьте свой код QML на наличие таких ошибок.

person ak22    schedule 30.03.2017
comment
спасибо за ответ, я решил проблему, это была проблема версии pyqt, я был с версией 5.4, тогда для работы QtQuick.Controls 2 нужно использовать минимум Pyqt 5.7. извините за мой язык рекламы ;) - person karahman; 31.03.2017