9.13 폰트 / 컬러 / 도움말
728x90

1. 목표
더보기
- QFontDialog 를 사용해 폰트를 선택하고 QTextEdit 에 적용하는 방법을 이해한다.
- QColorDialog 를 사용해 글자 색을 선택하고 적용하는 방법을 이해한다.
- QMessageBox.about 을 사용해 간단한 도움말 창을 띄우는 방법을 익힌다.
- 메뉴 액션(actionFont, actionColor, actionAbout_App)과 슬롯 함수를 연결하는 패턴을 익힌다.
- 선택된 텍스트에만 폰트를 적용하는 방식과, 향후 입력될 텍스트에 폰트를 적용하는 방식을 구분해서 이해한다.
2. 전체 로직
더보기
# mainwindow.py
. . .
from PySide6.QtWidgets import QFontDialog, QColorDialog
class MainWindow(QMainWindow):
def __init__(self, parent=None):
. . .
self.ui.actionFont.triggered.connect(self.font_dialog)
self.ui.actionColor.triggered.connect(self.color_dialog)
self.ui.actionAbout_App.triggered.connect(self.about)
. . .
def font_dialog(self):
ok, font = QFontDialog.getFont(
self.editor.font(),
self,
"폰트 선택"
)
if not ok:
return
cursor = self.editor.textCursor()
fmt = QTextCharFormat()
fmt.setFont(font)
if cursor.hasSelection():
cursor.mergeCharFormat(fmt)
else:
current_fmt = self.editor.currentCharFormat()
current_fmt.merge(fmt)
self.editor.setCurrentCharFormat(current_fmt)
def color_dialog(self):
color = QColorDialog.getColor(
self.editor.textColor(),
self,
"글자 색 선택"
)
if color.isValid():
self.editor.setTextColor(color)
def about(self):
QMessageBox.about(
self,
"About Notepad",
"PySide6 메모장 예제입니다.\n"
"폰트, 컬러, 도움말 기능을 학습할 수 있습니다."
)
# 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 + 주석 설명
더보기
# QFont 는 글꼴 정보를 표현하는 클래스
# QTextCharFormat 은 개별 문자(또는 영역)의 서식을 다루는 클래스
from PySide6.QtGui import QFont, QTextCharFormat
QFont, QTextCharFormat: 선택 영역에 폰트 속성을 입히기 위한 핵심 클래스
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.13 단계: 폰트, 컬러, 도움말 메뉴에 함수 연결
# 메뉴나 툴바에서 actionFont 가 눌리면 font_dialog 메서드가 호출된다
self.ui.actionFont.triggered.connect(self.font_dialog)
# actionColor 가 눌리면 color_dialog 가 호출된다
self.ui.actionColor.triggered.connect(self.color_dialog)
# actionAbout_App 이 눌리면 about 메서드가 호출된다
self.ui.actionAbout_App.triggered.connect(self.about)
5. 실제 기존 파일 열기 기능 구현 함수
더보기
5-1. 폰트 선택 기능
def font_dialog(self):
# QFontDialog.getFont 는 두 개의 값을 반환한다
# 첫 번째 값 ok : 사용자가 다이얼로그에서 확인을 눌렀는지 여부
# 두 번째 값 font : 선택된 QFont 객체
ok, font = QFontDialog.getFont(
self.editor.font(), # 현재 에디터의 폰트를 기본값으로 사용
self, # 부모 위젯
"폰트 선택" # 다이얼로그 제목
)
# 사용자가 취소를 누른 경우는 적용하지 않고 바로 반환한다
if not ok:
return
# 현재 텍스트 커서를 가져온다
cursor = self.editor.textCursor()
# 문자 서식 객체를 하나 만든다
fmt = QTextCharFormat()
# 선택된 폰트 정보를 문자 서식에 설정한다
fmt.setFont(font)
if cursor.hasSelection():
# 텍스트가 선택되어 있다면 해당 선택 영역에만 새로운 폰트를 적용한다
cursor.mergeCharFormat(fmt)
else:
# 선택 영역이 없다면 이후 입력될 텍스트의 기본 문자 서식을 변경한다
current_fmt = self.editor.currentCharFormat()
current_fmt.merge(fmt)
self.editor.setCurrentCharFormat(current_fmt)
- getFont 의 반환 순서가 PySide6 에서는 ok, font 이라는 점
- QTextCharFormat 을 사용해서 선택된 영역에만 폰트를 적용할 수 있다는 점
- 선택이 없을 때는 currentCharFormat 을 변경해 이후 문자의 서식을 바꾼다는 점
5-2. 글자 색 선택 기능
def color_dialog(self):
# QColorDialog.getColor 는 사용자가 선택한 QColor 를 반환한다
# 두 번째 인자는 부모 위젯, 세 번째 인자는 다이얼로그 제목이다
color = QColorDialog.getColor(
self.editor.textColor(), # 현재 텍스트 색상을 기본값으로 사용
self,
"글자 색 선택"
)
# 사용자가 취소를 누르면 invalid 색상이 반환되므로 isValid 로 체크한다
if not color.isValid():
return
# setTextColor 는 선택된 영역이 있으면 그 부분에만 적용하고
# 선택된 영역이 없으면 이후에 입력될 텍스트 색상에 영향을 준다
self.editor.setTextColor(color)
- 색상 다이얼로그에서 취소했는지 여부는 QColor.isValid 로 판단
- setTextColor 는 선택 영역에 즉시 반영되며, 선택이 없으면 커서 이후 텍스트 색상이 변경됨
5-3. 도움말(About) 기능
def about(self):
# QMessageBox.about 은 간단한 정보 창을 쉽게 띄우는 정적 메서드다
# 첫 번째 인자 self : 부모 창
# 두 번째 인자 : 제목
# 세 번째 인자 : 내용
QMessageBox.about(
self,
"About Notepad",
"PySide6 기반 메모장 예제입니다.\n\n"
"이 예제에서는 폰트, 색상, 인쇄, PDF 내보내기,\n"
"문자 스타일 및 문단 정렬 기능을 연습할 수 있습니다."
)
- 별도의 다이얼로그 클래스를 만들지 않고도 간단한 안내창을 만들 수 있다
- 텍스트 안에 줄바꿈을 넣어 여러 줄 설명을 보여 줄 수 있다
6. 실행
7.학습 주요 포인트
더보기
QFontDialog.getFont 사용법
- PySide6 에서는 반환 순서가 ok, font 이라는 점
- ok 가 참일 때만 선택한 폰트를 적용해야 안전하다.
QTextCharFormat 을 이용한 선택 영역 서식 적용
- cursor.charFormat 만 수정하는 것으로는 범위 적용이 되지 않는다.
- cursor.mergeCharFormat 을 사용하면 선택된 영역에만 서식을 병합할 수 있다.
- 선택 영역이 없을 때는 currentCharFormat 을 변경해 이후 입력될 텍스트의 기본 스타일을 바꾼다.
QColorDialog.getColor 와 색상 유효성 검사
- 사용자가 다이얼로그에서 취소를 누른 경우를 처리해야 한다.
- color.isValid 로 검사하여 유효한 색상일 때만 적용한다.
setTextColor 의 동작 방식
- 선택된 텍스트가 있을 때와 없을 때의 동작이 다르다는 점이 중요하다.
- 선택이 있으면 그 부분만 변경, 없으면 커서 이후로 입력되는 글자에 영향을 준다.
QMessageBox.about 을 이용한 간단 도움말
- 별도 윈도우 클래스를 만들지 않고도 빠르게 프로그램 정보를 보여 줄 수 있다.
- 제목과 내용만 넘겨주면 깔끔한 정보 창이 만들어진다.
단계별 완성 파일




