QT开发中文网

Qt C++ 在QTreeView窗口中任意双击一个有效内容,获取到原数据进行保存,再改变数据后,再想通过undo回到原数据,不重写接口该如何实现,请给出详细代码

实现这个功能需要使用QAbstractItemModel类中的数据修改信号和undo/redo框架。下面是一个简单的示例代码:

首先,创建一个自定义的模型MyModel,继承自QAbstractItemModel,实现必要的接口函数:

class MyModel : public QAbstractItemModel
{
    Q_OBJECT

public:
    explicit MyModel(QObject *parent = nullptr);

    QModelIndex index(int row, int column, const QModelIndex &parent) const override;
    QModelIndex parent(const QModelIndex &child) const override;
    int rowCount(const QModelIndex &parent) const override;
    int columnCount(const QModelIndex &parent) const override;
    QVariant data(const QModelIndex &index, int role) const override;
    bool setData(const QModelIndex &index, const QVariant &value, int role) override;

signals:
    void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>());

private:
    QMap<QModelIndex, QVariant> m_dataMap;
};

在setData函数中捕获数据修改信号,并将原数据保存到undo栈中:

bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (role == Qt::EditRole) {
        // save original data for undo
        QVariant originalData = data(index, role);
        QUndoCommand *undoCommand = new DataChangeUndoCommand(this, index, originalData);
        QUndoStack *undoStack = MainWindow::getInstance()->getUndoStack();
        undoStack->push(undoCommand);

        m_dataMap[index] = value;
        emit dataChanged(index, index);
        return true;
    }
    return false;
}

然后,创建一个自定义的undo命令DataChangeUndoCommand,继承自QUndoCommand,用于保存数据修改的原始状态和新状态:

class DataChangeUndoCommand : public QUndoCommand
{
public:
    DataChangeUndoCommand(MyModel *model, const QModelIndex &index, const QVariant &originalData)
        : m_model(model), m_index(index), m_originalData(originalData)
    {
        setText(tr("Data Change"));
    }

    void undo() override
    {
        m_model->setData(m_index, m_originalData, Qt::EditRole);
    }

    void redo() override
    {
        QVariant newData = m_model->data(m_index, Qt::EditRole);
        m_model->setData(m_index, newData, Qt::EditRole);
    }

private:
    MyModel *m_model;
    QModelIndex m_index;
    QVariant m_originalData;
};

最后,在窗口中双击QTreeView中的一个项时,获取到该项的数据并保存到变量中:

void MainWindow::on_treeView_doubleClicked(const QModelIndex &index)
{
    QVariant data = ui->treeView->model()->data(index);
    // save data to variable for later use
}

当需要回到原始状态时,通过调用undo栈的undo函数即可:

MainWindow::getInstance()->getUndoStack()->undo();

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=1406

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?