Qt Print Support
Qt Print Support 모듈은 인쇄에 대한 광범위한 크로스 플랫폼 지원을 제공합니다. 각 플랫폼의 인쇄 시스템을 사용하여 Qt 애플리케이션은 연결된 프린터로 인쇄하거나 네트워크를 통해 원격 프린터로 인쇄할 수 있습니다. 또한 이 인쇄 시스템은 PDF 파일 생성을 지원하여 기본적인 보고서 생성 기능을 위한 기반을 마련합니다.
Qt Print Support 다음에서는 사용할 수 없습니다:
- Android™
- iOS
인쇄를 지원하는 클래스
다음 클래스는 프린터 선택 및 설정과 인쇄 출력을 지원합니다.
프린터 구성을 위해 사용되는 인쇄 대화 상자의 기본 구현 | |
페이지 범위의 모음을 나타냅니다 | |
프린터의 페이지 관련 옵션을 설정하는 구성 대화 상자 | |
프린터 구성을 지정하기 위한 대화 상자 | |
QPrinter가 특정 인쇄 하위 시스템과 상호 작용하는 방식을 정의하는 인터페이스 | |
프린터 출력용 페이지 레이아웃을 미리 보고 구성하기 위한 대화 상자 | |
프린터 출력용 페이지 레이아웃을 미리 볼 수 있는 위젯 | |
프린터에 출력하는 페인트 장치 | |
기존 프린터에 대한 정보에 접근할 수 있게 해줍니다 |
페인트 장치 및 인쇄
프린터는 ` QPrinter`로 표현되며, 이는 여러 페이지 및 양면 출력 지원과 같은 인쇄에 특화된 기능을 제공하는 페인트 장치입니다. 따라서 인쇄는 사용자 정의 위젯이나 이미지에 그리는 것과 동일한 방식으로 일련의 페이지에 그리기 위해 ` QPainter `를 사용하는 과정을 포함합니다.
QPrinter 생성
QPrinter 객체는 사용자 입력 없이도 생성 및 설정될 수 있지만, 인쇄는 대개 사용자의 요청에 따라 수행됩니다. 예를 들어, 사용자가 GUI 애플리케이션에서 File|Print... 메뉴 항목을 선택할 때와 같습니다. 이러한 경우, 새로 생성된 QPrinter 객체가 QPrintDialog 에 전달되어 사용자가 사용할 프린터, 용지 크기 및 기타 인쇄 속성을 지정할 수 있게 합니다.
QPrinter printer;
QPrintDialog dialog(&printer, this);
dialog.setWindowTitle(tr("Print Document"));
if (editor->textCursor().hasSelection())
dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection);
if (dialog.exec() != QDialog::Accepted)
return;또한 인쇄 대화 상자에 전달되기 전에 ` QPrinter `를 수정하여 특정 기본 속성을 설정할 수도 있습니다. 예를 들어, 인쇄를 위해 보고서 배치를 생성하는 애플리케이션은 ` QPrinter `를 프린터가 아닌 ` write to a local file `로 기본 설정할 수 있습니다.
페이지에 그리기
QPrinter 객체가 생성되고 설정되면, QPainter 를 사용하여 해당 객체에 그리기 작업을 수행할 수 있습니다. 페인터는 다음과 같은 방식으로 생성하고 설정할 수 있습니다:
QPrinter printer(QPrinter::HighResolution);
printer.setOutputFileName("print.ps");
QPainter painter;
painter.begin(&printer);
for (int page = 0; page < numberOfPages; ++page) {
// Use the painter to draw on the page.
if (page != lastPage)
printer.newPage();
}
painter.end();QPrinter 는 빈 페이지로 시작하므로, 마지막 페이지를 제외하고는 각 페이지를 그리는 후마다 newPage() 함수를 호출하기만 하면 됩니다.
end()를 호출하면 문서가 프린터로 전송되거나 로컬 파일에 기록됩니다.
좌표계
QPrinter 는 용지의 크기(용지 직사각형)와 인쇄 가능 영역의 크기(페이지 직사각형)에 대한 정보를 얻는 데 사용할 수 있는 함수들을 제공합니다. 이 정보는 논리적 장치 좌표로 제공되며, 이는 장치 자체가 사용하는 물리적 좌표와 다를 수 있는데, 이는 프린터가 사용자의 디스플레이보다 (일반적으로 더 높은) 해상도로 텍스트와 그래픽을 렌더링할 수 있음을 나타냅니다.
논리적 좌표와 물리적 좌표 간의 변환을 직접 처리할 필요는 없지만, 화면에 그리는 데 사용되는 픽셀 크기는 일반적인 프린터의 높은 해상도에 비해 너무 작은 경우가 많기 때문에 그리기 작업에 변환을 적용해야 합니다.
| 프린터 및 페인터 좌표계 paperRect() 및 pageRect() 함수는 인쇄에 사용되는 용지의 크기와 그 위에서 그리기 가능한 영역에 대한 정보를 제공합니다. pageRect()가 반환하는 사각형은 대개 paperRect()가 반환하는 사각형 안에 위치합니다. QPainter 를 사용하고 기본 그리기 장치로 QPrinter 를 지정할 때는 이러한 영역의 위치와 크기를 고려할 필요가 없습니다. 페인터의 좌표계 원점은 페이지 사각형의 왼쪽 상단 모서리와 일치하며, 그리기 작업은 페이지의 그리기 가능한 부분의 경계 내에서만 수행됩니다. | ![]() |
페인트 시스템은 텍스트를 그릴 때 자동으로 올바른 장치 메트릭을 사용하지만, 폰트 메트릭에서 얻은 정보를 사용하여 텍스트의 위치를 지정해야 하는 경우, ` QFontMetrics ` 및 ` QFontMetricsF ` 객체를 생성할 때 인쇄 장치가 지정되어 있는지 확인하거나, 사용되는 각 ` QFont `가 ` QPaintDevice ` 인자를 받는 생성자 형식을 사용하여 생성되도록 해야 합니다.
위젯 인쇄
위젯을 인쇄하려면 QWidget::render() 함수를 사용할 수 있습니다. 앞서 언급했듯이 프린터의 해상도는 일반적으로 화면 해상도보다 높으므로, 페인터의 크기를 조정해야 합니다. 또한 위젯을 페이지에 특정 위치에 배치하고 싶을 수도 있습니다. 다음 코드 예제는 이를 어떻게 구현할 수 있는지 보여줍니다.
QPainter painter;
painter.begin(&printer);
const auto pageLayout = printer.pageLayout();
const auto pageRect = pageLayout.paintRectPixels(printer.resolution());
const auto paperRect = pageLayout.fullRectPixels(printer.resolution());
double xscale = pageRect.width() / double(myWidget->width());
double yscale = pageRect.height() / double(myWidget->height());
double scale = qMin(xscale, yscale);
painter.translate(pageRect.x() + paperRect.width() / 2.,
pageRect.y() + paperRect.height() / 2.);
painter.scale(scale, scale);
painter.translate(-myWidget->width() / 2., -myWidget->height() / 2.);
myWidget->render(&painter);이 코드는 위젯을 페이지 중앙에 배치하고 페이지 크기에 맞게 크기를 조정합니다.
복잡한 위젯에서 인쇄하기
QTextEdit 및 QGraphicsView 과 같은 특정 위젯은 일반적으로 QTextDocument 및 QGraphicsScene 과 같은 다른 클래스의 인스턴스에 의해 관리되는 풍부한 콘텐츠를 표시합니다. 결과적으로, 이러한 콘텐츠 처리 클래스들이 대개 인쇄 기능을 제공하며, 이는 전체 작업을 수행하는 데 사용할 수 있는 함수를 통해서든, 기존 QPainter 객체를 받아들이는 함수를 통해서든 이루어집니다. 일부 위젯은 기본 인쇄 기능을 노출하는 편의 함수를 제공하여, 단 하나의 함수를 호출하기 위해 콘텐츠 핸들러를 별도로 구할 필요가 없도록 합니다.
다음 표는 다양한 위젯 중에서 선택된 항목의 인쇄를 담당하는 클래스와 함수를 보여줍니다. 인쇄 기능을 직접 노출하지 않는 위젯의 경우, 해당 기능을 포함하는 콘텐츠 핸들러 클래스는 해당 위젯의 API에 있는 함수를 통해 얻을 수 있습니다.
| 위젯 | 인쇄 함수 | 수용 대상 |
|---|---|---|
| QGraphicsView | QGraphicsView::render() | QPainter |
| QSvgWidget | QSvgRenderer::render() | QPainter |
| QTextEdit | QTextDocument::print() | QPrinter |
| QTextLayout | QTextLayout::draw() | QPainter |
| QTextLine | QTextLine::draw() | QPainter |
QTextEdit 는 인쇄된 문서의 가장 적절한 위치에 페이지 나누기를 삽입하기 위해 구성된 페이지 치수에 대한 정보를 사용하기 때문에, QPainter 대신 QPrinter 를 필요로 합니다.
모듈 사용
Qt 모듈을 사용하려면 모듈 라이브러리에 직접 또는 다른 종속성을 통해 링크해야 합니다. CMake 및 qmake를 비롯한 여러 빌드 도구가 이를 위해 전용 지원을 제공합니다.
CMake를 사용한 빌드
find_package() 명령을 사용하여 Qt6 패키지 내에서 필요한 모듈 구성 요소를 찾으십시오:
find_package(Qt6 REQUIRED COMPONENTS PrintSupport)
target_link_libraries(mytarget PRIVATE Qt6::PrintSupport)CMake를 사용한 빌드 개요도 참조하십시오.
qmake를 사용한 빌드
qmake를 사용하여 모듈을 빌드하도록 구성하려면, 프로젝트의 .pro 파일에서 QT 변수의 값으로 해당 모듈을 추가하십시오:
QT += printsupport모듈의 진화
' Qt Print Support '에는 Qt 6 시리즈를 위해 모듈 API 및 기능에 적용된 주요변경 사항이 나열되어 있습니다.
라이선스 및 상표
Qt Print Support 모듈은 The Qt Company의 상용 라이선스에 따라 제공됩니다. 또한, 이 모듈은 GNU Lesser General Public License 버전 3 또는 GNU General Public License 버전 2와 같은 자유 소프트웨어 라이선스 하에서도 제공됩니다. 자세한 내용은 Qt 라이선스를 참조하십시오.
Adobe®는 PDF와 관련하여 자사의 상표(로고 포함) 사용에 제한을 두고 있습니다(예: "Adobe PDF"). 관련 지침은 www.adobe.com을 참조하십시오.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.
