如何在QPlainTextEdit中覆盖撤销/重做功能

4

我正在子类化QPlainText编辑器,并希望能够拦截撤销/重做命令,以便实现自定义功能。

我意识到可以使用setUndoRedoEnabled禁用撤销/重做功能,并且可以检测Ctrl+Z和Ctrl+Y键的按下。然而,这似乎不是最佳的跨平台方法。

有什么建议吗?


3
事实上,您不希望字面上拦截 Ctrl+Z--在您的 keyPressEvent 中将您的 QKeyEventQKeySequence::Undo 进行比较:if (event->matches(QKeySequence::Undo)) { ... } - peppe
谢谢,这正是我在寻找的。 - Alan Spark
2个回答

1
您只需要重新实现插槽即可:

class MyTestEdit : public QPlainTextEdit {
    Q_OBJECT

public slots:
    void redo() { ... }
    void undo() { ... }

};

信号和槽与其他C++方法完全相同。如果您在子类中重新实现它们,它们将被调用而不是父类的。


1
养成添加 Q_DECL_OVERRIDE 的习惯是个好主意,这样(使用 C++11 编译器)如果函数签名错误,就会报错。 - Toby Speight
抱歉,QPlainTextEdit中没有undoredo虚函数。使用Q_DECL_OVERRIDE会触发编译错误。 - peppe
话虽如此,这个技巧 可能 真的会起作用(当然,没有 override 关键字),因为在使用旧的连接语法时,插槽的虚拟性可能会起作用。但我认为,在这种情况下,信号和插槽并不是用来触发“撤消”的,而是一个“普通”的键匹配。 - peppe
@peppe: 谢谢,这会教训我要确保听取别人意见前先去确定。 - BlueMagma

0
我认为你可以使用“QUndoStack”来实现这个功能。
在你的子类构造函数中(最好是构造函数),调用一个方法来创建Undo和Redo操作,以处理你的类。
原型:
//调用此函数来注册撤销和重做操作。
Void methodCrteaesUndoandRedoActions()
{

QUndoStack unStack = new QUndoStack (this);

QAction *undoAct = undoStack->createUndoAction(this);
QAction *RedoAct = undoStack->createRedoAction(this);

}

//在你的类中实现以下函数以处理业务。

void undo()
{



}

void redo()
{



}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接