c++ - QTreeWidget editItem 失败,出现 "edit: editing failed"

标签 c++ qt qwidget qtreewidget

我有一个 QTreeWidgetItem 添加到 QTreeWidget:

QTreeWidgetItem* item = new QTreeWidgetItem(ui->trwPairs);
item->setFlags(item->flags() | Qt::ItemIsEditable);

如果项目被编辑,我想对新值做一些检查:

Pairs::Pairs(QWidget *parent) :
QWidget(parent),
  ui(new Ui::Pairs)
{
  ui->setupUi(this);
  connect(this->ui->trwPairs, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(Validate(QTreeWidgetItem*,int)));
}

void Pairs::Validate(QTreeWidgetItem* item, int column)
{
  if (item->text(column).toInt() < 1)
  {
    QMessageBox::critical(this, "Error", QString("Node ID ") + item->text(column) +  " is invalid.");
    ui->trwPairs->editItem(item, column);
  }
}

自然地,如果它小于 1,它会捕获它,并给我消息框。但是,打印到 cerr 的是 edit: editing failed 并且该项目未处于编辑模式。我错过了什么?

最佳答案

在调试器中逐步执行它会显示以下内容:

在 quabstractitemview.cpp 中,第 3953 行返回 false 行。不知何故,您的项目看起来仍处于编辑状态,您正在尝试再次编辑它或进行其他操作。

bool QAbstractItemViewPrivate::shouldEdit(QAbstractItemView::EditTrigger trigger,
                                          const QModelIndex &index) const
{
// ..
    if (state == QAbstractItemView::EditingState)
      return false;
}

IIRC 对于每个单元格有多行的表格,我遇到了类似的问题。查看类 QAbstractItemDelegate View 具有项目委托(delegate),允许您控制使用哪个编辑器及其行为方式。我相信默认情况下使用 QLineEdit。像 QLineEdit 这样的编辑器可以有控制数据验证方式的验证器,在你的情况下,如果数值 < 0 则拒绝它。但我认为你必须使用模型/ View 类并为此实现你自己的模型。 QTreeWidget::setItemWidget(..) 的 Qt 文档说:

This function should only be used to display static content in the place of a tree widget item. If you want to display custom dynamic content or implement a custom editor widget, use QTreeView and subclass QItemDelegate instead.

但是我不确定是否有更简单的方法使用小部件类来完成此操作。

关于c++ - QTreeWidget editItem 失败,出现 "edit: editing failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12146364/

相关文章:

c++ - std::ostream 到 QDataStream

c++ - 在什么语言中有 "guard"关键字或概念?

c++ - 在 Eclipse 中使用 Qt Designer 创建的 Qt GUI

qt - QWidget setGeometry 在不使用 QLayout 的情况下显示

c++ - 获取 QToolbar 当前停靠区域的简单方法

c++ - unordered_map 在 erase() 上重新散列

c++ - 未解析的外部符号(构造函数)

c++ - 是否可以在一个 main.ui 文件中包含多个 .ui 文件?

c++ - Qt 等待 QPushButton 按下

qt - QWidget 透明背景(但不是 child )