无法在PySide2上使用ApplicationWindow(QML)

时间:2018-09-10 12:54:19

标签: python qml pyside2

我正在尝试使用QML(更具体地说是ApplicationWindow)运行一个简单的Qt应用程序。

我的Python代码是一个简单的QML调用程序:

import sys
from PySide2.QtWidgets import QApplication
from PySide2.QtQuick import QQuickView
from PySide2.QtCore import QUrl

if __name__ == '__main__':

    app = QApplication(sys.argv)

    view = QQuickView()
    url = QUrl('view.qml')
    view.setSource(url)
    view.show()

    sys.exit(app.exec_())

我的QML文件是一个简单的ApplicationWindow,具有标题,宽度和高度:

import QtQuick 2.0

ApplicationWindow {

    title: "Qt Quick Controls Gallery"

    width: 640
    height: 480
}

运行代码将导致黑屏,其默认标题(“ gui.py”,而不是QML上给出的标题)以及默认的宽度和高度(在QML文件上未指定):

enter image description here

我可以运行其他组件,例如矩形,按钮和画布,而不会出现问题。我的问题特别是与ApplicationWindow组件有关,我想使用它,因为它是QML应用程序的标准。

随着PySide2成为Python Qt的支持,我一直在努力坚持,但是我当然也接受PyQt解决方案。

2 个答案:

答案 0 :(得分:2)

如果您阅读docs

  

QQuickView类提供了一个用于显示Qt Quick用户界面的窗口。

也就是说,QQuickView提供了一个显示项目的窗口,但是ApplicationWindow已经是一个窗口,因此在{{的情况下,您不再需要也不应该使用QQuickView 1}},您必须使用ApplicationWindow

main.py

QQmlApplicationEngine

view.qml

import sys
from PySide2 import QtCore, QtGui, QtQml

if __name__ == '__main__':

    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    app = QtGui.QGuiApplication(sys.argv)

    engine = QtQml.QQmlApplicationEngine()

    url = QtCore.QUrl.fromLocalFile('view.qml')
    engine.load(url)
    if not engine.rootObjects():
        sys.exit(-1)

    sys.exit(app.exec_())

答案 1 :(得分:2)

首先,当pyside返回时:

  

QQuickView不支持将Windows用作根项目。如果你希望   要从QML创建根窗口,请考虑使用   代替QQmlApplicationEngine。

这是一个有效的示例:

main.py

import sys
from PySide2.QtWidgets import QApplication
from PySide2.QtCore import Qt, QCoreApplication
from PySide2.QtQml import QQmlApplicationEngine

if __name__ == '__main__':

    app = QApplication(sys.argv)

    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)

    engine = QQmlApplicationEngine('view.qml')

    sys.exit(app.exec_())

view.qml

import QtQuick.Controls 2.4
import QtQuick 2.0

ApplicationWindow {

    title: "Qt Quick Controls Gallery"
    visible: true
    width: 640
    height: 480
    Rectangle {
        width: 30
        height: 30
        color: "blue"
    }
}