728x90

1. 목표

더보기

 

  1. 편집 메뉴의 다음 기능을 구현한다
    • 실행 취소 undo
    • 다시 실행 redo
    • 잘라내기 cut
    • 복사 copy
    • 붙여넣기 paste

  2. PySide6 의 QTextEdit 가 이미 제공하는 편집 메서드를 활용해
    복잡한 알고리즘 없이 편집 기능을 구현하는 방법을 익힌다

  3. Qt Designer 에서 만든 QAction 과
    QTextEdit 의 슬롯 메서드를 직접 연결하는 패턴을 익힌다

  4. 파이썬 문자열 조작 슬라이스 등으로 직접 편집하지 않고
    Qt 위젯이 제공하는 편집 API 를 사용하는 구조에 익숙해진다

 


 

2. 전체 로직

더보기
# mainwindow.py

. . .

class MainWindow(QMainWindow):
    def __init__(self, parent=None):

        . . .
        self.editor = self.ui.textEdit
        
        self.ui.actionUndo.triggered.connect(self.editor.undo)
        self.ui.actionRedo.triggered.connect(self.editor.redo)
        self.ui.actionCut.triggered.connect(self.editor.cut)
        self.ui.actionCopy.triggered.connect(self.editor.copy)
        self.ui.actionPaste.triggered.connect(self.editor.paste)
 
        . . .
# main.py

import sys
from PySide6.QtWidgets import QApplication

from mainwindow import MainWindow

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec())

 

3. 필요한 import + 주석 설명

더보기

동일



4. 메뉴 액션과 슬롯 연결하기

더보기
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # QTextEdit 에 자주 접근하므로 별칭을 하나 만들어 둔다
        self.editor = self.ui.textEdit

        # 9.10 편집 기능 구현
        # QTextEdit 는 undo, redo, cut, copy, paste 메서드를 이미 제공하므로
        # QAction 의 triggered 시그널을 해당 메서드에 직접 연결할 수 있다

        # 실행 취소 기능을 editor.undo 에 연결한다
        self.ui.actionUndo.triggered.connect(self.editor.undo)

        # 다시 실행 기능을 editor.redo 에 연결한다
        self.ui.actionRedo.triggered.connect(self.editor.redo)

        # 잘라내기 기능을 editor.cut 에 연결한다
        self.ui.actionCut.triggered.connect(self.editor.cut)

        # 복사 기능을 editor.copy 에 연결한다
        self.ui.actionCopy.triggered.connect(self.editor.copy)

        # 붙여넣기 기능을 editor.paste 에 연결한다
        self.ui.actionPaste.triggered.connect(self.editor.paste)

 

5. 편집 기능 구현 함수

더보기

Qt Designer 의 ui_form.py 를 보면
Edit 메뉴에 다음 QAction 이 정의되어 있습니다.

  • actionUndo
  • actionRedo
  • actionCut
  • actionCopy
  • actionPaste

이 액션들은 이미 메뉴와 툴바에 배치되어 있고 단축키도 지정되어 있습니다

이제 mainwindow.py 에서 이 액션들을 QTextEdit 의 편집 메서드에 연결하면 됩니다


 

6. 실행 테스트

 

7. 학습 주요 포인트

더보기

QTextEdit 의 편집 기능 적극 활용

  • 실행 취소, 다시 실행, 잘라내기, 복사, 붙여넣기는
    대부분의 텍스트 편집기에서 반드시 필요한 기능이다
  • PySide6 의 QTextEdit 는 이 기능들을 모두 내장하고 있으므로
    복잡한 자료구조를 직접 구현하지 않고도
    강력한 편집 기능을 바로 사용할 수 있다

 

QAction 과 위젯 메서드를 직접 연결하는 패턴

  • 이번 단계에서는
    별도의 슬롯 함수를 만들지 않고
    QAction.triggered 를 바로 editor.undo 같은 메서드에 연결했다
  • 이 패턴은 메뉴나 툴바에서 단순히 위젯 메서드를 호출할 때
    매우 간결하고 읽기 쉽다

 

래핑 슬롯을 통한 로깅과 디버깅

  • 실제 프로젝트에서는
    바로 연결 방식이 코드가 더 간단하지만
  • 수업이나 디버깅 단계에서는
    edit_undo 같은 래핑 메서드를 만들어
    print 로 로그를 남기고 나서
    editor.undo 를 호출하는 편이 동작을 이해하는 데 도움이 된다

 

파일 입출력 로직과의 분리

  • 편집 기능은 메모리 상의 QTextDocument 만 수정하고
    디스크의 파일에는 아무 영향도 주지 않는다
  • 실제 파일로 저장하거나 다시 읽어오는 작업은
    다른 단계에서 QFile, QTextStream 기반으로 처리한다
  • 이런 역할 분리가 되어 있어야
    나중에 자동 저장, 되돌리기, 히스토리 기능 등을 확장하기 쉽다

 

단축키와 메뉴, 툴바의 일관성

  • ui_form.py 에서
    Undo, Redo, Cut, Copy, Paste 에 이미 단축키가 설정되어 있다
  • QAction 을 한 번만 연결해 두면
    메뉴 클릭, 툴바 클릭, 단축키 입력이 모두 동일한 코드로 들어온다
  • 학생들에게 Qt 의 액션 시스템이
    여러 입력 방법을 하나의 시그널로 통합해 주는 구조라는 점을 강조할 수 있다

 

단계별 완성 파일