1

QML にリストがあり、それを listView オブジェクトに表示しています。ボタンが押されたときに、Python からこのデータにアクセスする必要があります。Python で QStringListModel オブジェクトを作成し、setContextProperty を使用して QML の listModel にバインドします。リストが作成され、QML で期待どおりに表示されていることを確認できますが、Python からデータにアクセスしたい場合、リストは空です。コードは次のとおりです。

QML:

import QtQuick 2.0
import QtQuick.Controls 2.3

Rectangle{
    id: root
    width:800
    height:600

    ListView {
        id: listView
        x: 476
        y: 64
        width: 110
        height: 160
        model: myModel
        ListModel {
            id: myModel
            ListElement {
                name: "Grey"
                colorCode: "grey"
            }

            ListElement {
                name: "Red"
                colorCode: "red"
            }

            ListElement {
                name: "Blue"
                colorCode: "blue"
            }

            ListElement {
                name: "Green"
                colorCode: "green"
            }
        }
        delegate: Item {
            x: 5
            width: 80
            height: 40
            Row {
                id: row1
                Rectangle {
                    width: 40
                    height: 40
                    color: colorCode
                }

                Text {
                    text: name
                    anchors.verticalCenter: parent.verticalCenter
                    font.bold: true
                }
                spacing: 10
            }
        }
    }
}

パイソン:

import sys
from PyQt5.QtCore import QUrl, QStringListModel
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQuick import QQuickView


app = QApplication(sys.argv)
view = QQuickView()
view.setSource(QUrl("main.qml"))

pyList = QStringListModel()
view.rootContext().setContextProperty("myModel",pyList)
print(pyList.stringList())
print(pyList.rowCount())
view.show()
print("Done!")
sys.exit(app.exec_())

Pythonバインディングを使用すると、Pythonで作成されたオブジェクトがQMLオブジェクトにバインドされるという印象を受けました。したがって、QML リストに (UI で動的に作成された) データがある場合、Python リストにはそのデータが自動的に入力されますか? 私は何が欠けていますか?

4

1 に答える 1