我有一个包含项目的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++;
}
此代码编译正常,但在实际运行程序时不起作用。它不会打印任何值。
任何提示?谢谢!
答案 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
相比......它只是“肯定”阅读更加干净