0

QTreeWidget のリアルタイム検索を構築しようとしています。つまり、QLineEdit があり、入力すると、表示された結果が QTreeWidget でフィルター処理されます。

現時点では、 QTreeWidget.findItems() で「まだ表示されているアイテム」を取得しています

foundItems  = mainForm.ui.treeShips.findItems(text,QtCore.Qt.MatchContains)

後で QTreeWidget (mainForm.ui.treeShips) をクリアします

mainForm.ui.treeShips.clear()

次に、「まだ表示されているアイテム」を追加したい

mainForm.ui.treeShips.addTopLevelItems(foundItems)

しかし、「基になるC/C++オブジェクトが削除されました」というエラーでプログラムがクラッシュします

私の最初のアイデアは、treeShip をクリアすると、foundItems のコンテンツもクリアされ、foundItems のオブジェクト ( print(foundItems) ) と treeShips のオブジェクトが同じアドレスを持ち、プログラムがこのリストを操作したいときに、クラッシュ。

誰かがそれを修正する方法を知っていますか、またはそのような「検索フィルター」を適用するためのより良いアイデアを持っていますか?

(私の問題を正しく説明できれば幸いです:))

よろしくお願いします

4

2 に答える 2

1

Neox の 2 番目のアイデアに基づく回避策を見つけました。

ツリー内のすべてのアイテムを反復処理し、隠しフラグを true ( setHidden(True) ) に設定してから、foundItems を反復処理し、隠しフラグを false に設定します (両方のリストに同じアドレスがあるため、機能すると思います)。

for item in mainForm.ui.treeShips.findItems("",QtCore.Qt.MatchContains):
    item.setHidden(True)

for item in foundItems:
    item.setHidden(False)

しかし、それが汚い方法ではないかどうかはわかりませんが、機能します:)

これが同じ問題を抱えている他の人に役立つことを願っています.

于 2012-02-12T05:01:23.227 に答える
0

clearアイテムの関数を呼び出すたびにQTreeWidgetItem、アイテムが削除されるため、発生するエラーは驚くことではありません。QTreeWidgetこれは、次の実装の抜粋で確認できます。

void QTreeWidget::clear()
{
    Q_D(QTreeWidget);
    selectionModel()->clear();
    //the treeModel here is QTreeModel, refer to snippet below
    d->treeModel()->clear();
}


void QTreeModel::clear()
{
    SkipSorting skipSorting(this);
    for (int i = 0; i < rootItem->childCount(); ++i) {
        QTreeWidgetItem *item = rootItem->children.at(i);
        item->par = 0;
        item->view = 0;
        delete item;
    }
....
}

検索の実装に関する実際の質問に。最初に、実際の検索機能 (リアルタイムではない) を実装するための優れたスニペットを示します(C++ で申し訳ありませんが、問題ないことを願っています)。

リアルタイム検索を実行するには、検索が実行されるスロットにvoid textChanged(const QString & text)信号を接続する必要があります。QLineEdit

それがあなたの質問に答えることを願っています

于 2012-02-10T15:34:41.977 に答える