首页 > 解决方案 > 无法在 PySide2 上使用 ApplicationWindow (QML)

问题描述

我正在尝试使用 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 文件中指定的):

在此处输入图像描述

我可以毫无问题地运行其他组件,例如矩形、按钮和画布。我的问题特别在于 ApplicationWindow 组件,我想使用它,因为它是 QML 应用程序的标准。

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

标签: pythonqmlpyside2

解决方案


如果您阅读文档

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

也就是说,QQuickView提供了一个窗口来显示项目,但ApplicationWindow已经是一个窗口,所以你不需要也不应该再使用QQuickView,如果ApplicationWindow你必须使用QQmlApplicationEngine

主文件

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

视图.qml

import QtQuick 2.7
import QtQuick.Controls 2.4

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

推荐阅读