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 을 이용한 간단 도움말

  • 별도 윈도우 클래스를 만들지 않고도 빠르게 프로그램 정보를 보여 줄 수 있다.
  • 제목과 내용만 넘겨주면 깔끔한 정보 창이 만들어진다.

 

단계별 완성 파일