我有一个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.返回不知怎的,它看起来像你的项目仍处于编辑状态,你正试图再次什么的编辑。
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
代替。
我不知道但是如果没有做到这一点使用窗口小部件类简单的方法。
这个问题可能是,你是设置你的项目的旗帜在一个非常奇怪的方式。 只需启用这两个商品选择和编辑:
item->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
我曾在那里我试图在收到编辑的后续列类似的问题itemChanged
信号。 基于Nils的分析,该项目仍处于编辑状态,我改变了信号连接类型QueuedConnection ,允许重新进入之前,该项目离开的状态。
我有一个类似的问题在那里我能得到“编辑:编辑失败”通过一个快捷键调用编辑()时的错误。 我经过CURRENTINDEX()编辑(),但我没有检查所选行的正确的列是当前。 我只用了第一列可编辑的,所以如果我点击了排(但在任何其他列),然后调用我的编辑键我会得到错误。
我能够通过同级的结果,解决我的问题(CURRENTINDEX()行(),0)编辑()代替。