親行の値 (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 を返します。
}