Python QQuickView未出现在.ui GUI中
目前正在开发一个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的尝试: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
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”在容器中没有执行任何操作时,它将被删除
解决方案:
解决方案是延长生命周期,为此有以下替代方案:
自身
:
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())
# ...