Pyside2 - qml возвращает пустое окно - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь использовать QML с pyside2, но у меня возникают некоторые проблемы. Я создаю простой пример, чтобы показать мою проблему. Я сделал новый проект qml в Qt Design Studio и пытаюсь загрузить файл qml в pyside2, но когда я запускаю скрипт, он возвращает пустое окно.

Я пытался переместить qml на тот же уровень, что имой main.py, но получаю те же результаты. моя древовидная структура выглядит следующим образом.

это содержимое моего main.py

from PySide2.QtWidgets import QApplication
from PySide2.QtQuick import QQuickView
from PySide2.QtCore import QUrl
from PySide2.QtGui import QGuiApplication
import sys

path = 'qmlTest01/qmlTest01.qml'
app = QGuiApplication(sys.argv)
view = QQuickView()
url = QUrl.fromLocalFile(path)

view.setSource(url)
view.show()
app.exec_()

Я получаю пустое окно, подобное этому:

вместо этого:

Заранее спасибо.

Я сделал репо с этимпример: https://bitbucket.org/aespid/tests/src

1 Ответ

1 голос
/ 04 октября 2019

Объяснение:

Структура вашего проекта выглядит следующим образом:

├── main.py
└── qmlTest01
    ├── imports
    │   ├── qmlTest01
    │   │   └── ...
    │   └── QtQuick
    │       └── ...
    ├── qmlTest01.qml
    ├── qmlTest01.qmlproject
    ├── qtquickcontrols2.conf
    └── Screen01.ui.qml

И в ваших импортах вы используете:

import qmlTest01 1.0
// ...

, но нигде вы не указываете, где этобиблиотека, но в случае второго образа вы должны запустить .qmlproject из QtCreator, который читает следующую конфигурацию:

/* File generated by Qt Creator */

import QmlProject 1.1

Project {
    mainFile: "qmlTest01.qml"

    /* ... */

    Files {
        filter: "qmldir"
        directory: "."
    }

    Environment {
        QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf"
        QT_AUTO_SCREEN_SCALE_FACTOR: "1"
    }

    /* List of plugin directories passed to QML runtime */
    <b>importPaths: [ "imports" ]</b>

    /* Required for deployment */
    targetDirectory: "/opt/qmlTest01"
}

Где это наблюдается, что указывает маршрут импорта других модулей.

Решение:

Решение состоит в том, чтобы установить некоторые переменные среды с помощью os.environ () и пути к папке «import», используя addImportPath () из QQmlEngine:

import os
import sys

from PySide2.QtCore import QUrl
from PySide2.QtGui import QGuiApplication
from PySide2.QtQuick import QQuickView


if __name__ == "__main__":

    current_dir = os.path.dirname(os.path.realpath(__file__))

    <b>os.environ["QT_QUICK_CONTROLS_CONF"] = os.path.join(
        current_dir, "qmlTest01", "qtquickcontrols2.conf"
    )
    os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"</b>

    app = QGuiApplication(sys.argv)
    view = QQuickView()
    import_path = os.path.join(current_dir, "qmlTest01", "imports")
    <b>view.engine().addImportPath(import_path)</b>

    filename = os.path.join(current_dir, "qmlTest01", "qmlTest01.qml")
    url = QUrl.fromLocalFile(filename)

    view.setSource(url)
    view.show()
    app.exec_()
...