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

时间:2013-08-26 05:06:34

标签: qt qtableview

使用QTableViewQAbstractTableModel - 当模型为正在编辑的单元格发出dataChanged事件时,用户在单元格中键入的字符串(但未按下输入到'提交'编辑)被删除。

示例:单击一个单元格,键入“123”,单元格仍处于编辑模式,等待更多文本,发出dataChanged并删除“123”,留空单元格处于编辑模式。

有没有人知道如何阻止此行为,或者模型在编辑单元格时如何检测以防止为该单元格引发dataChanged个事件?

4 个答案:

答案 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 });