4

使用QTableViewand QAbstractTableModel- 当模型为正在编辑的单元格发出dataChanged事件时,用户在单元格中键入的字符串(但未按 Enter 键“提交”编辑)将被删除。

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

有谁知道如何停止这种行为,或者模型如何检测单元格何时被编辑以防止dataChanged为该单元格引发事件?

4

4 回答 4

3

我有同样的问题。问题是,该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");
}

这应该够了吧

于 2017-10-23T16:36:15.837 回答
1

我遇到了同样的问题,并找到了一种无需编写自己的委托的方法:

问题正是您描述的方式:数据在后台更新,您编辑的所有内容都被清除,因为 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。

这对我来说非常有效:)

于 2018-06-15T11:21:40.037 回答
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;
}
于 2013-08-30T04:30:31.937 回答
0

我认为您应该仅将dataChangedevent 用于未编辑的索引或仅用于Qt::ItemDataRole::DisplayRole. 例如,为每一行使用仅更新第二列:

emit dataChanged(index(0, 1),
 index(rowCount() - 1, 1),
 QVector<int>{ Qt::ItemDataRole::DisplayRole });
于 2018-08-13T11:50:51.777 回答