Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QQuickView未出现在.ui GUI中_Python_Qt_Qml_Pyside2_Qquickview - Fatal编程技术网

Python QQuickView未出现在.ui GUI中

Python QQuickView未出现在.ui GUI中,python,qt,qml,pyside2,qquickview,Python,Qt,Qml,Pyside2,Qquickview,目前正在开发一个Python程序,该程序使用.ui文件中的Qt小部件来显示可交互的GUI。但是,我还没有找到一种集成QQuickview小部件以显示任何QML代码的方法,我已经读过,这是可能的 我正在使用PySide2从Qt Designer转换.ui文件,并且尝试使用Qt Designer中的QQuickWidget,并手动将QQuickView添加到.ui中的gridLayout中,但没有成功 据我所知,我在QtDesigner中添加的QQuickWidget在python中运行时已转换为Q

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

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

据我所知,我在QtDesigner中添加的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窗口,如下所示。
我自己解决了这个问题,就像一个人在寻求帮助后通常会做的那样

结果发现我以前没有将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:

说明: QQuickView是一个局部变量,当“connect\u map\u click”在容器中没有执行任何操作时,它将被删除

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

  • 将与窗口关联的QWindow作为父窗口传递:
  • 自身

    def connect\u map\u单击(自身):
    #处理“连接地图”按钮的功能
    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(容器,0,0)
    

    注:

    • 正如您所指出的,另一种解决方案是使用QQuickWidget,因为它的生命周期取决于您的父母,因为他们是自我的,所以他们将和类一样长寿。但是QQuickWidget有一些限制,包括您将无法记录可能是您的需求之一的项目

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

    def connect_map_click(self):
        engine = QQuickView(self.window.grd_map.parentWidget().window().windowHandle())
        # ...