trwPairs); ite-6ren">
gpt4 book ai didi

c++ - QTreeWidget editItem 失败,出现 "edit: editing failed"

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:51 49 4
gpt4 key购买 nike

我有一个 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 subclass QItemDelegate instead.

但是我不确定是否有更简单的方法使用小部件类来完成此操作。

关于c++ - QTreeWidget editItem 失败,出现 "edit: editing failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12146364/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com