QTableView:dataChanged事件清除正在编辑的单元格



使用QTableViewQAbstractTableModel-当模型为正在编辑的单元格发出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 });

最新更新