使用QTableView
和QAbstractTableModel
-当模型为正在编辑的单元格发出dataChanged
事件时,用户在单元格中键入的字符串(但未按enter键"提交"编辑)将被擦除。
示例:单击一个单元格,键入"123",单元格仍处于编辑模式,等待更多文本,dataChanged
被发出,"123"被擦除,使空单元格处于编辑模式。
是否有人知道如何停止这种行为,或者模型如何检测何时编辑单元格以防止该单元格引发dataChanged
事件?
我也遇到了同样的问题。问题是,data()
函数是用不同的role
参数调用的。为了显示role==Qt::DisplayRole
和在编辑时使用role==Qt::EditRole
调用它。例如,尝试更改
QVariant MyModel::data(const QModelIndex & index, int role) const
{
if (role == Qt::DisplayRole)
return QString("Text to Edit");
}
至
QVariant MyModel::data(const QModelIndex & index, int role) const
{
if (role == Qt::DisplayRole || role == Qt::EditRole)
return QString("Text to Edit");
}
这应该可以完成
我遇到了同样的问题,并找到了一种不用编写自己的Delegate的方法:
问题正是你所描述的:数据在后台更新,你编辑的所有内容都被清除,因为dataChanged Event更新了所有值,从而调用了data函数,如果没有为Qt::EditRole指定任何内容,它将返回一个空的QVariant()对象。即使Leonid的回答也总是用相同的QString("要编辑的文本")覆盖您的编辑。
所以我做的是:
引入一个成员变量,并将其设为可变的,以便可以通过constdata函数进行更改:
mutable bool m_updateData = true;
在后台数据更新功能中,在启用dataChanged Signal:之前检查m_update日期
if (m_updateData)
emit(dataChanged(index, index));
在数据功能中,检查编辑角色并将m_updateData设置为false:
if (role == Qt::EditRole)
{
m_updateData = false;
}
编辑完成后,将调用setData函数,用于更新模型中的数据。完成此操作后,将m_updateDate重置为true。
这对我来说非常有效:)
检查您的模型类,您应该覆盖模型中的setData方法。如果每件事都是正确的,它将在编辑数据后更新模型。。。如果你有另一个实现,请告诉我
bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.isValid() && role == Qt::EditRole) {
int row = index.row();
int col = index.column();
//// change data
emit(dataChanged(index, index));
return true;
}
return false;
}
我认为应该仅对未编辑的索引或仅对Qt::ItemDataRole::DisplayRole
使用dataChanged
事件。例如,每使用一行只更新第二列:
emit dataChanged(index(0, 1),
index(rowCount() - 1, 1),
QVector<int>{ Qt::ItemDataRole::DisplayRole });