2016-07-13 16 views
0

QTreeViewにはいくつかの項目があり、QLineEditはtextEditedシグナルの接続されたスロットで検索します。このコードで :QSortFilterProxyModel QStandardItemsを正しく処理する方法

QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this); 
proxyModel->setSourceModel(messagesModel); 
proxyModel->setFilterFixedString(text); 
ui.treeView->setModel(proxyModel); 

テキストフィルタリングはOKですが、私は(QTreeViewに割り当てられたプロキシモデルの後)QTreeView QStandardItemsチェックボックスをクリックしたとき、私はこのQTreeViewオリジナルモデルに接続されている、スロット内のプログラムがクラッシュを持っています(プロキシが割り当てられる前に)。 アイテムチェックボックスのクリックを処理する正しい方法は何ですか?私は、モデルの変更を処理するために新しい接続/スロットを使用する必要がありますか、またはいくつかの変更を加えて元のモデルに同じコードを使用できますか? QTreeViewでフィルタリングされた項目を非表示にするだけです。 QTreeWidgetはhide()メソッドですが、QTreeViewにはこのようなものがありますか、QSortFilterProxyModelは必要ですか?どうも!

UPDは、ツリービューに接続され、スロットに墜落:

auto item = messagesModel->itemFromIndex(index); // item is NULL because proxyModel is set for TreeView now 
if(item->whatsThis().isEmpty()) return; // error below 

#ifndef QT_NO_WHATSTHIS 
    inline QString whatsThis() const { 
     return qvariant_cast<QString>(data(Qt::WhatsThisRole)); 
    } 
    inline void setWhatsThis(const QString &whatsThis); 
#endif 

私がツリービューにproxyModelを設定しますが、whatsThisを持っているmessagesModelので...

+0

あなたがクラッシュされているコードを表示よりもクラッシュを持っています。クラッシュしたコールスタックがコードを指していない場合は、このコールスタックを質問に貼り付けます。 –

+0

'treeWidget' - それは本当にQTreeViewですか、それともQTreeWidgetですか? –

+0

はい。申し訳ありません - treeWidgetはQTreeViewでなければなりません。クラッシュが付加されたコード –

答えて

0

を、私はそれで自分のコードを変更:

QStandardItem* item; 
if(ui.leFilter->text().isEmpty()) 
    item = messagesModel->itemFromIndex(index); 
else 
    item = messagesModel->itemFromIndex(proxyModel->mapToSource(index)); 
if(item->whatsThis().isEmpty()) return; 

と動作します。それは正しい方法ですか?プロキシモデルは、私のUIクラスのメンバーです...ローカルではありません。

UPD proxyModelでチェックボックスをオンにした場合のソースモデルの更新方法を教えてください。

UPD 2 QtreeViewに「元の」モデルをロードして表示します。 QListEditでテキストを編集すると、私はproxyModel(最初の投稿のコード)を使用します。テキストを編集すると、QtreeViewのチェックボックスがチェックされています(今はproxyModelがアクティブです)。このステップではすべてOKです。しかし、私はUIのいくつかの変更を行うとき、QTreeViewで元のモデルを設定し、それはproxyModelのために作られた変更はありません。どのようにして、ソースモデルのアイテムにproxyModelからの新しいデータを通知し、更新することができますか?

UPD3はい、ソースモデルも変更され...私はちょうど明確に持っていること)

+0

より多くのコードを提供したり、より正確に記述したりできますか?私が理解しているように、あなたはいくつかの文字列のためのモデルであなたのデータをフィルタリングしたい、その理由は、フィルタリング文字列を入力し、プロキシモデルを設定するためにQLineEditを使用する理由です。あなたのQStandardItemsはチェック可能です。しかし、私は理解していない "どのように私はソースモデルを更新することができますチェックボックスチェックproxyModel"です。なんでしょう? QTreeViewのチェックボックスをチェックすると、QStandartItemのチェック状態が変更されます。ソースモデルです。ソースモデルが更新されます。 –

+0

2番目の投稿が更新されました。確認してください。 –

関連する問題