1

私は自分の問題を説明するのに苦労しているので、できるだけ簡単にして、うまくいくことを願っています。QtQuick 2.0 で Qt5 を使用しています。

QAbstractListModel から継承し、MyListItem タイプのアイテムを保持する MyListModel クラスを作成しました。QML ListView で として使用するmodel: myListModelと、デリゲートはquantityMyListItem のプロパティを素敵な TextInput ボックスに表示します。すべて正常に動作します。

ただし、quantityデリゲートから値を変更しても、モデル内のアイテムは更新されません。MyListItem のメンバーである関数が実行されないため、それらが更新されていないことはわかっていますsetQuantity(long desired_quantity)簡単に言うと、デリゲート内から setQuantity 関数を実際に呼び出す方法がわかりません。Q_PROPERTY(long quantity READ quantity WRITE setQuantity)MyListItem に追加し、それを使用してオブジェクトを QMLsetContextProperty()に公開し、. しかし明らかに、デリゲートが数量プロパティに書き込むことができない場合 (読み取ることしかできない場合)、それは仕事をしていません。MyListItem myTempmyTemp.quantity = 10

誰かが私を正しい方向に向けることができますか? Qt の設計者が期待していた可能性のあるすべてのことを試したような気がしますが、何も得られませんでした。また、私の問題を明確に説明しているドキュメントが見つかりません。

4

1 に答える 1

3

TextInput ボックスは C++ モデルを自動的に更新しません。これは自分で行う必要があります。これを行うには、モデルにスロットまたは Q_INVOKABLE メソッドを追加します。

//add a slot to you model
public slots:
 setDataInModel(const int index, const QVariant &value);
//or add Q_INVOKABLE method:
public:
 Q_INVOKABLE setData(const int index, const QVariant &value);

これらのメソッドのいずれかを実装して、モデル内の適切なデータ行を変更する必要があります。更新後にメソッド内でdataChangedメソッドを呼び出すことを忘れないでください。次に、TextInput が更新されたときに、QML デリゲートからこれらのメソッドを手動で呼び出す必要があります。

onAccepted: {
  model.setDataInModel(index, text)
}

ここで、 indexは各デリゲートで定義されるプロパティであり、text は TextInput からのテキストです。

于 2013-01-08T08:57:25.983 に答える