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 의 출력 시스템을 자연스럽게 이해하게 된다.

 

단계별 완성 파일