首页
学习
活动
专区
工具
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 桌面应用程序,这里有更详细的指南。 本文内容到此结束了, 如有收获欢迎点赞收藏关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问欢迎各位指出。

2K20

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

大家好,又见面了,我是你们的朋友全栈君 进程调度的设计与实现 源码下载:进程调度的设计与实现 中文摘要 无论是批处理系统还是分时系统,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机...实验内容与主要设计思想 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的功能".

84050

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.2K20

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.1K20

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

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

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

5.9K10

vim常用命令总结

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

1.2K10

【效率】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.1K40

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 版本是实验性的。

80420

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.1K30

撤销VBA对工作表的操作

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

14110

弃用 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.2K30

换掉 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 上对其进行了简单的测试,它运行良好。

98520

C++ Qt开发:ToolBar与MenuBar菜单组件

Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,Qt我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ToolBar工具栏组件以及与之类似的...1.1 QToolBar 工具栏QToolBar 是 Qt 中用于创建工具栏的组件,它为用户提供了一个方便的方式来组织和访问应用程序的各种工具和操作。工具栏通常用于快速访问常用的功能,提高用户体验。...(Qt::CTRL | Qt::Key_C);为其指定特殊的快捷键。...1.3.3 增加右键菜单Qt中的菜单还可以实现任意位置的弹出,该功能实现依赖于QMainWindow主窗体的customContextMenuRequested()事件,该事件是Qt的一个信号,通常与右键菜单...on_MainWindow_customContextMenuRequested事件,该事件的内部则实现了创建菜单的功能,并通过pMenu->exec(QCursor::pos())的方式显示鼠标点击位置处

1.1K10

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.4K40
领券