0

目前正在开发一个 Python 程序,该程序使用 .ui 文件中的 Qt Widgets 来显示可交互的 GUI。但是,我还没有找到一种方法来集成 QQuickview 小部件以显示任何我读过的 QML 代码。

我正在使用 PySide2 从 Qt Designer 转换 .ui 文件,并且都尝试使用在 Qt Designer 中找到的 QQuickWidget,并手动将 QQuickView 添加到 .ui 中的 gridLayout 没有成功。

我在 Qt Designer 中添加的 QQuickWidget 是,据我所知,在 python 中运行时转换为 QWidget,因此 setSource(QUrl) 或 .load(QUrl) 在运行代码时没有任何意义。

我尝试添加 QQuickView:

    def connect_map_click(self):
        # Function for handling the connect map button
        engine = QQuickView()
        ctx = engine.rootContext()
        url = QUrl.fromLocalFile('QMLtest.qml')
        engine.setSource(url)
        container = QWidget.createWindowContainer(engine, self)
        container.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        engine.show()
        self.window.grd_map.addWidget(container, 0, 0)

QML 文件:

import QtQuick 2.7
Rectangle {
    id: rectangle
    color: "red"
    width: 200
    height: 200
    visible: true
    Text {
        id:text
        text: "It's working!"
    }
}

我正在尝试在屏幕右侧运行 qml 窗口,如下所示。 我试图添加 QQuickView 的 GUI

4

2 回答 2

0

解释:

QQuickView 是一个局部变量,当“connect_map_click”在容器中不执行任何操作时将被删除。

解决方案:

解决方案是延长生命周期,为此有以下替代方案:

  1. 将与窗口关联的 QWindow 作为父级传递:
def connect_map_click(self):
    engine = QQuickView(self.window.grd_map.parentWidget().window().windowHandle())
    # ...
  1. 使 QQuickView 成为另一个具有更长生命周期的对象的属性,例如容器:
# ...
container = QWidget.createWindowContainer(engine, self)
container.engine = engine
# ...

self

def connect_map_click(self):
    # Function for handling the connect map button
    self.engine = QQuickView()
    ctx = self.engine.rootContext()
    url = QUrl.fromLocalFile('QMLtest.qml')
    self.engine.setSource(url)
    container = QWidget.createWindowContainer(self.engine, self)
    container.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
    engine.show()
    self.window.grd_map.addWidget(container, 0, 0)

笔记:

  • 正如您所指出的,另一个解决方案是使用 QQuickWidget,因为它的生命周期取决于您的父母,他是自我,因此他将与班级一样长寿。但是 QQuickWidget 有文档指出的限制,包括您将无法记录可能是您的要求之一的项目。

  • 这种行为发生在 PySide2 中,但在 PyQt5 中,您的初始代码有效,因为容器作为父级传递给窗口的 QWindow。

于 2020-01-03T11:20:06.050 回答
0

自己解决了这个问题,因为在寻求帮助后往往会立即这样做。

最后发现我之前没有将 QQuickWidget 导入到 Python 文件中。所以我的解决方案最终是在 python 中创建一个 QQuickWidget,将源设置为 qml 文件并将其添加到 .ui GUI 中的网格中。

    def connect_map_click(self):
        # Function for handling the connect map button

        qml_widget = QtQuickWidgets.QQuickWidget()
        qml_widget.setSource(QUrl('QMLtest.qml'))
        self.window.grd_map.addWidget(qml_widget)

生成的图形用户界面: 从 .ui 文件在 GUI 中工作 QML

于 2020-01-03T10:03:34.687 回答