Как преобразовать список Python в QVariantList в PySide2

Итак, PySide2 удалил типы QVariant*.

Однако QtQuick раскрывает большую часть QVariant API.

В частности, я хочу использовать очень удобную функцию для передачи QVariantList в качестве модели ListView без необходимости реализации полноценного QAIM.

Однако, передавая такой объект в QML через setContextProperty

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)

Итак, как передать список python в qml в форме, которая действительно понимается qml?


person Pa_    schedule 13.06.2019    source источник


Ответы (1)


Вы должны передать как тип свойства "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]

Примечание: В случае с PyQt5 родной список python преобразуется непосредственно в список QML, в отличие от PySide2 необходимо указывать типы Qt, а если они не существуют напрямую как типы, то необходимо указать его как строку.

person eyllanesc    schedule 13.06.2019