2016-10-31 3 views
2

QPlainText를 하위 클래스로 편집하고 사용자 지정 기능을 구현할 수 있도록 실행 취소/다시 실행 명령을 가로 채고 싶습니다.QPlainTextEdit에서 실행 취소/다시 실행을 재정의하는 방법

setUndoRedoEnabled를 사용하여 실행 취소/다시 실행 기능을 비활성화 할 수 있다는 것을 알고 있으며 Ctrl + Z 및 Ctrl + Y 키를 감지 할 수 있습니다. 그러나 이것은 플랫폼을 수행하는 최상의 크로스 플랫폼처럼 보이지 않습니다.

어떤 조언이 필요합니까?

+1

말 그대로 'Ctrl 키 + Z'을 차단하고 싶지 않아 - 당신의'keyPressEvent'이 QKeySequence :: Undo''으로부터'QKeyEvent'을 complare에'경우 (이벤트 -> 경기 (QKeySequence :: 실행 취소)) {...}'. – peppe

+0

고마워, 이건 내가 찾고 있었던거야. –

답변

1

당신은 단순히 슬롯을 재 구현해야합니다

class MyTestEdit : public QPlainTextEdit { 
    Q_OBJECT 

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

}; 

신호와 슬롯은 정확히 다른 C++ 방법 같다. 하위 클래스에서 다시 구현하면 부모 클래스 대신 호출됩니다.

+1

'Q_DECL_OVERRIDE'를 추가하는 습관을 갖춰서 (C++ 11 컴파일러로) 함수 서명이 잘못되었을 때 오류를 얻을 수 있도록하는 것이 좋습니다. –

+0

죄송합니다. no :'undo'와'redo'는 QPlainTextEdit에서 가상 함수가 아닙니다. 'Q_DECL_OVERRIDE'는 컴파일 에러를 발생시킵니다. – peppe

+0

그 말은 : 이전의 연결 구문을 사용할 때 슬롯의 가상성 때문에이 트릭 *이 실제로 작동 할 수도 있습니다 (물론 'override' 키워드없이). 하지만 신호와 슬롯이이 시나리오에서 '실행 취소'를 트리거하는 데 사용되는 것이 아니라 '일반적인'키 일치라고 생각합니다. – peppe

0

나는 이것을 위해 "QUndoStack"을 사용할 수 있다고 생각합니다.

하위 클래스의 생성자 (생성자가 더 좋음)에서 클래스에 대해 처리 할 실행 취소 및 다시 실행 작업을 만드는 메서드를 호출합니다.

프로토 타입 :

// 실행 취소 및 다시 실행 작업을 등록하려면이 함수를 호출.

Void methodCrteaesUndoandRedoActions() 
{ 

QUndoStack unStack = new QUndoStack (this); 

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

} 

// 비즈니스를 처리하기 위해 클래스에서 아래 기능을 구현하십시오. 사실

void undo() 
{ 



} 

void redo() 
{ 



} 
관련 문제