如何在PySide2中将Python列表转换为QVariantList

5

因此,PySide2已经移除了QVariant*类型。

但是,QtQuick暴露了大量的QVariant API。

更具体地说,我想使用非常方便的功能,将QVariantList作为ListView的模型传递,而无需实现完整的QAIM。

然而,通过setContextProperty将这样的对象提供给QML。

class Test(QObject):
   def __init__(self):

       super(Test, self).__init__()
       self.propertyList = ["FOO", "BAR", 1]

   def model(self):
       return self.propertyList

   modelChanged = Signal()
   model = Property(list, model, notify=modelChanged)

然后打印.model会产生以下结果:

qml: QVariant(PySide::PyObjectWrapper)

那么如何以一种QML实际理解的形式将Python列表传递到QML呢?
1个回答

4

您需要将属性类型传递为"QVariantList"

from PySide2 import QtCore, QtGui, QtQml


class Test(QtCore.QObject):
    modelChanged = QtCore.Signal()

    def __init__(self, parent=None):
        super(Test, self).__init__(parent)
        self.propertyList = ["FOO", "BAR", 1]

    def model(self):
        return self.propertyList

    model = QtCore.Property("QVariantList", fget=model, notify=modelChanged)


if __name__ == "__main__":
    import sys

    app = QtGui.QGuiApplication(sys.argv)

    pyobject = Test()

    engine = QtQml.QQmlApplicationEngine()
    ctx = engine.rootContext()
    ctx.setContextProperty("pyobject", pyobject)
    engine.load(QtCore.QUrl.fromLocalFile("main.qml"))
    engine.quit.connect(app.quit)

    sys.exit(app.exec_())

import QtQuick 2.12
import QtQuick.Window 2.12

Window{
    visible: true
    width: 640
    height: 480

    Component.onCompleted: console.log(pyobject.model)
}

输出:

qml: [FOO,BAR,1]
< p > 注意: 在 PyQt5 中,Python 的本地列表直接转换为 QML 列表,而不像 PySide2 那样必须指定 Qt 的类型,如果它们不存在于直接类型中,则必须将其指定为字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接