4

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,它会捕获它,并给我消息框。但是,打印到cerredit: editing failed并且该项目未处于编辑模式。我错过了什么?

4

4 回答 4

9

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

在 quabstractitemview.cpp 中,第 3953 行返回 false。不知何故,您的项目似乎仍处于编辑状态,而您正试图再次编辑它或其他什么。

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

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

此功能仅应用于在树小部件项目的位置显示静态内容。如果要显示自定义动态内容或实现自定义编辑器小部件,请改用QTreeView和子类化QItemDelegate

但是,我不确定是否有更简单的方法可以使用小部件类来做到这一点。

于 2012-08-29T07:22:51.323 回答
5

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

item->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
于 2012-08-27T23:46:37.533 回答
3

我有一个类似的问题,我试图在收到itemChanged信号后编辑后续列。根据 Nils 的分析,该项目仍处于编辑状态,我将信号连接类型更改为QueuedConnection,这允许项目在重新进入之前离开状态。

于 2014-03-06T10:28:01.580 回答
0

我遇到了类似的问题,通过快捷键调用 edit() 时会出现“编辑:编辑失败”错误。我正在将 currentIndex() 传递给 edit(),但我没有检查所选行的正确列是否为当前列。我只有第一列可编辑,所以如果我单击了该行(但在任何其他列中)然后调用了我的编辑键,我会得到错误。

我能够通过将兄弟(currentIndex().row(), 0) 的结果传递给 edit() 来解决我的问题。

于 2017-06-16T22:06:13.260 回答