我在编写一个应用程序,其中包含一个QTreeWidget,通过解析包含树级别的XML文件进行填充。如果我选择一个顶层复选框,则需要将所有子级复选框也选中。
我已经使XML解析器工作,并使用具有复选框的QTreeWidgetItems填充QTreeWidget,但它们只能逐个检查。
我在编写一个应用程序,其中包含一个QTreeWidget,通过解析包含树级别的XML文件进行填充。如果我选择一个顶层复选框,则需要将所有子级复选框也选中。
我已经使XML解析器工作,并使用具有复选框的QTreeWidgetItems填充QTreeWidget,但它们只能逐个检查。
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));
}
}
请注意以下几点:
QTreeWidget
是Qt Creator/Designer表单的一部分,那ClassName
应该是什么?它只是包含的QMainWindow
的类名吗? - rabidhamper7recursiveChecks()
方法中,item
变量是从哪里来的? - rabidhamper7QMainWindow
扩展类中,并在第二个方法中将 item
更改为 parent
。非常完美!再次感谢! - rabidhamper7这篇文章在搜索引擎中仍然很高,但已经过时了。 只需在顶级项目上设置 Qt::ItemIsAutoTristate 标记。
我稍微改进了一下Rick的答案,并得到了不错的结果。也许对其他人有所帮助。 它通过三态状态更新父节点和子节点的状态,但只针对父节点(选中、未选中、部分选中)。
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);
}
}