2016-12-17 43 views
0

QMLのListModelとしてQListを操作する方法を理解するために、この例に従っています。C++からQML ListModelに要素を追加する

C++からリストを変更したいと思います。したがって、リストを新しいQObjectに入れてタイマーを使用できるようにしました。タイマーコールバックでは、既存の要素の色を変更し、新しい要素をリストに追加します。

void MyObject::setList(QList<QObject *>* l) 
{ 
    list = l; 
    QTimer* timer = new QTimer; 
    connect(timer, SIGNAL(timeout()), this, SLOT(addElement())); 
    timer->start(2000); 
} 

void MyObject::addElement() 
{ 
    list->append(new DataObject("Item 1", "red")); 
    ((DataObject *) list->at(0))->setColor("blue"); 
} 

色の変更はQMLで表示されますが、QMLsListViewのリストの長さは変更されません。私は何が欠けていますか? QMLにリストのサイズ変更を認識させるために必要なステップは何ですか?

私はどのように私は、リストの長さにこれを翻訳していますか?色と名前のプロパティがQ_PROPERTYのmakroを通じて登録されている

Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) 
Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged) 

を理解しますか

答えて

1

QList<QObject*>は、もっとも単純なデータモデルですが、使用できるデータモデルの種類が最も曖昧です。内部的な変更を通知する手段がないため、ビュー自体を更新することができます。

NOTIFYシグナルを持つプロパティとしてリストを公開すると、更新を強制することができます。しかし、これは非常に非効率的で、毎回毎回すべてのリストビューデリゲートの再作成を強制します。これは、要素の数が増えるにつれて、非常に醜いことがあります。

QAbstractListModelを正しく実装することを検討してください。リストの変更はqml側に反映され、最も効率的かつ適切な方法で可能になります。あるいは、私がhereを概説した汎用モデルを使用してください。これは、関数を使用することに加えて宣言型qmlコードを使用しているため、非常に柔軟です。また、新しいタイプごとにC++のものを再コンパイルせずにqmlの実際のオブジェクトタイプを定義することもできます。

+0

私は、最も簡単な方法が学習を始める最良の方法だと思っていました...ありがとう! –

+0

シンプルは「不必要な複雑さは非常に悪い」と同じですが、「最も単純な」ものも「非常に限られている」傾向があります。 – dtech

+1

@Gegeカスタムリストモデルは、実際にはQListをプロパティとして公開するよりはるかに複雑ではありません。 2つのQObjectベースのクラスを行う必要がないので、実際には簡単です。 カスタムモデルでは、好きなデータ構造にデータを入れることができます。例えば、単純なクラスや構造体、タプルの配列など しかし、学習していると言われているので、リストを公開しているプロパティが変化したときに通知信号を出すことによって、最初の問題を解決します。あなたは他の機会にこのテクニックが必要になります –

関連する問題