我已将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
且该项目未处于编辑模式。我错过了什么?
答案 0 :(得分:8)
在调试器中逐步执行它会显示以下内容:
在quabstractitemview.cpp行中,在第3953行返回false。不知何故,您的项目仍处于编辑状态,并且您正在尝试再次编辑它或其他内容。
bool QAbstractItemViewPrivate::shouldEdit(QAbstractItemView::EditTrigger trigger,
const QModelIndex &index) const
{
// ..
if (state == QAbstractItemView::EditingState)
return false;
}
IIRC我遇到了类似的问题,每个单元格有多行。查看具有项目委托的类QAbstractItemDelegate
视图,这些视图允许您控制使用哪个编辑器以及它的行为方式。我相信默认使用QLineEdit。像QLineEdit这样的编辑器可以有控制器来控制数据的验证方式,如果数值是&lt;但是我认为你必须使用模型/视图类并为此实现自己的模型。 QTreeWidget::setItemWidget(..)
的Qt文档说:
此功能仅应用于在树窗口小部件项目的位置显示静态内容。如果要显示自定义动态内容或实现自定义编辑器窗口小部件,请改用
QTreeView
和子类QItemDelegate
。
我不确定是否有更简单的方法可以使用小部件类来完成此任务。
答案 1 :(得分:4)
问题可能是,您正以非常奇怪的方式设置项目的标记。 只需启用项目选择和编辑:
item->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
答案 2 :(得分:3)
我有一个类似的问题,我在收到itemChanged
信号后尝试编辑后续列。根据Nils的分析,该项目仍处于编辑状态,我将信号连接类型更改为QueuedConnection,这允许项目在重新输入之前离开状态。
答案 3 :(得分:0)
我有一个类似的问题,当我通过快捷键调用edit()时,我会得到'编辑:编辑失败'错误。我正在将currentIndex()传递给edit(),但我没有检查所选行的正确列是否是当前的。我只有第一列可编辑,所以如果我点击了行(但在任何其他列中)然后调用了我的编辑键我就会收到错误。
我能够通过将兄弟(currentIndex()。row(),0)的结果传递给edit()来解决我的问题。