使用QTableView
and QAbstractTableModel
- 当模型为正在编辑的单元格发出dataChanged
事件时,用户在单元格中键入的字符串(但未按 Enter 键“提交”编辑)将被删除。
示例:单击一个单元格,键入“123”,单元格仍处于编辑模式,等待更多文本,dataChanged
发出并擦除“123”,在编辑模式下留下一个空单元格。
有谁知道如何停止这种行为,或者模型如何检测单元格何时被编辑以防止dataChanged
为该单元格引发事件?
使用QTableView
and 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");
}
这应该够了吧
我遇到了同样的问题,并找到了一种无需编写自己的委托的方法:
问题正是您描述的方式:数据在后台更新,您编辑的所有内容都被清除,因为 dataChanged 事件更新所有值,从而调用数据函数,如果没有为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。
这对我来说非常有效:)
检查您的模型类,您应该覆盖模型中的 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;
}
我认为您应该仅将dataChanged
event 用于未编辑的索引或仅用于Qt::ItemDataRole::DisplayRole
. 例如,为每一行使用仅更新第二列:
emit dataChanged(index(0, 1),
index(rowCount() - 1, 1),
QVector<int>{ Qt::ItemDataRole::DisplayRole });