QTreeWidget符合条件的项目失败,“编辑:编辑失败”(QTreeWidget editIte

2019-09-21 17:52发布

我有一个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和项目不在编辑模式。 我在想什么?

Answer 1:

通过它在调试器步进揭示了以下内容:

在quabstractitemview.cpp线虚实线3953.返回不知怎的,它看起来像你的项目仍处于编辑状态,你正试图再次什么的编辑。

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代替。

我不知道但是如果没有做到这一点使用窗口小部件类简单的方法。



Answer 2:

这个问题可能是,你是设置你的项目的旗帜在一个非常奇怪的方式。 只需启用这两个商品选择和编辑:

item->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);


Answer 3:

我曾在那里我试图在收到编辑的后续列类似的问题itemChanged信号。 基于Nils的分析,该项目仍处于编辑状态,我改变了信号连接类型QueuedConnection ,允许重新进入之前,该项目离开的状态。



Answer 4:

我有一个类似的问题在那里我能得到“编辑:编辑失败”通过一个快捷键调用编辑()时的错误。 我经过CURRENTINDEX()编辑(),但我没有检查所选行的正确的列是当前。 我只用了第一列可编辑的,所以如果我点击了排(但在任何其他列),然后调用我的编辑键我会得到错误。

我能够通过同级的结果,解决我的问题(CURRENTINDEX()行(),0)编辑()代替。



文章来源: QTreeWidget editItem fails with “edit: editing failed”