Как преобразовать список Python в QVariantList в PySide2 - PullRequest
1 голос
/ 13 июня 2019

Итак, 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?

1 Ответ

1 голос
/ 14 июня 2019

Вы должны передать как тип свойства "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, а если они не существуют напрямую как типы, вы должны указывать его в виде строки.

...