动态生成的QTreeWidget中与父相关的QTreeWidgetItem复选框

rab*_*er7 3 c++ checkbox qt4 qtreewidget c++11

我正在编写一个具有QTreeWidget的应用程序,该QTreeWidget通过解析包含树级别的XML文件来填充.如果我选择顶级复选框,我还需要检查所有子级复选框.

我已经使用XML解析器工作并使用带有复选框的QTreeWidgetItems填充QTreeWidget,但它们只能单独检查.

Ric*_*ith 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));
    }   
}
Run Code Online (Sandbox Code Playgroud)

需要考虑的几点注意事项:

  1. 您可能想要使用itemClicked信号而不是itemChanged信号.这通常有效,但在用户使用箭头键和空格键更改检查状态时无效.
  2. 您需要考虑通过单击其父项取消选中已检查的子项之后会发生什么.通常这意味着您需要取消选中或部分检查所有祖先.这可能不适用于您的情况.
  3. 对于项目的其他更改(例如文本更改),itemUpdated也会被触发,因此请注意,这不是一种超级有效的方法.