Qt 4.6 - C ++ - QTreeWidgetItem迭代器

时间:2010-01-11 18:57:59

标签: c++ qt iterator

我有一个包含项目的QTreeWidget。第一列包含唯一编号。这是通过item-> setData(0,0,unique_number);设置的。第二列包含一个复选框,通过item-> setCheckState(1,Qt :: Unchecked);设置。用户可以选择他想要使用的项目并按下按钮。此按钮的插槽将在选中的项目上运行循环。在Qt文档中给出了一个例子。您使用QTreeWidgetItemIterator。

QTreeWidgetItemIterator it(treeWidget);
 while (*it) {
     if ((*it)->text(0) == itemText)
         (*it)->setSelected(true);
     ++it;
 }

它还表示您可以在构造函数中指定一个参数,以便仅迭代已检查的项目。标志是:QTreeWidgetItemIterator :: Checked。我稍微定制的循环如下:

QTreeWidgetItemIterator it(treeWidget, QTreeWidgetItemIterator::Checked);

while (*it)
{
    QVariant w;
    w = (*it)->data(0, 0);
    std::cout << "Selected item # " << w.toInt() << "\n";
    it++;

}

此代码编译正常,但在实际运行程序时不起作用。它不会打印任何值。

任何提示?谢谢!

3 个答案:

答案 0 :(得分:1)

Qt文档中遗漏的一个警告是,QTreeWidgetItemIterator :: Checked标志仅测试每个QTreeWidgetItem中列0的检查状态。使用第0列作为复选框,使用第1列作为唯一编号,应该使循环打印值。

答案 1 :(得分:1)

谢谢Roneel!

另一种方法就是这样(我只想出来)。

QTreeWidgetItemIterator it(ui->treeWidget);

while (*it)
{

    if ((*it)->checkState(1) == 2)
    {
        QVariant w;
        w = (*it)->data(4, 0);
        std::cout << "Selected item # " << w.toString().toStdString() << "\n";
    }

    ++it;

}

checkState采用int列参数,== 2仅允许处理已检查的项目。

答案 2 :(得分:1)

只有一件事......我认为将enum与int进行比较并不是一个好习惯,因为枚举“int value”可能会改变......与Qt::Checked相比......它只是“肯定”阅读更加干净