親行の値 (QStyledItemDelegate 派生クラスを介して QComboBox で選択) の値に応じて行のみを受け入れる、filterAcceptsRow() でカスタム フィルタリングを使用して QSortFilteredProxyModel を表示する QTreeView をセットアップしました。たとえば、行で「Type " 値 "BMW", この特別なケースの子を表示したい. これは最初のアイテムに最適です. Item1 の複数レベル下 (最大 5 レベル) 内でこれらの値を選択できます. すべてがうまく機能します.
ただし、item1 とこのカスタム フィルタリングを試してから item2 を追加すると、問題が発生することに気付きました。最初に気付いたのは、QTreeView が item1/item2 の共通の親を展開解除し、ルート アイテムの子のみを表示することです。通常の動作 (および item1 を追加するときの動作) は、item1 の親を展開することです。これが 2 番目の項目で混乱する理由は、item1 の子設定で遊んでいる場合のみです。また、item2 でフィルタリングが正しく機能しないことに気付きました。item2->Type に QComboBox があり、item2->Type の値に応じて子を持ちます。QComboBox のデフォルト値の最初の子は、本来のように表示されますが、QComboBox を変更すると、ビューは更新されなくなり、 item2/item3/... 内のこの最初にロードされた子にとどまります ただし、Delegate::setModelData は正しい値/インデックスで呼び出され、それに応じて TreeItem->setData() を呼び出します。フィルタリングが TreeItem->data() の古い値に固執しているように見えるだけです。繰り返しますが、これは item1 で遊んだ後にのみ発生することに注意してください。そのアイテムをそのままにしておくと、他のすべてのアイテム (item2、item3、...) で正しくプレイでき、問題なく動作します。
誰かが助けてくれたらとてもうれしいです。
expand() が item1 と item2 の挿入で同じように呼び出され、 item1 でうまく機能するにもかかわらず、expandedStates の「リセット」を引き起こす可能性があるのは誰ですか? 何がさらに問題を引き起こす可能性がありますか?
ExampleDelegate.h
クラス ExampleDelegate : public QStyledItemDelegate { Q_OBJECT 公衆: ExampleDelegate(QObject* 親 = 0); ~ExampleDelegate(void); QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void setEditorData(QWidget* editor, const QModelIndex &index) const; }
ProxyModel.h
クラス ProxyModel : public QSortFilterProxyModel { Q_OBJECT 公衆: ProxyModel(QObject *親); 〜プロキシモデル(ボイド); ボイドリフレッシュ(); void doReset(); pthread_mutex_t* proxyMutex; int rowCount(QModelIndex& 親) const; bool hasChildren ( const QModelIndex & 親 = QModelIndex() ) const; QModelIndex 親 (const QModelIndex &index) const; QModelIndex index(int 行、int 列、QModelIndex& 親) const; bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; };
ProxyModel.cpp
bool ProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { printf("ProxyModel::filterAcceptRow \n"); pthread_mutex_lock(this->proxyMutex); QAbstractItemModel* source = this->sourceModel(); QModelIndex index = source->index(sourceRow, 0, sourceParent); TreeItem* item = ((TreeItem*) index.internalPointer()); if(項目!= NULL) { int showOnly = item->showOnlyParentDetailDialog; if(showOnly != -1) { TreeItem* 親 = ((TreeItem*) index.internalPointer())->parent(); if(親 != NULL) { int parentOption = 親->selectedIndex; //printf("parentOption: %u \n", parentOption); bool result = (showOnly == 親->selectOptions->at(parentOption).detailDialog); pthread_mutex_unlock(this->proxyMutex); 結果を返します。 } そうしないと { pthread_mutex_unlock(this->proxyMutex); true を返します。 } } } pthread_mutex_unlock(this->proxyMutex); true を返します。 }