QTreeWidget editItem失败,出现"编辑:编辑失败"

Dri*_*ise 4 c++ qt qtreewidget qwidget

QTreeWidgetItem添加了一个QTreeWidget:

QTreeWidgetItem* item = new QTreeWidgetItem(ui->trwPairs);
item->setFlags(item->flags() | Qt::ItemIsEditable);
Run Code Online (Sandbox Code Playgroud)

如果项目已编辑,我想对新值进行一些检查:

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

当然,如果它小于1,它会捕获它,并给我消息框.但是,打印到cerris edit: editing failed并且项目不处于编辑模式.我错过了什么?

Nil*_*ils 8

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

在quabstractitemview.cpp行中,在3953行返回false.不知何故,您的项目仍然处于编辑状态,并且您正在尝试再次编辑它.

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

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

此函数仅应用于在树窗口小部件项目的位置显示静态内容.如果要显示自定义动态内容或实现自定义编辑器窗口小部件,请改用use QTreeView和subclass QItemDelegate.

我不确定是否有一种更简单的方法来使用widget类.


Bal*_*des 5

问题可能是,您以一种非常奇怪的方式为您的项目设置标志。只需启用两个项目选择,然后编辑:

item->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
Run Code Online (Sandbox Code Playgroud)