2017-10-21 5 views
1

モデルデータが更新された後で、ビューを更新するための自分のコードで問題が発生しました。ビュー固有のSimpleTreeModelの例を更新していないQT MVCパターン

次に、QTからSimpleTreeサンプルを取り出し、TreeModelでタイマーを追加して10秒後にデータを変更し、コンストラクターでモデルを更新するために同じセットデータ関数を呼び出します。タイマーのタイムアウトで実行されるスロットのコードは以下のとおりです。私が試しても、ビューは更新されません。 setDateとemit dataChangedはいくつかの試みでした。

私自身のコードでは、XML-RPC呼び出しでデータを更新していますが、simpleTreeModelを動作させることさえできないと考えれば、それは長いことです。

ここに欠けていることがありますか?

void TreeModel::slotTimeout(void) 
{ 
    QStringList tmp; 
    tmp << "qaz"; 
    tmp << "wsx"; 
    tmp << "edc"; 
    setupModelData(tmp,rootItem); 
    setData(QModelIndex(),QModelIndex()); 
    emit dataChanged(QModelIndex(), QModelIndex()); 
    qDebug() << "Timer update"; 
} 
+0

次のリンクは、あなたが言う例を示していますが、この場合は編集可能にしています。 http://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html – eyllanesc

+0

私はモデルがQAbstractItemモデルに基づいていると仮定しますか?最初の手でQStandardItemModelを使ってみてください。 QAbstractItemModelに関して、必要なすべての関数を実際に実装し、実際に必要な通知関数をすべて呼び出す必要があります。 – Tob

+0

コメントありがとうございます。 @eyllanesc:編集可能な例のタイマーと同じテストを行いましたが、それも更新されません。 – Mikkie

答えて

1

SimpleTreeModelの例は静的モデルのみです。モデルを更新するために必要なQAbstractItemModel関数の実装が欠けています。

実装する必要があるのは、モデルのドキュメントのdetailed descriptionを参照してください。

問題は、必要なメソッドがデフォルトで空のメソッドとして実装されているため、何かが見つからない場合にエラーメッセージが表示されないということです。それはうまくいかないでしょう。

さらに、必要なデータを変更するとやりにくくなってしまいます。

setDataメソッド内には、emit dataChanged()が必要です。あなたが放出される必要な信号を得るために方法beginInsertRows(...)endInsertRows()を呼び出す必要がありも必要insertRows以内

MVパラダイムへの第1のアプローチは、QStandardItemModelを使用することです。 QStandardItemで十分であれば、必要な実装がすべて提供されます。

+0

より完全に答える時間をとってくれてありがとう。それは有り難いです。私は私の検索の中で、これらの出典とbeginInsertRowsなどへの参照を見てきました。私はQStandardItemModelを読んで、それが仕事をするかどうかを見ます。私はそれができると思う。 – Mikkie

関連する問題