QQuickView未出现在.ui GUI中

问题描述 投票:0回答:2

当前正在使用一个Python程序,该程序使用来自.ui文件的Qt窗口小部件以显示可交互的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窗口,如下所示。GUI where i'm attempting to add the QQuickView

python qt qml pyside2 qquickview
2个回答
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)

结果GUI:Working QML in GUI from .ui file


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,因为它的生命周期取决于您的父母自己,因此他的寿命将与班级一样长。但是the docs指出,QQuickWidget具有局限性,包括您将无法记录可能是您的要求之一的项目。

© www.soinside.com 2019 - 2024. All rights reserved.