2016-10-31 2 views
2

Я подклассифицирую редактирование QPlainText, и я хотел бы иметь возможность перехватывать команды undo/redo, чтобы я мог реализовать пользовательские функции.Как переопределить отмену/повтор в QPlainTextEdit

Я понимаю, что я могу отключить возможность отмены/повтора с помощью setUndoRedoEnabled, и я могу обнаружить нажатия клавиш Ctrl + Z и Ctrl + Y. Однако это не похоже на лучший кросс-платформенный способ сделать это.

Любые советы?

+1

На самом деле вы не хотите, чтобы перехватить буквально 'Ctrl + Z' - в ваших' keyPressEvent' complare ваш '' QKeyEvent' против QKeySequence :: Undo': 'если (event-> спичек (QKeySequence :: Undo)) {...} '. – peppe

+0

Спасибо, это именно то, что я искал. –

ответ

1

Вам просто нужно переопределять слоты:

class MyTestEdit : public QPlainTextEdit { 
    Q_OBJECT 

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

}; 

сигналов и слотов точно, как и другие методы ++ гр. Если вы переопределите их в подклассе, они будут вызываться вместо родительского.

+1

Это хорошая идея, чтобы привыкнуть добавлять 'Q_DECL_OVERRIDE', чтобы (с компилятором C++ 11) вы можете получить сообщение об ошибке, если вы ошиблись в сигнатуре функции. –

+0

Извините, нет: 'undo' и' redo' не являются виртуальными функциями в QPlainTextEdit. 'Q_DECL_OVERRIDE' вызовет ошибку компиляции. – peppe

+0

Это было сказано: этот трюк * может * фактически работать (без ключевого слова 'override', конечно) из-за виртуальности слотов при использовании старого синтаксиса соединения. Но я не думаю, что сигнал и слот используются для запуска 'undo' в этом сценарии, а скорее в« обычном »ключевом совпадении. – peppe

0

Я думаю, вы можете использовать «QUndoStack» для этого.

В конструкторе вашего подкласса (конструктор лучше) вызовите метод, который создает действия Отменить и Повторить для вашего класса.

Прототип:

// Вызов этой функции для регистрации отмены и повтора действий.

Void methodCrteaesUndoandRedoActions() 
{ 

QUndoStack unStack = new QUndoStack (this); 

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

} 

// Внесите ниже функции в свой класс для управления бизнесом.

void undo() 
{ 



} 

void redo() 
{ 



} 
Смежные вопросы