c++ - 处理 QAbstractItemModel::dataChanged() 信号时如何获取旧值?

标签 c++ qt qabstractitemmodel

我有一个 QTableView,它设置了一个 QStandardItemModel。用户在 View 中的某个索引中编辑数据,然后模型发出 dataChanged() 信号。在我处理 SIGNAL 的 SLOT 中,我有用户更改的 QModelIndex 范围,因此我可以获得用户输入的新值。我怎样才能获得当时的旧值?

最佳答案

经过一些研究,我发现没有标准的方法可以实现这种行为。为了解决这个问题,我必须继承 QStandardItemModel 并像这样重新实现 setData():

class RecallModel : public QStandardItemModel
{
public:
    RecallModel (QObject * parent = 0) : QStandardItemModel(parent) {}

    // Reimplemented
    bool setData(const QModelIndex &index, const QVariant &value, int role= Qt::EditRole)
    {
        // backup the previous model data
        if (role == Qt::EditRole || role == Qt::DisplayRole)
            QStandardItemModel::setData(index, data(index), Qt::UserRole + 1);

        return QStandardItemModel::setData(index, value, role);
    }
};

然后我可以访问处理 dataChanged() 信号的插槽中的旧数据:

void SomeObject::handleDataChange(const QModelIndex &topLeft, const QModelIndex &bottomRight)
{
    ...
    const QVariant &vOldData = index.data(Qt::UserRole + 1); // here is the old data
    const QVariant &vNewData = index.data(Qt::DisplayRole); // here is the new data
    ...
}

关于c++ - 处理 QAbstractItemModel::dataChanged() 信号时如何获取旧值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27227896/

相关文章:

c++ - 在循环 C++ 中更改列表的值

c++ - 如何在QGridLayout中获取QComboBox的当前文本?

qt - 使用 Qt5 在 Dropbox 中进行身份验证的 Http 请求

c++ - 循环所有模型索引及其子项会导致堆栈溢出错误

c++ - 上下文依赖于 QListView 中的拖放

c++ - 如何解决库间包含依赖关系?

c++ - 检查两个 vector 是否平行的最有效方法

C++ Template,第一次学习,这段代码有什么问题?

qt - 带有 Qt 5.5 的 OpenCV 3.0 : Toolbar icons and control panel not shown

c++ - 从 QAbstractItemModel 返回自定义用户类型