Qt Print Support
Das Modul Qt Print Support bietet umfangreiche plattformübergreifende Unterstützung für das Drucken. Unter Verwendung der Drucksysteme auf jeder Plattform können Qt-Anwendungen auf angeschlossenen Druckern und über Netzwerke auf entfernten Druckern drucken. Das Drucksystem unterstützt auch die Erzeugung von PDF-Dateien und bietet damit die Grundlage für grundlegende Funktionen zur Berichterstellung.
Qt Print Support ist auf iOS nicht verfügbar.
Klassen, die das Drucken unterstützen
Die folgenden Klassen unterstützen das Auswählen und Einrichten von Druckern und die Druckausgabe.
Basisimplementierung für Druckdialoge, die zur Konfiguration von Druckern verwendet werden | |
Stellt eine Sammlung von Seitenbereichen dar | |
Konfigurationsdialog für die seitenbezogenen Optionen eines Druckers | |
Dialog zum Festlegen der Druckerkonfiguration | |
Definiert eine Schnittstelle für die Interaktion von QPrinter mit einem bestimmten Druck-Subsystem | |
Dialog zur Vorschau und Konfiguration von Seitenlayouts für die Druckerausgabe | |
Widget für die Vorschau von Seitenlayouts für die Druckausgabe | |
Malgerät, das auf einem Drucker malt | |
Ermöglicht den Zugriff auf Informationen über vorhandene Drucker |
Malgeräte und Drucken
Drucker werden durch QPrinter repräsentiert, ein Malgerät, das spezielle Funktionen für den Druck bietet, z. B. Unterstützung für mehrere Seiten und doppelseitige Ausgabe. Beim Drucken wird daher ein QPainter verwendet, um auf eine Reihe von Seiten zu malen, so wie man auf ein benutzerdefiniertes Widget oder Bild malen würde.
Erstellen eines QPrinters
Obwohl QPrinter -Objekte ohne Benutzereingabe erstellt und eingerichtet werden können, wird das Drucken oft auf Anforderung des Benutzers durchgeführt, z. B. wenn der Benutzer den Menüpunkt File|Print... in einer GUI-Anwendung auswählt. In solchen Fällen wird ein neu konstruiertes QPrinter Objekt an QPrintDialog übergeben, das es dem Benutzer ermöglicht, den zu verwendenden Drucker, das Papierformat und andere Druckeigenschaften anzugeben.
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 man das QPrinter modifiziert, bevor es an den Druckdialog übergeben wird. Beispielsweise können Anwendungen, die Stapel von Berichten zum Drucken erzeugen, die QPrinter standardmäßig auf write to a local file statt auf einen Drucker einstellen.
Malen auf einer Seite
Sobald ein QPrinter Objekt konstruiert und eingerichtet wurde, kann ein QPainter verwendet werden, um Malvorgänge darauf auszuführen. Wir können einen Painter auf die folgende Weise konstruieren und einrichten:
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 QPrinter mit einer leeren Seite beginnt, brauchen wir die Funktion newPage() nur nach dem Zeichnen jeder Seite aufzurufen, 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 man Informationen über die Abmessungen des Papiers (das Papierrechteck) und die Abmessungen des bedruckbaren Bereichs (das Seitenrechteck) erhalten kann. Diese werden in logischen Gerätekoordinaten angegeben, die sich von den physischen Koordinaten des Geräts selbst unterscheiden können, was darauf hinweist, dass der Drucker in der Lage ist, Text und Grafiken mit einer (in der Regel höheren) Auflösung als das Display des Benutzers darzustellen.
Obwohl wir die Konvertierung zwischen logischen und physischen Koordinaten nicht selbst vornehmen müssen, müssen wir dennoch Transformationen auf Malvorgänge anwenden, da die Pixelmaße, die zum Zeichnen auf dem Bildschirm verwendet werden, oft zu klein für die höheren Auflösungen typischer Drucker sind.
Koordinatensysteme für Drucker und Zeichner Die Funktionen paperRect() und pageRect() liefern Informationen über die Größe des zum Drucken verwendeten Papiers und den darauf befindlichen Bereich, auf den gemalt werden kann. Das von pageRect() zurückgegebene Rechteck liegt normalerweise innerhalb des von paperRect() zurückgegebenen Rechtecks. Sie brauchen die Positionen und Größen dieser Bereiche nicht zu berücksichtigen, wenn Sie ein QPainter mit einem QPrinter als zugrundeliegendes Malgerät verwenden; der Ursprung des Koordinatensystems des Malers fällt mit der linken oberen Ecke des Seitenrechtecks zusammen, und die Malvorgänge werden auf die Grenzen des zeichenbaren Teils der Seite beschränkt. | ![]() |
Das Malsystem verwendet beim Malen von Text automatisch die korrekten Gerätemetriken, aber wenn Sie Text anhand von Informationen positionieren müssen, die Sie aus Schriftmetriken erhalten haben, müssen Sie sicherstellen, dass das Druckgerät angegeben wird, wenn Sie die Objekte QFontMetrics und QFontMetricsF konstruieren, oder sicherstellen, dass jedes verwendete QFont mit der Form des Konstruktors konstruiert wird, die ein QPaintDevice Argument akzeptiert.
Drucken von Widgets
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, so dass 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 kann.
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 z. B. QTextEdit und QGraphicsView, zeigen umfangreiche Inhalte an, die in der Regel durch Instanzen anderer Klassen, wie z. B. QTextDocument und QGraphicsScene, verwaltet werden. Infolgedessen sind es diese Klassen zur Handhabung von Inhalten, die in der Regel die Druckfunktionalität bereitstellen, entweder über eine Funktion, die zur Ausführung der gesamten Aufgabe verwendet werden kann, oder über eine Funktion, die ein vorhandenes QPainter Objekt akzeptiert. Einige Widgets stellen Komfortfunktionen zur Verfügung, um die zugrundeliegenden Druckfunktionen freizulegen, so dass es nicht notwendig ist, den Content-Handler nur für den Aufruf einer einzelnen Funktion zu erhalten.
Die folgende Tabelle zeigt, welche Klasse und Funktion für das Drucken von einer Auswahl verschiedener Widgets verantwortlich ist. Für Widgets, die die Druckfunktionalität nicht direkt anbieten, können die Inhaltsbehandlungsklassen, die diese Funktionalität enthalten, über eine Funktion in der API des entsprechenden Widgets abgerufen werden.
Widget | Druckfunktion | Akzeptiert |
---|---|---|
QGraphicsView | QGraphicsView::render() | QPainter |
QSvgWidget | QSvgRenderer::rendern() | QPainter |
QTextEdit | QTextDocument::print() | QPrinter |
QTextLayout | QTextLayout::draw() | QPainter |
QTextLine | QTextLine::draw() | QPainter |
QTextEdit benötigt eine QPrinter anstelle einer QPainter, da es Informationen über die konfigurierten Seitenabmessungen verwendet, um Seitenumbrüche an den geeignetsten Stellen in gedruckten Dokumenten einzufügen.
Verwendung des Moduls
Die Verwendung eines Qt-Moduls erfordert eine 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.
Bauen 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 Bauen mit CMake.
Bauen mit qmake
Um das Modul für die Erstellung mit qmake zu konfigurieren, fügen Sie das Modul als Wert der Variable QT
in der .pro-Datei des Projekts hinzu:
QT += printsupport
Modul Evolution
Änderungen an Qt Print Support listet wichtige Änderungen an der Modul-API und -Funktionalität auf, die für die Qt 6-Serie von Qt vorgenommen wurden.
Lizenzen und Warenzeichen
Das Modul Qt Print Support ist unter kommerziellen Lizenzen von The Qt Company erhältlich. Darüber hinaus ist es unter Lizenzen für freie Software erhältlich: Die GNU Lesser General Public License, Version 3, oder die GNU General Public License, Version 2. Weitere Einzelheiten finden Sie unter Qt-Lizenzierung.
Bitte beachten Sie, dass Adobe® die Verwendung seiner Marken (einschließlich Logos) in Verbindung mit PDF einschränkt, z. B. "Adobe PDF". Bitte lesen Sie die Richtlinien unter www.adobe.com.
© 2025 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.