728x90

1. 목표
더보기
- File 메뉴의 Print 항목이나 툴바 아이콘을 눌렀을 때
운영체제의 인쇄 대화상자를 띄우고
선택된 프린터로 QTextEdit 의 내용을 출력할 수 있도록 한다. - QPrinter, QPrintDialog, QTextEdit.print_ 를 사용하는
PySide6 표준 패턴을 익힌다. - 파이썬 open 같은 기본 파일 함수는 사용하지 않고
Qt 가 제공하는 프린트 지원 클래스를 사용한다.
2. 전체 로직
더보기
# mainwindow.py
. . .
from PySide6.QtWidgets import QDialog
from PySide6.QtPrintSupport import QPrinter, QPrintDialog
class MainWindow(QMainWindow):
def __init__(self, parent=None):
. . .
self.ui.actionPrint.triggered.connect(self.print_file)
. . .
def print_file(self):
printer = QPrinter(QPrinter.PrinterMode.HighResolution)
dialog = QPrintDialog(printer, self)
if dialog.exec() == QDialog.DialogCode.Accepted:
self.editor.print_(printer)
# 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 + 주석 설명
더보기
# QPrintDialog 의 exec 결과를 비교할 때 DialogCode 사용
from PySide6.QtWidgets import QDialog
# QPrinter
# 실제 출력 장치(프린터)를 표현하는 클래스
# 해상도 모드, 출력 용지, 방향, 용지 크기 등을 설정할 수 있다
#
# QPrintDialog
# 운영체제의 인쇄 대화상자를 띄우는 클래스
# 사용자가 프린터, 페이지 범위, 복사 수 등을 선택할 수 있다
from PySide6.QtPrintSupport import QPrinter, QPrintDialog
4. 메뉴 액션과 슬롯 연결하기 (actionPrint↔ print_file)
더보기


class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# 텍스트 편집 위젯에 자주 접근하므로 별칭을 만들어 둔다
self.editor = self.ui.textEdit
# 9.6 프린트 기능
# 메뉴 File 의 Print 항목, 툴바의 프린트 아이콘, 단축키 Ctrl+P 는
# 모두 actionPrint 에 연결되어 있고
# 여기서 그 시그널을 print_file 메서드에 연결한다
self.ui.actionPrint.triggered.connect(self.print_file)
메뉴, 툴바, 단축키가 모두 같은 인쇄 로직을 공유하게 됩니다.
5. 프린트 기능 구현 함수
더보기


def print_file(self):
'''
9.6 프린트 기능
QPrinter 와 QPrintDialog 를 사용해
현재 QTextEdit 의 내용을 실제 프린터로 보낸다
'''
# 1 인쇄용 QPrinter 객체를 생성한다
# HighResolution 모드는 고해상도로 렌더링하도록 설정하는 옵션이다
printer = QPrinter(QPrinter.PrinterMode.HighResolution)
# 2 인쇄 대화상자를 생성한다
# 두 번째 인자로 부모 위젯(self) 을 넘겨서
# 현재 창 위에 모달로 뜨도록 한다
dialog = QPrintDialog(printer, self)
# 3 dialog.exec 는 사용자가 대화상자에서 어떤 버튼을 눌렀는지 반환한다
# DialogCode.Accepted 인 경우에는 사용자가 인쇄를 허용한 것이다
if dialog.exec() == QDialog.DialogCode.Accepted:
# 4 QTextEdit 의 내용을 QPrinter 로 출력한다
# PySide6 에서는 print 가 아닌 print_ 메서드를 사용한다
# printer 에 설정된 프린터, 용지, 방향에 맞게 내용이 전송된다
self.editor.print_(printer)
QPrinter 를 하나 만들고, QPrintDialog 에 넘긴 뒤
사용자가 인쇄를 승인했을 때만 textEdit.print_ 를 호출하는 흐름입니다.
6. 실행 테스트
더보기



1 텍스트 입력

- 중앙의 QTextEdit 에 테스트용 문장을 여러 줄 입력한다.
예시
프린트 테스트입니다
PySide6 메모장 예제입니다
2 File 메뉴에서 Print 선택

- 메뉴바에서 File → Print 를 클릭하거나
툴바의 프린트 아이콘을 클릭하거나
단축키 Ctrl+P 를 눌러도 된다.
3 인쇄 대화상자 확인

- 운영체제의 기본 인쇄 대화상자가 나타나는지 확인한다.
- 실제 프린터가 없다면 PDF 프린터, XPS, 가상 프린터 등을 선택해도 된다.
5 인쇄 승인
- 인쇄 대화상자에서 확인 혹은 Print 를 눌러 인쇄를 시작한다.
- 선택한 프린터로 출력물이 전송되는지 확인한다.
6 취소 동작 확인
- 다시 Print 를 눌러 대화상자를 띄운 뒤, 이번에는 취소를 눌러본다.
- 이때는 QTextEdit.print_ 가 호출되지 않으므로
프린터로 아무 것도 전송되지 않아야 한다.
7.학습 주요 포인트
더보기
1 프린트 기능의 기본 구성 요소
- QPrinter 출력 대상
- QPrintDialog 사용자에게 프린터와 옵션을 선택받는 UI
- QTextEdit.print_ 문서 내용을 프린터로 보내는 메서드
2 QPrinter 의 역할 이해
- PrinterMode.HighResolution 처럼 출력 품질을 조정할 수 있고
- 나중에 페이지 방향, 용지 크기, 여백 등을 세밀하게 설정하는 API 도 제공한다.
3 QPrintDialog 와 DialogCode
- dialog.exec 가 반환하는 값으로
사용자가 인쇄를 진행할지, 취소할지를 판단한다. - Accepted 인 경우에만 실제 프린트 호출을 해야
의도치 않은 인쇄를 막을 수 있다.
4 QTextEdit.print_ 사용 이유
- PySide6 에서는 print 라는 이름 대신 print_ 메서드를 사용한다.
- QTextEdit 이 내부의 QTextDocument 를 QPrinter 에 바로 그려주므로
별도의 페이지 계산 로직 없이 단순하게 인쇄 기능을 추가할 수 있다.
5 GUI 구조와의 연결
- form.ui 에서 이미 actionPrint 가 메뉴와 툴바, 단축키에 묶여 있으며
파이썬 코드에서는 이 액션을 print_file 슬롯에만 연결하면 된다. - 이 패턴은 프린트 미리보기, PDF 내보내기, 종료 기능 등
다른 액션들과 슬롯을 연결할 때도 그대로 반복된다.
6 다음 단계와의 연계
- 9.7 프린트 미리보기 기능은
QPrintPreviewDialog 와 QPrinter 를 사용해서
실제 인쇄 전에 화면으로 렌더링해 보는 기능이다. - 9.8 PDF 내보내기 기능은
QPrinter 의 출력 포맷을 PdfFormat 으로 바꾸고
파일로 저장하는 방식으로 구현된다. - 지금 단계에서 배운 QPrinter 기반 출력 흐름이
이후 두 단계의 기반이 된다.
단계별 완성 파일