1

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

0 に答える 0