1. ホーム
  2. c++

[解決済み] QML ListViewからQAbstractListModelのデータを操作する

2022-02-27 11:15:10

質問

QAbstractListModelのサブクラスをモデルとして使用するQML ListViewを持っています。

ListView {
    id: myListView
    x: 208
    y: 19
    width: 110
    height: 160
    delegate: myListDelegate {}
    model: MyListModel
    opacity: 0
}

モデルは MyListItem s.

class MyListModel : public QAbstractListModel
{
    Q_OBJECT
public:
    enum MyRoles {
        HeadingRole = Qt::UserRole + 1,
        DescriptionRole,
        QuantityRole
    };

    explicit MyListModel(QObject *parent = 0);

    void addMyListItem(const MyListItem &item);
    int rowCount(const QModelIndex & parent = QModelIndex()) const;
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
    void dropList();

private:
    QList<MyListItem> m_list;

};

デリゲートには、mouseareaがあります。

どのようにしたら、mouseareaのクリックをインターセプトし、ピックすることができますか? あれ MyListItem QListモデルから、アプリケーションのC++部分のどこかに送信するのですか?

どのように解決するのですか?

を使用することもできます。 index プロパティを使用して、データを操作することができます。ただ、QML のインデックスを QModelIndex をモデル上のindexメソッドで使用します。ここでは、リストアイテムがクリックされるたびに、表示値を文字列 "3" に変更する簡単な例を示します。

ListView {
    id: listView
    anchors.fill: parent
    model: my_model

    delegate: Rectangle {
        height: 50
        width: listView.width

        MouseArea {
            anchors.fill: parent
            onClicked: {
                // Column is always zero as it's a list
                var column_number = 0; 
                // get `QModelIndex`
                var q_model_index = my_model.index(index, column_number);

                // see for list of roles: 
                // http://doc.qt.io/qt-5/qabstractitemmodel.html#roleNames
                var role = 1

                var data_changed = my_model.setData(q_model_index, "3", role);

                console.log("data change successful?", data_changed);
            }
        }
    }
}

に加えて index プロパティをデリゲートで使用すると、デフォルトのロール名をすべて使用することができます。そのため、例えば decoration ロールを設定することで color プロパティを設定します。 Rectangle デリゲートの前に を参照してください。 このリスト をご覧ください。

ListView {
    delegate: Rectangle {
        // list items have access to all default `roleNames` 
        // in addition to the `index` property.
        // For example, using the decoration role, demo'd below
        color: decoration
    }
}

もご覧ください。 このリンク Mitch Curtis は、ユーザー列挙型を登録するために qmlRegisterUncreatableType を使用することを推奨しています。