我有一个 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 subclassQItemDelegate
instead.
但是我不确定是否有更简单的方法使用小部件类来完成此操作。
关于c++ - QTreeWidget editItem 失败,出现 "edit: editing failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12146364/