9.7 프린트 미리보기
728x90

1. 목표
더보기
- 메뉴의 Print Preview 또는 툴바 아이콘을 클릭했을 때
인쇄하기 전에 미리 화면으로 결과를 확인할 수 있는 기능을 구현한다. - QPrinter, QPrintPreviewDialog, paintRequested 시그널과 슬롯 연결 패턴을 익힌다.
- 이미 구현된 프린트 기능(9.6)과 동일한 출력 경로를 사용하되
실제 프린터로 보내지 않고 미리보기 창에만 렌더링한다.
2. 전체 로직
더보기
# mainwindow.py
. . .
from PySide6.QtPrintSupport import QPrintPreviewDialog
class MainWindow(QMainWindow):
def __init__(self, parent=None):
. . .
self.ui.actionPrint_Preview.triggered.connect(self.preview_dialog)
. . .
def preview_dialog(self):
printer = QPrinter(QPrinter.PrinterMode.HighResolution)
preview = QPrintPreviewDialog(printer, self)
preview.paintRequested.connect(self.print_preview)
preview.exec()
def print_preview(self, printer: QPrinter):
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 + 주석 설명
더보기
# QPrintPreviewDialog
# 인쇄하기 전에 미리 화면으로 결과를 보여주는 다이얼로그
# 내부적으로 QPrinter 에 그려지는 내용을 캔버스에 렌더링한다
from PySide6.QtPrintSupport import QPrintPreviewDialog
9.6 프린트 기능에서 이미 QPrinter 를 사용했기 때문에
이번 단계에서는 QPrintPreviewDialog 를 추가로 이해하는 것이 핵심입니다.
4. 메뉴 액션과 슬롯 연결하기 (actionPrint_Preview↔ preview_dialog)
더보기


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.6 프린트
self.ui.actionPrint.triggered.connect(self.print_file)
# 9.7 프린트 미리보기 기능
# File 메뉴의 Print Preview 항목, 툴바 아이콘, 단축키는
# 모두 actionPrint_Preview 에 연결되어 있고
# 여기서 그 시그널을 preview_dialog 메서드에 연결한다
self.ui.actionPrint_Preview.triggered.connect(self.preview_dialog)
메뉴, 툴바, 단축키가 모두 preview_dialog 를 호출하게 됩니다.
5. 프린트 기능 구현 함수
더보기


5.1 미리보기 다이얼로그를 띄우는 함수

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_ 를 호출하는 흐름입니다.
5.2 미리보기에서 실제 내용을 그리는 함수

def print_preview(self, printer: QPrinter):
'''
QPrintPreviewDialog 의 paintRequested 시그널이 발생할 때
넘겨주는 QPrinter 객체에 실제 문서를 그리는 함수
'''
# QTextEdit 의 내용을 QPrinter 에 출력한다
# 프린트 기능에서 사용하는 것과 동일한 경로를 사용한다
# print_ 메서드는 QPrinter 설정에 맞게 페이지를 렌더링한다
self.editor.print_(printer)
프린트 기능과 프린트 미리보기 기능이
같은 출력 경로를 공유한다는 것입니다.
- Print 메뉴
→ QPrinter → QTextEdit.print_ → 실제 프린터 - Print Preview 메뉴
→ QPrintPreviewDialog 내부의 QPrinter → QTextEdit.print_ → 미리보기 창
이 구조 덕분에
화면 미리보기와 실제 인쇄 결과가 최대한 동일하게 유지됩니다.
6. 실행 테스트
7.학습 주요 포인트
더보기
1 QPrintDialog 와 QPrintPreviewDialog 비교
- QPrintDialog
사용자가 인쇄를 승인하면 실제 프린터로 출력이 나간다. - QPrintPreviewDialog
같은 QPrinter 를 사용하지만 프린터로 보내지 않고
화면에 미리 렌더링해 보여준다.
2 paintRequested 시그널의 의미
- 미리보기 창이 그려질 때마다 발생하는 시그널이다.
- print_preview 슬롯이 호출되고
이 안에서 QTextEdit.print_ 를 호출해 QPrinter 에 내용을 그린다. - 사용자가 확대 축소, 페이지 넘김 등을 할 때도
이 시그널이 여러 번 호출될 수 있다.
3 출력 경로의 재사용
- 프린트 기능과 미리보기 기능이
같은 QTextEdit.print_ 로직을 공유한다는 점이 중요하다. - 한 곳에서 출력 로직을 고치면
프린트와 미리보기 결과가 함께 수정된다.
유지보수와 테스트 측면에서 큰 장점이다.
4 QPrinter 설정과 일관성
- 미리보기에서도 HighResolution 모드를 사용하면
실제 인쇄 품질과 비슷한 결과를 화면에서 확인할 수 있다. - 나중에 용지 크기, 방향, 여백 등을 추가로 설정하면
프린트와 프린트 미리보기가 동시에 영향을 받는다.
5 단계 간 연계성
- 9.6 에서 배운 프린트 기능 위에
9.7 미리보기 기능이 얹히는 구조이다. - 학생들에게
프린트 → 프린트 미리보기 → PDF 내보내기
순으로 모두 QPrinter 기반 흐름이라는 점을
반복해서 보여주면 Qt 의 출력 시스템을 자연스럽게 이해하게 된다.
단계별 완성 파일

