QQuickView仅支持从QQuickItem派生的根对象加载错误?

7
我使用pyqt5编写了简单的hello world程序。但是当我启动它时,会出现错误:
QQuickView only supports loading of root objects that derive from QQuickItem. 

If your example is using QML 2, (such as qmlscene) and the .qml file you 
loaded has 'import QtQuick 1.0' or 'import Qt 4.7', this error will occur. 

To load files with 'import QtQuick 1.0' or 'import Qt 4.7', use the 
QDeclarativeView class in the Qt Quick 1 module.

我试图解决它,但我想我不明白发生了什么。有人能详细解释一下这个错误吗?我应该如何解决它?

Main.py:

#!/usr/bin/python3.4


from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.Qt import *
from PyQt5.QtQuick import * 

if __name__=='__main__':
    import os
    import sys


class Main(QObject):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.view=QQuickView()
        self.view.setSource(QUrl.fromLocalFile('main.qml'))
    def show(self):
        self.view.show()



app=QApplication(sys.argv)
main=Main()
main.show()
sys.exit(app.exec_())

Main.qml

import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Window 2.0



ApplicationWindow
{
    signal btnPlayClicked()
    signal btnStopClicked()



    id:app
    width:Screen.desktopAvailableWidth
    height:Screen.desktopAvailableHeight
    color:"black"


    ToolBar{
            y:app.height-height
            height:btnPlay.height
                Button
                        {
                               id:btnPlay
                               x:app.width/2-btnPlay.width
                               text:"Play"
                               onClicked: parent.parent.btnPlayClicked()

                        }
                Button
                       {
                               id:btnStop
                               x:app.width/2
                               text:"Stop"
                               onClicked: parent.parent.btnStopClicked()

                       }



          }



}

我已经寻求关于完全相同的问题的帮助很长时间了,但一直没有找到,直到现在。 - Sнаđошƒаӽ
1个回答

11

错误信息很明确:ApplicationWindow不是QQuickItem,因此您不能使用QQuickView加载它。

原因是ApplicationWindow和QQuickView存在冲突,因为它们都继承自QQuickWindow。要加载ApplicationWindow,您需要使用QQmlApplicationEngine

class Main(QObject):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.engine = QQmlApplicationEngine(self)
        self.engine.load(QUrl.fromLocalFile('main.qml'))
        self.window = self.engine.rootObjects()[0]

    def show(self):
        self.window.show()

C++的答案: 这里 - Rémi
如果您希望窗口从一开始就显示,您可以在qml中的“ApplicationWindow”中添加 visible:true。然后您可以跳过 self.window = self.engine.rootObjects()[0] 的部分。 - jpyams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接