【问题标题】:Qt 4.6 - C++ - QTreeWidgetItem IteratorQt 4.6 - C++ - QTreeWidgetItem 迭代器
【发布时间】:2010-01-11 18:57:58
【问题描述】:

我有一个 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++;

}

此代码可以正常编译,但在您实际运行程序时无法正常工作。它不打印任何值。

有什么建议吗?谢谢!

【问题讨论】:

    标签: c++ qt iterator


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      谢谢罗内尔!

      另一种方法是这样的(我刚刚想通了)。

      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 只允许处理选中的项目。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2017-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多