无法在 PySide2 上使用 ApplicationWindow (QML)

Cannot use ApplicationWindow (QML) on PySide2

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

我的 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 上指定的)文件):

我可以 运行 其他组件,例如矩形、按钮和 canvas 没有问题。我的问题特别出在 ApplicationWindow 组件上,我想使用它,因为它是 QML 应用程序的标准。

我正在努力坚持使用 PySide2,因为它正在成为 Python Qt 的支持,但我当然也接受 PyQt 解决方案。

如果您阅读 docs

The QQuickView class provides a window for displaying a Qt Quick user interface.

也就是说,QQuickView提供了一个window来显示Items,但是ApplicationWindow已经是一个window所以你不需要也不应该使用QQuickView 了,在 ApplicationWindow 的情况下你必须使用 QQmlApplicationEngine:

main.py

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_())

view.qml

import QtQuick 2.7
import QtQuick.Controls 2.4

ApplicationWindow {
    title: "Qt Quick Controls Gallery"
    width: 640
    height: 480
    visible: true // <---
}

首先作为pyside returns:

QQuickView does not support using windows as a root item. If you wish to create your root window from QML, consider using QQmlApplicationEngine instead.

这是一个工作示例:

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"
    }
}