如何将元组列表从 python 发送和解包到 qml?
Posted
技术标签:
【中文标题】如何将元组列表从 python 发送和解包到 qml?【英文标题】:How can I send and unpack the list of tuples from python to qml? 【发布时间】:2018-07-14 08:13:09 【问题描述】:我需要在 python 端生成一个元组列表,并将其发送到 qml 并打印出来,但是当我尝试在 qml 端打印出这个列表时,它会打印:
qml: [QVariant(PyQt_PyObject),QVariant(PyQt_PyObject),QVariant(PyQt_PyObject),QVariant(PyQt_PyObject),QVariant(PyQt_PyObject),QVariant(PyQt_PyObject),QVariant(PyQt_PyObject),QVariant(PyQt_PyObject),QVariant(PyQt_PyObject),QVariant(PyQt_PyObject)]
如何解压这些值?
更新
小例子:
main.py
>from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot
class Plot(QObject):
def __init__(self):
QObject.__init__(self)
updCanv = pyqtSignal(list, arguments=['upd'])
@pyqtSlot()
def upd(self):
points = [(1, 2), (3, 4)]
self.updCanv.emit(points)
if __name__ == "__main__":
import sys
sys.argv += ['--style', 'material']
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
plot = Plot()
engine.rootContext().setContextProperty("plot", plot)
engine.load("main.qml")
engine.quit.connect(app.quit)
sys.exit(app.exec_())
main.qml
import QtQuick 2.0
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.2
ApplicationWindow
visible: true
Button
text: qsTr("Get points")
onClicked: plot.upd()
Connections
target: plot
onUpdCanv: print(upd)
【问题讨论】:
提供一个minimal reproducible example,你的PyQt5版本是多少? @eyllanesc 完成。 【参考方案1】:并非所有类型都映射到 QML 中,例如 python 的类型列表映射为 QML 的列表类型,但在元组的情况下不是,所以解决方案是使用一些等效类型或者创建一些新类型,在这种情况下,您可以轻松使用 QPointF()
,因为元组有 2 个元素。
class Plot(QObject):
updCanv = pyqtSignal(list, arguments=['upd'])
@pyqtSlot()
def upd(self):
points = [(1, 2), (3, 4)]
p = [QPointF(*v) for v in points]
self.updCanv.emit(p)
输出:
qml: [QPointF(1, 2),QPointF(3, 4)]
【讨论】:
以上是关于如何将元组列表从 python 发送和解包到 qml?的主要内容,如果未能解决你的问题,请参考以下文章