首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Qt/C++中实现撤消功能(如Ctrl + Z)

在Qt/C++中实现撤销功能(如Ctrl + Z),可以通过以下步骤来实现:

  1. 创建一个撤销命令类,该类继承自QUndoCommand,并实现其中的方法:
代码语言:cpp
复制
class MyUndoCommand : public QUndoCommand {
public:
    MyUndoCommand(QObject *receiver, const QString &methodName, const QVariant &value);
    void undo() override;
    void redo() override;
private:
    QObject *m_receiver;
    QString m_methodName;
    QVariant m_value;
};
  1. 在需要实现撤销功能的类中,创建一个QUndoStack对象,并在需要实现撤销功能的方法中,创建一个MyUndoCommand对象,并将其添加到QUndoStack中:
代码语言:cpp
复制
class MyWidget : public QWidget {
    Q_OBJECT
public:
    MyWidget(QWidget *parent = nullptr);
private:
    QLineEdit *m_lineEdit;
    QUndoStack *m_undoStack;
public slots:
    void setText(const QString &text);
};

MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
    m_lineEdit = new QLineEdit(this);
    m_undoStack = new QUndoStack(this);
    connect(m_lineEdit, &QLineEdit::textChanged, this, &MyWidget::setText);
}

void MyWidget::setText(const QString &text) {
    MyUndoCommand *command = new MyUndoCommand(m_lineEdit, "setText", text);
    m_undoStack->push(command);
}
  1. 在MyUndoCommand类中实现undo()和redo()方法,以实现撤销和重做功能:
代码语言:cpp
复制
MyUndoCommand::MyUndoCommand(QObject *receiver, const QString &methodName, const QVariant &value)
    : m_receiver(receiver), m_methodName(methodName), m_value(value) {
}

void MyUndoCommand::undo() {
    QMetaObject::invokeMethod(m_receiver, m_methodName.toStdString().c_str(), Qt::DirectConnection, Q_ARG(QVariant, m_value));
}

void MyUndoCommand::redo() {
    QMetaObject::invokeMethod(m_receiver, m_methodName.toStdString().c_str(), Qt::DirectConnection, Q_ARG(QVariant, m_value));
}
  1. 在主窗口中,通过快捷键(如Ctrl + Z)触发撤销和重做操作:
代码语言:cpp
复制
class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
private:
    MyWidget *m_myWidget;
protected:
    void keyPressEvent(QKeyEvent *event) override;
};

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    m_myWidget = new MyWidget(this);
    setCentralWidget(m_myWidget);
}

void MainWindow::keyPressEvent(QKeyEvent *event) {
    if (event->key() == Qt::Key_Z && event->modifiers() & Qt::ControlModifier) {
        if (event->modifiers() & Qt::ShiftModifier) {
            m_myWidget->m_undoStack->redo();
        } else {
            m_myWidget->m_undoStack->undo();
        }
    } else {
        QMainWindow::keyPressEvent(event);
    }
}

这样,就可以在Qt/C++中实现撤销功能了。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

qlineedit_qt layoutstretch

QLineEdit允许用户输入和编辑单行纯文本,提供了很多有用的编辑功能,包括:撤消和重做、剪切和粘贴、以及拖放(见setDragEnabled())。...复制选中的文本复制到剪贴板 Ctrl+K 删除此处至末尾所有内容 Ctrl+V 粘贴剪贴板的文本到输入框 Shift+Insert 粘贴剪贴板的文本到输入框 Ctrl+X 剪切选中的文本到剪贴板...Shift+Delete 剪切选中的文本到剪贴板 Ctrl+Z 撤销上一次操作 Ctrl+Y 重做上一次操作 共有类型 枚举:QLineEdit::ActionPosition 描述如何显示加入到输入框的...常量 值 描述 QLineEdit::LeadingPosition 0 当使用布局方向Qt::LeftToRight时,部件显示文本左侧;使用Qt::RightToLeft时,则显示右侧。...QLineEdit::TrailingPosition 1 当使用布局方向Qt::LeftToRight时,部件显示文本右侧;使用Qt::RightToLeft时,则显示左侧。

2.2K30

Notepad++开源替代NotepadNext

支持多种语言, C++、YAML、XML、LaTeX、PHP、Python、R、Rust 等。 调整以禁用/启用部分 UI。 支持录制宏,运行它,保存录制的宏。 文件的查找和替换功能。 线操作。...撤消/重做按钮。 放大/缩小。 Lua 控制台。 EOL 操作。 能够转换大写 ↔ 小写。...开发指南 当前的开发是 Windows 上使用 Visual Studio 2019 和 Qt v5.15 完成的。这也可以各种 Linux 发行版和 macOS 上成功构建。...如果您熟悉使用 Qt Creator 构建 C++ Qt 桌面应用程序,那么这应该就像打开src/NotepadNext.pro和构建/运行项目一样简单。...如果您不熟悉构建 C++ Qt 桌面应用程序,这里有更详细的指南。 本文内容到此结束了, 如有收获欢迎点赞收藏关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问欢迎各位指出。

2.1K20
  • 进程调度程序设计实验报告_进程调度模拟程序设计实验报告

    大家好,又见面了,我是你们的朋友全栈君 进程调度的设计与实现 源码下载:进程调度的设计与实现 中文摘要 无论是批处理系统还是分时系统,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机...实验内容与主要设计思想 1、采用一种熟悉的语言, C、 PASCAL 或 C++等,编制程序,最好关键代码采用 C/C++,界面设计可采用其它自己喜欢的语言。...进入进程调度循环后,每次按 ctrl+f即动态创建一个进程,然后将该PCB 插入就绪队列。按 ctrl+q 退出进程调度循环。 10、进程调度循环中,每次选择优先级最大的就绪进程来执行。...如果将该运行进程的生命周期不为 0,则重新把它变为就绪状态,插入就绪队列;否则该进程执行完成,撤消其 PCB。以上为一次进程调度循环。...Sansung pm961 256g 软件: OS:deepin 15.5 IDE:Qt 5.8.0 主要功能模块分析 创建进程 void PCB_adjlist::ctreat_pcb

    1.1K10

    引擎工具开发的一些总结

    因为我见过很多业余的编辑器, 大多都是每加一个参数就在UI层写一些代码, IO层加一些版本兼容代码等. 而这些代码常常都是大同小异的, 很多都是Ctrl+C, Ctrl+V出来的....说起来, 这个探索过程我也走了不少的弯路, 顺便写出来当教训吧 最早是从java/.net转来写C++, 所以对于C++的UI开发十分的不满....所以, 也有很多引擎是多语言的架构, 底层C++, 工具C#, 逻辑lua....算是一条邪路, 哈哈 目前阶段, 接触了一些大牛和商业引擎后, 最终的选择是: Qt + C++反射 + C++序列化....参见: 关于游戏引擎结构上的思考, C++的反射和序列化 Undo/Redo(撤消/重做) ---- 我们一大牛说过: "判断一个工具是不是成熟, 就看它有没有Undo/Redo的功能".

    87450

    CAD常用命令、快捷键和命令说明大全 「建议收藏」

    CAD常用命令、快捷键和命令说明大全 一:常用功能键   F1: 获取帮助   F2: 实现作图窗和文本窗口的切换   F3: 控制是否实现对象自动捕捉   F4: 数字化仪控制    F5:...】+【A】   回到上一视图*作 【Shift】+【A】   撤消场景*作 【Ctrl】+【Z】   撤消视图*作 【Shift】+【Z】   刷新所有视图 【1】   用前一次的参数进行渲染 【Shift...】+【E】或【F9】   渲染配置 【Shift】+【R】或【F10】   xy/yz/zx锁定循环改变 【F8】   约束到X轴 【F5】   约束到Y轴 【F6】   约束到Z轴 【F7】   ...】+【A】   撤消场景*作 【Ctrl】+【Z】   用前一次的配置进行渲染 【F9】   渲染配置 【F10】   向下收拢 【Ctrl】+【↓】   向上收拢 【Ctrl】+【↑】   材质编辑器...执行(Run)序列 【Ctrl】+【R】   新(New)的序列 【Ctrl】+【N】   撤消场景*作 【Ctrl】+【Z】   NURBS编辑   CV 约束法线(Normal)移动 【Alt】+【

    8.3K20

    CAD快捷键大全

    ✨绘图命令 ✨控制键  ✨JOG ✨无规律的个别   ✨方便记忆 常用功能键        F1: 获取帮助   F2: 实现作图窗和文本窗口的切换   F3: 控制是否实现对象自动捕捉   F4:...】+【A】   回到上一视图*作 【Shift】+【A】   撤消场景*作 【Ctrl】+【Z】   撤消视图*作 【Shift】+【Z】   刷新所有视图 【1】   用前一次的参数进行渲染 【Shift...】+【E】或【F9】   渲染配置 【Shift】+【R】或【F10】   xy/yz/zx锁定循环改变 【F8】   约束到X轴 【F5】   约束到Y轴 【F6】   约束到Z轴 【F7】   ...】+【A】   撤消场景*作 【Ctrl】+【Z】   用前一次的配置进行渲染 【F9】   渲染配置 【F10】   向下收拢 【Ctrl】+【↓】   向上收拢 【Ctrl】+【↑】   材质编辑器...局部观察平面图细节时,通常使用CAD快捷键Z+空格 19. 可以工作区看到实时缩放的放大镜 Z+空格+空格 20. 平移视图的快捷方式是P+空格 21.

    2.2K20

    C++Qt:环境安装与入门示例

    Qt Creator是Qt官方的IDE,此外也兼容第三方扩展,Visual Studio、Python。Qt可以使用纯C++开发界面和逻辑;也可以用QML做界面,C++做逻辑,QML效果会好一些。...Qt是一个功能强大,易于使用且具有跨平台特性的应用程序开发框架。它被视为开发图形用户界面和嵌入式系统应用程序的首选框架之一。...Ubuntu可以命令行直接生成pro工程文件,较为方便: qmake -project qmake xxx.pro make # 编译 Windows Qt程序的构建快捷键Ctrl+B,运行快捷键Ctrl...+R,可以构建和运行设置自定义构建的目录。...Qt信号槽机制 信号槽机制是一种用于在对象之间进行通信的机制。它是Qt框架的核心特性之一,使得事件发生时能够自动触发相应的操作,从而实现对象之间的解耦和灵活的交互。

    21210

    Qt教程一

    由于 Qt 的商业授权,KDE 社区一度混乱纠结,与此同时 GNOME 则如火荼发展起来了。...修改变量名,并应用到所有用到该变量的地方 Ctrl + Shift +r 快速打开输出窗口 Alt + 数字键(1-8) 书签功能,即在某行代码处进行标记,方便以后找到。...“类别”列表,选择“文件”选项;“命令”列表,选择“高级保存选项”选项。 单击“确定”。...+允许同一范围声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,这就是重载函数。...重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。 class Animal { public: ...

    6310

    CAD操作大全

    CAD软件操作,为使用者方便,于 Windows工作时一样,利用CAD快捷键代替鼠标。利用键盘快捷键发出命令,完成绘图,修改,保存等操作。这些命令键就是CAD快捷键。   ...现在就来看看AutoCAD快捷键: 一、CAD快捷键:常用功能键 F1: 获取帮助 F2: 实现作图窗和文本窗口的切换 F3: 控制是否实现对象自动捕捉 F4: 数字化仪控制 F5: 等轴测平面切换...】+【Z撤消视图*作 【Shift】+【Z】 刷新所有视图 【1】 用前一次的参数进行渲染 【Shift】+【E】或【F9】 渲染配置 【Shift】+【R】或【F10】 xy/yz/zx锁定循环改变...【F9】 渲染配置 【F10】 撤消场景*作 【Ctrl】+【Z】 4.示意(Schematic)视图 下一时间单位 【>】 前一时间单位 【<】 回到上一场景*作 【Ctrl】+【A】 撤消场景*作...】+【R】或【F10】   xy/yz/zx锁定循环改变 【F8】   约束到X轴 【F5】   约束到Y轴 【F6】   约束到Z轴 【F7】   旋转(Rotate)视图模式

    3.7K30

    vim常用命令总结

    显然你可以再输入一遍,但是命令"u" 更简便,它可以撤消上一次的操作。 5.重做 如果你撤消了多次,你还可以用CTRL-R(重做)来反转撤消的动作。换句话说,它是对撤消撤消。...撤消命令还有另一种形式,"U"命令,它一次撤消对一行的全部操作。第二次使用该命令则会撤消前一个"U"的操作。用"u"和CTRL-R你可以找回任何一个操作状态。...这个位置Vim是一个标记。使用命令" `` "可以使你跳回到刚才的出发点。   ``命令可以两点之间来回跳转。CTRL-O命令是跳转到你更早些时间停置光标的位置(提示:O意为older).... 光标的移动 m  设置书签 ‘  移至书签处 0    移至该行之首 $    移至该行之末。...:set hlsearch 使用查找功能时,会高亮显示所有匹配的内容。 :set nohlsearch  关闭此功能

    1.3K10

    Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装

    导语: Qt是一个跨平台的C++图形界面应用程序框架。它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序。Qt很容易扩展,并且允许真正地组件编程。...C盘。...如果你想运行一个示例程序看看,那么打开示例项目后点击左下角的绿色三角或者Ctrl+R即可运行示例(需要等几秒,右下角会有编译进度条)。 ?...Qt4时代,这些东西都是分开的,需要开发者们自己动手配置开发环境。而Qt5版本出来之后,将所有需要的东西都整合到了安装包,并且环境可以自动配置,为开发者减轻了不少负担。...qt-opensource-windows-x86-mingw482-4.8.6-1.exe,其实都是官方为我们实现编译好的只需要我们按引导安装即可,时间省去了不知多少。

    6.2K10

    撤销VBA对工作表的操作

    excelperfect 标签:VBA 当执行VBA过程代码后,如果想反悔,像在Excel操作一样,使用Excel的撤销功能或者按Ctrl+Z来撤销VBA代码对工作表的改变,不会起作用。...这里,jkp-ads.com中找到了代码,可以用来撤销VBA对工作表的操作。代码,关键是两个类模块,创建了一个通用撤消处理程序,可以将其导入到任何项目。...此外,对对象所做的任何更改都是在这个类完成的。最后,这个类记录更改后的属性以前的值。...这个类将确保对对象进行更改(包括更改和撤消更改)。 这里的程序可以撤消的操作通常仅限于对对象属性的更改,无法撤消插入或删除工作表、刷新查询表、更新数据透视表等操作。...或者,完美Excel微信公众号中发送消息: 撤销代码操作 获取原示例工作簿的下载链接。 或者,直接到知识星球App完美Excel社群中下载原示例工作簿。

    24710

    Notepad++ 替代品开源了!!!

    Notepad Next 是一个 C++ 应用程序使用 Qt5 工具包作为其用户界面。...Notepad Next 旨在模仿 Notepad++ 提供的功能和用户界面。但不应期望提供相同级别的产品,因为 Notepad Next 仍在积极开发(截至目前为 0.5 版)并且需要一些改进。...话虽如此,Notepad Next 大多数情况下都是可用且稳定的。...支持多种语言, C++、YAML、XML、LaTeX、PHP、Python、R、Rust 等。 调整以禁用 / 启用部分 UI。 支持录制宏,运行它,保存录制的宏。 文件的查找和替换功能。...撤消 / 重做按钮。 放大 / 缩小。 Lua 控制台。 EOL 操作。 能够转换大写 ↔ 小写。跨平台 还值得注意的是,目前,macOS 版本是实验性的。

    89720

    弃用 Notepad++,事实证明它更牛逼!

    Notepad Next 是一个 C++ 应用程序使用 Qt5 工具包作为其用户界面。...Notepad Next 旨在模仿 Notepad++ 提供的功能和用户界面。但不应期望提供相同级别的产品,因为 Notepad Next 仍在积极开发(截至目前为 0.5 版)并且需要一些改进。...话虽如此,Notepad Next 大多数情况下都是可用且稳定的。...支持多种语言, C++、YAML、XML、LaTeX、PHP、Python、R、Rust 等。 调整以禁用/启用部分 UI。 支持录制宏,运行它,保存录制的宏。 文件的查找和替换功能。 线操作。...撤消/重做按钮。 放大/缩小。 Lua 控制台。 EOL 操作。 能够转换大写 ↔ 小写。跨平台 还值得注意的是,目前,macOS 版本是实验性的。

    1.6K30

    【效率】Notepad++ 替代品开源了!

    Notepad Next 是一个 C++ 应用程序使用 Qt5 工具包作为其用户界面。...Notepad Next 旨在模仿 Notepad++ 提供的功能和用户界面。但不应期望提供相同级别的产品,因为 Notepad Next 仍在积极开发(截至目前为 0.5 版)并且需要一些改进。...话虽如此,Notepad Next 大多数情况下都是可用且稳定的。...支持多种语言, C++、YAML、XML、LaTeX、PHP、Python、R、Rust 等。 调整以禁用/启用部分 UI。 支持录制宏,运行它,保存录制的宏。 文件的查找和替换功能。 线操作。...撤消/重做按钮。 放大/缩小。 Lua 控制台。 EOL 操作。 能够转换大写 ↔ 小写。跨平台 还值得注意的是,目前,macOS 版本是实验性的。

    1.3K40

    换掉 Notepad++,事实证明它更牛逼!

    Notepad Next 是一个 C++ 应用程序使用 Qt5 工具包作为其用户界面。...但不应期望提供相同级别的产品,因为 Notepad Next 仍在积极开发(截至目前为 0.5 版)并且需要一些改进。话虽如此,Notepad Next 大多数情况下都是可用且稳定的。...支持多种语言, C++、YAML、XML、LaTeX、PHP、Python、R、Rust 等。 调整以禁用/启用部分 UI。 支持录制宏,运行它,保存录制的宏。 文件的查找和替换功能。 线操作。...撤消/重做按钮。 放大/缩小。 Lua 控制台。 EOL 操作。 能够转换大写 ↔ 小写。跨平台 还值得注意的是,目前,macOS 版本是实验性的。...我尝试了 Flatpak 应用程序 Ubuntu 20.04 LTS 上对其进行了简单的测试,它运行良好。

    1.2K20

    Notepad++ 替代品开源了,好用 !!!

    Notepad Next 是一个 C++ 应用程序使用 Qt5 工具包作为其用户界面。...Notepad Next 旨在模仿 Notepad++ 提供的功能和用户界面。但不应期望提供相同级别的产品,因为 Notepad Next 仍在积极开发(截至目前为 0.5 版)并且需要一些改进。...话虽如此,Notepad Next 大多数情况下都是可用且稳定的。...支持多种语言, C++、YAML、XML、LaTeX、PHP、Python、R、Rust 等。 调整以禁用/启用部分 UI。 支持录制宏,运行它,保存录制的宏。 文件的查找和替换功能。 线操作。...撤消/重做按钮。 放大/缩小。 Lua 控制台。 EOL 操作。 能够转换大写 ↔ 小写。跨平台 还值得注意的是,目前,macOS 版本是实验性的。

    3.2K30
    领券