Auf dieser Seite

Qt Print Support

Das Modul „ Qt Print Support “ bietet umfassende plattformübergreifende Unterstützung für den Druck. Mithilfe der Drucksysteme der jeweiligen Plattform können Qt-Anwendungen auf angeschlossene Drucker sowie über Netzwerke auf Remote-Drucker drucken. Das Drucksystem unterstützt zudem die Erstellung von PDF-Dateien und bildet damit die Grundlage für grundlegende Funktionen zur Berichterstellung.

Qt Print Support ist nicht verfügbar unter:

  • Android™
  • iOS

Klassen zur Unterstützung des Druckvorgangs

Die folgenden Klassen unterstützen die Auswahl und Einrichtung von Druckern sowie die Druckausgabe.

QAbstractPrintDialog

Basisimplementierung für Druckdialoge zur Konfiguration von Druckern

QPageRanges

Stellt eine Sammlung von Seitenbereichen dar

QPageSetupDialog

Konfigurationsdialog für die seitenbezogenen Optionen eines Druckers

QPrintDialog

Dialog zur Festlegung der Druckerkonfiguration

QPrintEngine

Definiert eine Schnittstelle für die Interaktion von QPrinter mit einem bestimmten Drucksubsystem

QPrintPreviewDialog

Dialog zur Vorschau und Konfiguration von Seitenlayouts für die Druckerausgabe

QPrintPreviewWidget

Widget zur Vorschau von Seitenlayouts für die Druckausgabe

QPrinter

Zeichengerät, das auf einem Drucker zeichnet

QPrinterInfo

Bietet Zugriff auf Informationen zu vorhandenen Druckern

Zeichengeräte und Drucken

Drucker werden durch „ QPrinter “ dargestellt, ein Zeichengerät, das druckerspezifische Funktionen bereitstellt, wie beispielsweise die Unterstützung mehrerer Seiten und beidseitiger Ausgabe. Daher erfolgt das Drucken mithilfe eines „ QPainter “, um auf eine Reihe von Seiten zu zeichnen, genauso wie Sie auf ein benutzerdefiniertes Widget oder Bild zeichnen würden.

Erstellen eines QPrinter

Obwohl „ QPrinter “-Objekte ohne Benutzereingabe erstellt und konfiguriert werden können, erfolgt der Druckvorgang häufig auf Anfrage des Benutzers; beispielsweise wenn der Benutzer in einer GUI-Anwendung den Menüpunkt „ File|Print... “ auswählt. In solchen Fällen wird ein neu erstelltes „ QPrinter “-Objekt an den „ QPrintDialog “ übergeben, sodass der Benutzer den zu verwendenden Drucker, das Papierformat und andere Druckeigenschaften festlegen kann.

        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;

Es ist auch möglich, bestimmte Standardeigenschaften festzulegen, indem das ` QPrinter ` angepasst wird, bevor es an den Druckdialog übergeben wird. Beispielsweise können Anwendungen, die Reportstapel zum Drucken generieren, ` QPrinter ` standardmäßig auf ` write to a local file ` statt auf einen Drucker setzen.

Zeichnen auf einer Seite

Sobald ein ` QPrinter `-Objekt erstellt und konfiguriert wurde, kann ein ` QPainter ` verwendet werden, um Zeichnungsvorgänge darauf auszuführen. Wir können einen ` ` auf folgende Weise erstellen und konfigurieren:

    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();

Da das ` QPrinter ` mit einer leeren Seite beginnt, müssen wir die Funktion ` newPage()` erst nach dem Zeichnen jeder einzelnen Seite aufrufen – mit Ausnahme der letzten Seite.

Das Dokument wird an den Drucker gesendet oder in eine lokale Datei geschrieben, wenn wir „ end()“ aufrufen.

Koordinatensysteme

QPrinter bietet Funktionen, mit denen Informationen über die Abmessungen des Papiers (das Papierrechteck) und die Abmessungen des bedruckbaren Bereichs (das Seitenrechteck) abgerufen werden können. Diese werden in logischen Gerätekoodinaten angegeben, die von den vom Gerät selbst verwendeten physikalischen Koodinaten abweichen können, was darauf hinweist, dass der Drucker in der Lage ist, Text und Grafiken mit einer (typischerweise höheren) Auflösung wiederzugeben als das Display des Benutzers.

Obwohl wir die Umrechnung zwischen logischen und physikalischen Koordinaten nicht selbst vornehmen müssen, müssen wir dennoch Transformationen auf Zeichenoperationen anwenden, da die zum Zeichnen auf dem Bildschirm verwendeten Pixelmaße für die höheren Auflösungen typischer Drucker oft zu klein sind.

Koordinatensysteme von Drucker und Painter

Die Funktionen ` paperRect()` und ` pageRect()` liefern Informationen über die Größe des zum Drucken verwendeten Papiers und den Bereich darauf, der bedruckt werden kann.

Das von ` pageRect()` zurückgegebene Rechteck liegt in der Regel innerhalb des von ` paperRect()` zurückgegebenen Rechtecks. Sie müssen die Positionen und Größen dieser Bereiche nicht berücksichtigen, wenn Sie ein „ QPainter “ mit einem „ QPrinter “ als zugrunde liegendem Zeichenobjekt verwenden; der Ursprung des Koordinatensystems des Zeichnerobjekts stimmt mit der oberen linken Ecke des Seitenrechtecks überein, und Zeichenvorgänge werden auf die Grenzen des zeichnungsfähigen Teils der Seite beschränkt.

Veranschaulichung, wie die Breite und Höhe von `paperRect()` und `pageRect()` bestimmt werden

Das Zeichensystem verwendet beim Zeichnen von Text automatisch die richtigen Gerätemetriken. Wenn Sie jedoch Text anhand von Informationen aus den Schriftartmetriken positionieren müssen, müssen Sie sicherstellen, dass das Druckgerät beim Erstellen von „ QFontMetrics “- und „ QFontMetricsF “-Objekten angegeben wird, oder dass jedes verwendete „ QFont “ mit der Konstruktorform erstellt wird, die ein „ QPaintDevice “-Argument akzeptiert.

Widgets drucken

Um ein Widget zu drucken, können Sie die Funktion ` QWidget::render()` verwenden. Wie bereits erwähnt, ist die Auflösung des Druckers in der Regel höher als die Bildschirmauflösung, sodass Sie den Painter skalieren müssen. Möglicherweise möchten Sie das Widget auch auf der Seite positionieren. Das folgende Codebeispiel zeigt, wie dies aussehen könnte.

        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);

Dadurch wird das Widget auf der Seite zentriert und so skaliert, dass es auf die Seite passt.

Drucken aus komplexen Widgets

Bestimmte Widgets, wie beispielsweise „ QTextEdit “ und „ QGraphicsView “, zeigen umfangreiche Inhalte an, die in der Regel von Instanzen anderer Klassen verwaltet werden, wie beispielsweise „ QTextDocument “ und „ QGraphicsScene “. Daher sind es meist diese Klassen zur Inhaltsverwaltung, die Druckfunktionen bereitstellen – entweder über eine Funktion, mit der die gesamte Aufgabe ausgeführt werden kann, oder über eine Funktion, die ein vorhandenes „ QPainter “-Objekt akzeptiert. Einige Widgets bieten Komfortfunktionen, um zugrunde liegende Druckfunktionen zugänglich zu machen, wodurch vermieden wird, dass der Inhaltshandler nur zum Aufruf einer einzigen Funktion abgerufen werden muss.

Die folgende Tabelle zeigt, welche Klasse und welche Funktion für den Druck aus einer Auswahl verschiedener Widgets zuständig sind. Bei Widgets, die keine Druckfunktionen direkt bereitstellen, können die Inhaltsverarbeitungsklassen, die diese Funktionen enthalten, über eine Funktion in der API des entsprechenden Widgets abgerufen werden.

QTextEdit benötigt ein ` QPrinter ` anstelle eines ` QPainter `, da es Informationen über die konfigurierten Seitenabmessungen verwendet, um Seitenumbrüche an den am besten geeigneten Stellen in gedruckten Dokumenten einzufügen.

Verwendung des Moduls

Die Verwendung eines Qt-Moduls erfordert die Verknüpfung mit der Modulbibliothek, entweder direkt oder über andere Abhängigkeiten. Mehrere Build-Tools bieten hierfür spezielle Unterstützung, darunter CMake und qmake.

Erstellen mit CMake

Verwenden Sie den Befehl „ find_package() “, um die benötigten Modulkomponenten im Paket „ Qt6 “ zu finden:

find_package(Qt6 REQUIRED COMPONENTS PrintSupport)
target_link_libraries(mytarget PRIVATE Qt6::PrintSupport)

Siehe auch die Übersicht „Erstellen mit CMake “.

Erstellen mit qmake

Um das Modul für den Build mit qmake zu konfigurieren, fügen Sie das Modul als Wert der Variablen „ QT “ in die .pro-Datei des Projekts ein:

QT += printsupport

Modulentwicklung

Unter „ Qt Print Support “ sind wichtige Änderungen an der Modul-API und der Funktionalität aufgeführt, die für die Qt-6-Serie von Qt vorgenommen wurden.

Lizenzen und Marken

Das Modul „ Qt Print Support “ ist unter kommerziellen Lizenzen von The Qt Company erhältlich. Darüber hinaus ist es unter freien Softwarelizenzen verfügbar: der GNU Lesser General Public License, Version 3, oder der GNU General Public License, Version 2. Weitere Informationen finden Sie unter Qt-Lizenzierung.

Bitte beachten Sie, dassAdobe® Einschränkungen hinsichtlich der Verwendung seiner Marken (einschließlich Logos) in Verbindung mit PDF auferlegt, z. B. „Adobe PDF“. Richtlinien hierzu finden Sie unter 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.