python - 无法在 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 解决方案。
解决方案
如果您阅读文档:
该类
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 // <---
}
推荐阅读
- php - 如何在 PHP 的关联数组中使用复杂对象作为键?
- javascript - 在 slickgrid 上混合可点击行和不可点击行
- c++ - 关于静态全局 lambda 变量的错误警告?
- spring - 将 apache tomcat 服务器从 7.0 升级到 8.5.5 时出错,请检查您是否有多个 ContextLoader*
- javascript - 带有音色控制的 JS 音高变换
- java - 如何为标准对话框 PreferenceFragmentCompat 设置可取消(假)
- spring-boot - Spring Cloud Stream 2.0 和 startOffset 最新
- weather - aeris 天气框架中的温度模块
- use-case - 用例 Plantuml - 垂直堆叠组件
- typescript - 如何在打字稿中使用带有矩阵参数的svg.js转换?