Pyside2 - qml returns 和空 window

Pyside2 - qml returns an empty window

我正在尝试将 QML 与 pyside2 一起使用,但 运行 遇到了一些问题。 我创建了一个简单的示例来说明我遇到的问题。 我在 Qt Design Studio 中创建了一个新的 qml 项目并试图在 pyside2 中加载 qml 文件但是当我 运行 脚本时,它 returns 一个空的 window.

我尝试将 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_()

我得到一个空的 window 像这样:

而不是这个:

提前谢谢你。

我用这个例子做了一个回购: https://bitbucket.org/aespid/tests/src

解释:

您的项目结构如下:

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

并且在您的导入中使用:

import qmlTest01 1.0
// ...

但是你没有指出那个库在哪里,但在第二张图片的情况下,你必须是 运行 来自 QtCreator 的 .qmlproject,它读取以下配置:

/* 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()设置一些环境变量,用QQmlEngine的addImportPath()设置"imports"文件夹的路径:

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