3

ツリー レベルを含む XML ファイルを解析することによって生成される QTreeWidget を持つアプリケーションを作成しています。トップレベルのチェックボックスを選択した場合、サブレベルのチェックボックスもすべてチェックする必要があります。

私はすでに XML パーサーを動作させ、QTreeWidget にチェックボックスを持つ QTreeWidgetItems を設定していますが、個別にチェックすることしかできません。

4

3 に答える 3

6

これを行うには、XMLを使用してツリーを生成するために必要なコードを保持します。次に、itemChanged()シグナルに接続し、スロットのチェック状態を更新します。次のようになります。

connect(treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*, int)),
        this,       SLOT(updateChecks(QTreeWidgetItem*, int)));

void ClassName::updateChecks(QTreewidgetItem* item, int column)
{
    // Checkstate is stored on column 0
    if(column != 0)
        return;

    recursiveChecks(item);
}

void ClassName::recursiveChecks(QTreeWidgetItem* parent)
{
    Qt::CheckState checkState = parent->checkState(0);
    for(int i = 0; i < parent->childCount(); ++i)
    { 
       parent->child(i)->setCheckState(0, checkState);
       recursiveChecks(parent->child(i));
    }   
}

考慮すべきいくつかの注意事項:

  1. itemChangedシグナルの代わりにitemClickedシグナルを使用したくなるかもしれません。これは通常は機能しますが、ユーザーが矢印キーとスペースバーを使用してチェック状態を変更する場合は機能しません。
  2. 親をクリックしてチェックされたサブアイテムの1つをオフにすると、どうなるかを考える必要があります。通常、これは、すべての祖先をオフにするか、部分的にチェックする必要があることを意味します。これはあなたの場合には当てはまらないかもしれません。
  3. itemUpdatedは、アイテムに対する他の変更(テキストの変更など)に対しても起動されるため、これは非常に効率的な方法ではないことに注意してください。
于 2012-02-09T00:00:11.413 に答える
3

私はこれに少し取り組み、リックの答えに基づいて素晴らしい結果を得ました。多分それはそこに他の人を助けることができます. 親と子の状態を、親のみのトライステート ステータス (チェック済み、未チェック、部分的にチェック済み) で更新します。

void ClassName::updateChecks(QTreeWidgetItem *item, int column)
{
    bool diff = false;
    if(column != 0 && column!=-1)
        return;
    if(item->childCount()!=0 && item->checkState(0)!=Qt::PartiallyChecked && column!=-1){
        Qt::CheckState checkState = item->checkState(0);
        for (int i = 0; i < item->childCount(); ++i) {
           item->child(i)->setCheckState(0, checkState);
        }
    } else if (item->childCount()==0 || column==-1) {
        if(item->parent()==0)
            return;
        for (int j = 0; j < item->parent()->childCount(); ++j) {
            if(j != item->parent()->indexOfChild(item) && item->checkState(0)!=item->parent()->child(j)->checkState(0)){
                diff = true;
            }
        }
        if(diff)
            item->parent()->setCheckState(0,Qt::PartiallyChecked);
        else
            item->parent()->setCheckState(0,item->checkState(0));
        if(item->parent()!=0)
            updateChecks(item->parent(),-1);
    }
}

recursiveChecks() はもう必要ありません。treeWidget と updateChecks の間を接続します。

于 2013-08-21T09:23:55.347 に答える