使用QTableView
和QAbstractTableModel
- 当模型为正在编辑的单元格发出dataChanged
事件时,用户在单元格中键入的字符串(但未按下输入到'提交'编辑)被删除。
示例:单击一个单元格,键入“123”,单元格仍处于编辑模式,等待更多文本,发出dataChanged
并删除“123”,留空单元格处于编辑模式。
有没有人知道如何阻止此行为,或者模型在编辑单元格时如何检测以防止为该单元格引发dataChanged
个事件?
答案 0 :(得分:2)
我遇到了同样的问题。问题是,使用不同的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");
}
应该做的伎俩
答案 1 :(得分:1)
我遇到了同样的问题并且没有编写我自己的代表就找到了一种方法:
问题正是你如何描述它:数据在后台更新,你编辑的所有内容都被清除,因为dataChanged事件更新所有值,从而调用数据函数,如果没有,则返回一个空的QVariant()对象为Qt :: EditRole指定。甚至Leonid的答案总是会用相同的QString(“Text to Edit”)覆盖你的编辑。
所以我做的是:
引入一个成员变量并将其变为可变,以便可以通过const数据函数进行更改:
mutable bool m_updateData = true;
在后台数据更新功能中,在发出dataChanged信号之前检查m_update日期:
if (m_updateData)
emit(dataChanged(index, index));
在数据函数中,检查编辑角色并将m_updateData设置为false:
if (role == Qt::EditRole)
{
m_updateData = false;
}
编辑完成后,将调用setData函数,您可以在其中更新模型中的数据。完成后将m_updateDate重置为true。
这对我来说非常有用:)
答案 2 :(得分:0)
检查模型类,您应该覆盖模型中的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;
}
答案 3 :(得分:0)
我认为您应该仅将dataChanged
事件用于未编辑的索引或仅用于Qt::ItemDataRole::DisplayRole
。
例如。每行只更新第二列:
emit dataChanged(index(0, 1),
index(rowCount() - 1, 1),
QVector<int>{ Qt::ItemDataRole::DisplayRole });