2012-02-08 18 views
2

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

すでにXMLパーサーが動作しており、QTreeWidgetにチェックボックスを持つQTreeWidgetItemsを設定していますが、それらは個別にしかチェックできません。

+0

これは、狂犬病の2つの異なることです:チェックボックスをチェックして(段落1)、項目を選択する(段落2)。それはどういう意味ですか? – TonyK

答えて

5

これを行うには、ツリーを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はアイテムの他の変更(テキストの変更など)のためにも起動されるため、これを行うには効率的な方法ではないことに注意してください。
+0

リック、ありがとう!私はC++とQtの新機能ですから、これは大きな助けとなりました。 Qt Creator/Designerフォームに 'QTreeWidget'が含まれていれば' ClassName'はどうなるでしょうか?それは 'QMainWindow'を含むクラスのクラス名に過ぎませんか? – rabidhamper7

+0

また、 'recursiveChecks()'メソッドの 'item'変数はどこから来ましたか? – rabidhamper7

+0

Nevermind、私はそれを 'QMainWindow'拡張クラスに追加し、2番目のメソッドで' item'を 'parent'に変更しました。チャームのように働いた!!再度、感謝します! – rabidhamper7

2

私はちょっとこれに取り組み、リックの答えに基づいて良い結果を得ました。多分それは他の人を助けることができます。 親の子供の状態を更新します(チェックされている、チェックされていない、部分的にチェックされている)。

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の間をまだアクティブにしてください。

関連する問題