QQuickView未出现在.ui GUI中

2024-04-25 19:49:35 发布

您现在位置:Python中文网/ 问答频道 /正文

目前正在开发一个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


Tags: 文件代码self程序uimap部件container
2条回答

我自己解决了这个问题,就像一个人在寻求帮助后往往会做的那样

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

    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

说明:

QQuickView是一个局部变量,当“connect\u map\u 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有一些限制,包括您将无法记录可能是您的需求之一的项

  • 这种行为在PySide2中发生,但在PyQt5中,由于容器作为父对象传递给窗口的QWindow,因此初始代码可以工作

相关问题 更多 >