首页 > 其他分享 >Qt中的撤销/重做功能

Qt中的撤销/重做功能

时间:2024-04-02 12:13:18浏览次数:23  
标签:src MChangeName const Qt void 撤销 item QString 重做

作为一个例子,本例只实现了在列表控件“添加项”和“修改项名称”的2个操作。界面上显示一个列表框,列表框需要在界面设计器中设为IconMode,这样就会是图标在上文本在下的显示样式。“添加”按钮用来在列表框中加一个项。点击图标下面的文本可以修改文本名称。程序测试环境是VS2017和Qt5.9,测试结果功能正常,运行效果如下:

头文件:

class QListWidget;

class MAddImage : public QUndoCommand
{
public:
    MAddImage(const QString &text, QListWidget* isrc, QUndoCommand *parent = Q_NULLPTR);
    ~MAddImage() override = default;
    void setActionInfo(const QPixmap& image, int where);
    void undo() override;
    void redo() override;

private:
    QListWidget* src;
    QPixmap pixmap;
    int pos;
};

class MChangeName : public QUndoCommand
{
public:
    MChangeName(const QString &text, QListWidget* isrc, QUndoCommand *parent = Q_NULLPTR);
    ~MChangeName() override = default;
    void setActionInfo(const QString& oldName, const QString& newName, int where);
    void undo() override;
    void redo() override;

private:
    QListWidget* src;
    QString newText;
    QString oldText;
    int pos;
};

CPP文件:

MAddImage::MAddImage(const QString &text, QListWidget* isrc, QUndoCommand *parent) :
    QUndoCommand(text, parent)
{
    src = isrc;
}

void MAddImage::setActionInfo(const QPixmap& image, int where)
{
    pixmap = image;
    pos = where;
}

void MAddImage::undo()
{
    delete src->takeItem(pos);
}

void MAddImage::redo()
{
    QListWidgetItem* item = new QListWidgetItem(QIcon(pixmap), QString(u8"未命名"));
    item->setFlags(Qt::ItemIsEditable | item->flags());
    src->insertItem(pos, item);
}

MChangeName::MChangeName(const QString &text, QListWidget* isrc, QUndoCommand *parent) : 
    QUndoCommand(text, parent)
{
    src = isrc;
}

void MChangeName::setActionInfo(const QString& oldName, const QString& newName, int where)
{
    oldText = oldName;
    newText = newName;
    pos = where;
}

void MChangeName::undo()
{
    src->blockSignals(true);
    QListWidgetItem* item = src->item(pos);
    item->setText(oldText);
    src->blockSignals(false);
}

void MChangeName::redo()
{
    src->blockSignals(true);
    QListWidgetItem* item = src->item(pos);
    item->setText(newText);
    src->blockSignals(false);
}

在主窗口类中有几个槽函数需要实现以响应用户的操作。下面的代码中QtTest是主窗口类;ui.lwList是列表控件;(ui.)pbAdd是“添加”按钮;(ui.)pbUndo是“撤销”按钮;(ui.)pbRedo是“重做”按钮。operas是QtTest类成员变量,定义是 QUndoStack operas; ,它是Qt封装好的用于管理撤销/重做命令的类,详情可以查阅Qt帮助文档。

void QtTest::on_lwList_currentRowChanged(int row)
{
    QListWidgetItem* it = ui.lwList->item(row);
    currEditText = it->text();
}

void QtTest::on_lwList_itemChanged(QListWidgetItem *item)
{
    MChangeName* changeAct = new MChangeName(u8"修改名称", ui.lwList);
    changeAct->setActionInfo(currEditText, item->text(), ui.lwList->row(item));
    operas.push(changeAct); /* 由于push(...)自动触发redo()操作,因此这里重命名两次 */
}

void QtTest::on_pbAdd_clicked()
{
    QPixmap pixmap(100, 80);
    pixmap.fill(QColor(qrand() % 255, qrand() % 255, qrand() % 255));
    MAddImage* addAct = new MAddImage(u8"添加图片", ui.lwList);
    addAct->setActionInfo(pixmap, ui.lwList->count());
    operas.push(addAct);
}

void QtTest::on_pbUndo_clicked()
{
    operas.undo();
}

void QtTest::on_pbRedo_clicked()
{
    operas.redo();
}

 

标签:src,MChangeName,const,Qt,void,撤销,item,QString,重做
From: https://www.cnblogs.com/mengxiangdu/p/18068934

相关文章

  • Qt 配置Eigen
    Eigen简介Eigen支持包括固定大小、任意大小的所有矩阵操作,甚至是稀疏矩阵;支持所有标准的数值类型,并且可以扩展为自定义的数值类型;支持多种矩阵分解及其几何特征的求解;它不支持的模块生态系统提供了许多专门的功能,如非线性优化,矩阵功能,多项式解算器,快速傅立叶变换等。......
  • QT开发:报错:QAxBase: Error calling IDispatch member Open: Exception thrown by serv
    在Qt中打开excel出现下面的错误提示:QAxBase:ErrorcallingIDispatchmemberOpen:Exceptionthrownbyserver怎么解决?错误提示通常意味着在尝试使用Qt的ActiveX模块(QAxBase)打开Excel文件时发生了异常。这可能是由于多种原因引起的,包括文件损坏、权限问题、Excel安装问题或者Q......
  • Qt程序员必看/关于Qt收费的官方答复
    一、答复说明Qt软件从诞生之日就是GPL/LGPL开源授权和商业授权并存的,开源不代表免费而是为了共享。关于您的问题,我做大致的回复。Qt商用版本的模块是否都是LGPL协议,所有模块是否存在GPL这种要求强制开源的协议?如果购买Qt商业许可,那么客户就不需要收到GPL儿GPL的协议约束,可以......
  • Qt中的ui文件
    Qt中的ui文件简介Qt中的UI文件是一种特殊的XML格式文件,用于描述应用程序的用户界面。这些文件可以使用Qt的可视化设计工具QtDesigner来创建和编辑。QtDesigner提供了直观的界面,允许用户通过拖放和配置界面元素来设计应用程序的图形用户界面(GUI)。UI文件包含了界面上各种控件的......
  • Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)
    【写在前面】        之前应公司需要,给公司写过一整套直播的库(推拉流,编解码),类似于libobs。    结果后来因为没有相关项目,便停止开发&维护了。    不过里面很多有用的组件,然后也挺好用的,遂开源出来一部分。    因此,本篇就简单讲一下用......
  • vue在组件销毁的时候将异步请求撤销
    背景Vue2+ArcGISJS加载图层使用FeatureLayer.queryFeatures(query)对服务端执行地理数据查询请求。该请求为fetch类型。复现Bug:刚打开专题A,未等加载完,点击快速切换到共用同一个地图的新专题B,地图却加载专题A的数据图层。原因:由于地图还是用的同一个对象,且该函数Feat......
  • QtQuick 学习笔记(一)容器组件
    1.QGroupBox功能提供分组框支持,可在其中布置多种窗口部件常用函数与组件voidsetChecked(boolchecked)QGroupBox使能voidsetTitle(constQString&title)标题文本设置效果及功能测试GroupBox.cpp#include<QApplication>#include<QDialog>#include......
  • 【QT+QGIS跨平台编译】054:【exiv2lib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
    点击查看专栏目录文章目录一、exiv2lib介绍二、文件下载三、文件分析四、pro文件五、编译实践一、exiv2lib介绍  exiv2lib是一个用于处理图像元数据的开源C++库。它可用于读取、编辑和写入图像文件中的Exif元数据(ExchangeableImageFileFormat,可交......
  • 【QT学习笔记】qt配置快捷键:全局快捷键|应用程序中的快捷键
    在QtCreator中配置快捷键,可以通过以下步骤进行:配置全局快捷键(适用于整个IDE的操作):1.**打开快捷键设置**:  -打开QtCreator,点击顶部菜单栏的“工具”(Tools)。  -在下拉菜单中选择“选项”(Options)。  -在打开的选项窗口中,找到并点击“键盘”(Keyboard)或......
  • Qt实现Kermit协议(二)
    3实现3.1Kermit该模块是Kermit协议实现类。3.1.1Kermit定义/*|<------IncludedinCHECK----->|||+------+-----+-----+------+------+---+-------+|MARK|LEN|SEQ|TYPE|DATA|CHECK|<terminator>+------+......