データを追加した後、展開矢印をクリックして展開および縮小すると、QTreeWidget が動かなくなったように見えます。これはqtカーネルのバグです。通常の状況ではすぐに応答するはずです。これはqtのバグであるため、TreeWidgetは別の方法でのみ実装できます。このバグを解決するには、どちらの方法が適切かを判断する必要に応じて、いくつかの特定の方法があります。
- 要件で必要なTreeWidgetが完全なTreeWidgetを必要としない場合、展開のレベルは制限されます。つまり、2層、3層、または4層のみです。要件で必要なTreeWidgetノードのレベルは比較的制限されます。QListViewのようなスペースを使用できます。 QTreeWidgetは、展開関係のレベルを制御する限り、カスタムレスポンスのタイプは親タイプまたは子タイプなどです。表示されるアイテムのサイズを制御するには、インデントする必要があります。子ノードの場合はインデントを大きくし、親ノードの場合はインデントを小さくして、QListViewのような効果を使用してQTreeWidgetのような効果を作成できるようにします。
2. QTreeWidgetと同様のコンポーネントを使用する別の方法があり、この操作の拡張と縮小に関するバグを非表示にして、別のメソッドで置き換えることができます。それを非表示にする方法、QTreeWidgetには属性があります
インデント:int
ツリービュー内のアイテムのインデント。
このプロパティは、ツリービューの各レベルのアイテムのピクセルで測定されたインデントを保持します。トップレベルのアイテムの場合、インデントはビューポートエッジから最初の列のアイテムまでの水平距離を指定します。子アイテムの場合は、親アイテムからのインデントを指定します。
デフォルトでは、このプロパティの値はスタイルに依存します。したがって、スタイルが変更されると、このプロパティはそれから更新されます。setIndentation()を呼び出すと更新が停止し、resetIndentation()を呼び出すとデフォルトの動作に戻ります。
この属性は、QTreeWidgetの項目のインデントを処理するために特別に使用されます。項目レベルが多いほど、インデント値が多くなります。この属性の値が0に設定されている場合、インデントされないため、効果を得ることができます伸縮矢印は非表示にすることができます。qtカーネル処理は、識別によって設定されたサイズ領域に矢印を配置します。0に設定されている場合、配置する場所がなく、非表示になり、非表示になります。効果、QTreeWidgetのバグが非表示になるように、これはQTreeWidgetのバグを解決することと同じです。拡大と縮小のボタンが非表示になるため、拡大と縮小の機能を実現する方法、対応するクリック信号をバインドして、スロット機能で十分です。
CONNECT(UI - > treeWidget、&QTreeWidget :: itemClicked、[=](QTreeWidgetItem *アイテム、int型 nidex){
bool bIsChild = item-> data(0、Qt :: UserRole).toBool();
if(!bIsChild)
{
item-> setExpanded(!item-> isExpanded());
}
});
このようなコードは、縮小と非表示の機能を実現できます。関数に到達したので、残りは縮小と非表示のボタンの表示を処理します。項目をカスタマイズすることにより、項目に子ノードがあるかどうかを設定します、塗ってください。
この手順を実行すると、基本的にほとんどのtreeWidgetの効果が得られ、QTreeWidgetのバグはこのメソッドによって解決されます。効果はほぼこのようになり、ほとんどインデントされています。つまり、縮小ボタンと非表示ボタンをクリックします。データの効果を達成するために、インデント値はありません。0に設定されているため、インデントされません。インデント値をカスタマイズすることにより、インデント効果を描画できます。描画方法は、インデントのサイズに相当しますアイテムレベルのサイズに応じて、最初にカスタムアイテムレベルを取得する必要があります。キーコードは次のとおりです。
QTreeWidgetItem * メインウィンドウ :: addChildNode(QTreeWidgetItem *親、int型のインデックス)
{
QTreeWidgetItem * pDeptItem = new QTreeWidgetItem();
// アイテムがグループ化ノードであるか子ノードであるかを区別するためにデータを設定します。0はグループ化ノードを表し、1は子ノードを表します
pDeptItem-> setData(0、Qt :: UserRole、1);
pDeptItem-> setFlags(Qt :: ItemIsUserCheckable | Qt :: ItemIsEnabled | Qt :: ItemIsSelectable);
pDeptItem-> setCheckState(1、Qt :: チェックなし);
intレベル= 0 ;
DepartNodeItem * departNode = dynamic_castを < DepartNodeItem *>(UI - > 木 - > itemWidget(親、0));
if(departNode){
level = departNode-> getLevel();
レベル++;
}
}
void EmployeeNodeItem :: setLevel(int level)
{
この - > m_level =レベル。
この - > m_indentation = この - > m_level * インデント。
この - > m_headLabelWidth = この - > m_indentation + HEAD_LABEL_WIDTH。
UI - > lbHeadPic - > setMinimumWidth(m_indentation)。
}
カスタムノードのインターフェースを追加してレベルの実装をカスタマイズし、itemwidgetがカスタム実装を通じて現在のレベル階層を取得して、インデント値m_indentationを計算できるようにします。
次に、このインデント値に従って描画して、インデント効果を実現します。
このようにして、QTreeWidgetの機能が実現され、停滞に関するQTreeWidgetのバグを解決することと同等になります。