Невозможно использовать ApplicationWindow (QML) на PySide2

Я пытаюсь запустить простое приложение Qt, используя QML и, в частности, 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.


person Rafael    schedule 10.09.2018    source источник


Ответы (2)


Во-первых, когда pyside возвращает:

QQuickView не поддерживает использование окон в качестве корневого элемента. Если вы хотите создать корневое окно из 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"
    }
}
person Patrick José Pereira    schedule 10.09.2018
comment
Вы говорите: ApplicationWindow определено в QtQuick.Controls 2.4, поскольку это неправда, в Qt Quick Controls I и II есть ApplicationWindow.doc.qt.io/qt-5/qml-qtquick-controls-applicationwindow.html и doc.qt.io/qt-5/qml-qtquick-controls2-applicationwindow. html - person eyllanesc; 10.09.2018
comment
Примечание: ApplicationWindow не определяется в QtQuick.Controls 2.4, только в QtQuick.Controls. Однако код Python прекрасно работает. - person Paul; 05.05.2019

Если вы читали документы:

Класс QQuickView предоставляет окно для отображения пользовательского интерфейса Qt Quick.

То есть QQuickView предоставляет окно для отображения предметов, но ApplicationWindow уже является окном, поэтому вам не нужно и не следует больше использовать 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 // <---
}
person eyllanesc    schedule 10.09.2018