无法在 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"
}
}
我正在尝试 运行 使用 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"
}
}