QTreeWidget 的用法

Qt QTreeWidget

新建一个Qt Widgets Application,拖拽一个Tree Widget 到 ui 界面上,最后实现的效果如下:

  1 添加代码
  2 
  3 
  4 //test.h
  5 
  6 //在头文件里添加两个公用函数还有一个槽函数的声明
  7 
  8 #include <QTreeWidgetItem>
  9 
 10 public:
 11 
 12  void initTreeWidget();
 13 
 14  void updateParentItem(QTreeWidgetItem *item);
 15 
 16 public:
 17 
 18  void treeItemChanged(QTreeWidgetItem *item,int column);
 19 
 20 
 21 //test.cpp
 22 
 23 //在构造函数里添加 connect()
 24 
 25  initTreeWidget();
 26 
 27  connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem *,int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));
 28 
 29 //initTreeWidget() 的实现
 30 
 31 void test::initTreeWidget()
 32 
 33 {
 34 
 35     ui->treeWidget->clear();
 36 
 37     //第一组
 38 
 39     QTreeWidgetItem *group1=new QTreeWidgetItem(ui->treeWidget);
 40 
 41     group1->setText(0,"group1");
 42 
 43     group1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
 44 
 45     group1->setCheckState(0,Qt::Unchecked);
 46 
 47     QTreeWidgetItem *item11=new QTreeWidgetItem(group1);
 48 
 49     item11->setText(0,"item11");
 50 
 51     item11->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
 52 
 53     item11->setCheckState(0,Qt::Unchecked);
 54 
 55     QTreeWidgetItem *item12=new QTreeWidgetItem(group1);
 56 
 57     item12->setText(0,"item12");
 58 
 59     item12->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
 60 
 61     item12->setCheckState(0,Qt::Unchecked);
 62 
 63     QTreeWidgetItem *item13=new QTreeWidgetItem(group1);
 64 
 65     item13->setText(0,"item13");
 66 
 67     item13->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
 68 
 69     item13->setCheckState(0,Qt::Unchecked);
 70 
 71     //第二组
 72 
 73     QTreeWidgetItem *group2=new QTreeWidgetItem(ui->treeWidget);
 74 
 75     group2->setText(0,"group2");
 76 
 77     group2->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
 78 
 79     group2->setCheckState(0,Qt::Unchecked);
 80 
 81     QTreeWidgetItem *item21=new QTreeWidgetItem(group2);
 82 
 83     item21->setText(0,"item21");
 84 
 85     item21->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
 86 
 87     item21->setCheckState(0,Qt::Unchecked);
 88 
 89     QTreeWidgetItem *item22=new QTreeWidgetItem(group2);
 90 
 91     item22->setText(0,"item22");
 92 
 93     item22->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
 94 
 95     item22->setCheckState(0,Qt::Unchecked);
 96 
 97     QTreeWidgetItem *item23=new QTreeWidgetItem(group2);
 98 
 99     item23->setText(0,"item23");
100 
101     item23->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
102 
103     item23->setCheckState(0,Qt::Unchecked);
104 
105 }
106 
107 //treeItemChanged(QTreeWidgetItem *item, int column)的实现
108 
109 void test::treeItemChanged(QTreeWidgetItem *item, int column)
110 
111 {
112 
113     QString itemText=item->text(0);
114 
115     //选中时
116 
117     if(Qt::Checked==item->checkState(0))
118 
119     {
120 
121         QTreeWidgetItem* parent=item->parent();
122 
123         int count=item->childCount();
124 
125         if(count>0)
126 
127         {
128 
129             for(int i=0;i<count;i++)
130 
131             {
132 
133                 //子节点也被选中
134 
135                 item->child(i)->setCheckState(0,Qt::Checked);
136 
137             }
138 
139         }
140 
141         else
142 
143         {
144 
145             //是子节点
146 
147             updateParentItem(item);
148 
149         }
150 
151     }
152 
153     else if(Qt::Unchecked==item->checkState(0))
154 
155     {
156 
157         int count=item->childCount();
158 
159         if(count>0)
160 
161         {
162 
163             for(int i=0;i<count;i++)
164 
165             {
166 
167                 item->child(i)->setCheckState(0,Qt::Unchecked);
168 
169             }
170 
171         }
172 
173         else
174 
175         {
176 
177             //是子节点
178 
179             updateParentItem(item);
180 
181         }
182 
183     }
184 
185 }
186 
187 //updateParentItem(QTreeWidgetItem *item) 的实现
188 
189 void test::updateParentItem(QTreeWidgetItem *item)
190 
191 {
192 
193     QTreeWidgetItem* parent=item->parent();
194 
195     if(parent==NULL)
196 
197     {
198 
199         return;
200 
201     }
202 
203     //选中的子节点个数
204 
205     int selectCount=0;
206 
207     int childCount=parent->childCount();
208 
209     for(int i=0;i<childCount;i++)
210 
211     {
212 
213         QTreeWidgetItem *childItem=parent->child(i);
214 
215         if(childItem->checkState(0)==Qt::Checked)
216 
217         {
218 
219             selectCount++;
220 
221         }
222 
223     }
224 
225     if(selectCount<=0)
226 
227     {
228 
229         //选中状态
230 
231         parent->setCheckState(0,Qt::Unchecked);
232 
233     }
234 
235     else if(selectCount>0 && selectCount<childCount)
236 
237     {
238 
239         //部分选中状态
240 
241         parent->setCheckState(0,Qt::PartiallyChecked);
242 
243     }
244 
245     else if(selectCount==childCount)
246 
247     {
248 
249         //未选中状态
250 
251         parent->setCheckState(0,Qt::Checked);
252 
253     }
254 
255 }
原文地址:https://www.cnblogs.com/lovebay/p/9328331.html