9.10 편집 기능
728x90

1. 목표
더보기
- 편집 메뉴의 다음 기능을 구현한다
- 실행 취소 undo
- 다시 실행 redo
- 잘라내기 cut
- 복사 copy
- 붙여넣기 paste
- PySide6 의 QTextEdit 가 이미 제공하는 편집 메서드를 활용해
복잡한 알고리즘 없이 편집 기능을 구현하는 방법을 익힌다 - Qt Designer 에서 만든 QAction 과
QTextEdit 의 슬롯 메서드를 직접 연결하는 패턴을 익힌다 - 파이썬 문자열 조작 슬라이스 등으로 직접 편집하지 않고
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 의 액션 시스템이
여러 입력 방법을 하나의 시그널로 통합해 주는 구조라는 점을 강조할 수 있다
단계별 완성 파일
