Qt Print Support
Le module « Qt Print Support » offre une prise en charge étendue de l'impression sur plusieurs plateformes. En utilisant les systèmes d'impression propres à chaque plateforme, les applications Qt peuvent imprimer sur les imprimantes connectées et, via le réseau, sur des imprimantes distantes. Le système d'impression prend également en charge la création de fichiers PDF, ce qui constitue la base des fonctionnalités de génération de rapports de base.
Qt Print Support n'est pas disponible sur :
- Android™
- iOS
Classes prenant en charge l'impression
Les classes suivantes prennent en charge la sélection et la configuration des imprimantes ainsi que la sortie d'impression.
Implémentation de base des boîtes de dialogue d’impression utilisées pour configurer les imprimantes | |
Représente un ensemble de plages de pages | |
Boîte de dialogue de configuration des options liées aux pages sur une imprimante | |
Boîte de dialogue permettant de spécifier la configuration de l'imprimante | |
Définit une interface décrivant la manière dont QPrinter interagit avec un sous-système d’impression donné | |
Boîte de dialogue permettant de prévisualiser et de configurer les mises en page pour la sortie d’impression | |
Widget permettant de prévisualiser les mises en page pour la sortie imprimante | |
Périphérique de dessin permettant de tracer sur une imprimante | |
Donne accès aux informations sur les imprimantes existantes |
Périphériques de dessin et impression
Les imprimantes sont représentées par un « QPrinter », un périphérique de dessin qui offre des fonctionnalités spécifiques à l’impression, telles que la prise en charge de plusieurs pages et de l’impression recto-verso. Par conséquent, l’impression implique l’utilisation d’un « QPainter » pour dessiner sur une série de pages, de la même manière que vous dessineriez sur un widget personnalisé ou une image.
Création d’un QPrinter
Bien que les objets ` QPrinter ` puissent être instanciés et configurés sans intervention de l’utilisateur, l’impression est souvent déclenchée par une requête de l’utilisateur ; par exemple, lorsque celui-ci sélectionne l’élément de menu « File|Print... » dans une application GUI. Dans ce cas, un objet ` QPrinter ` nouvellement créé est transmis à une ` QPrintDialog`, ce qui permet à l’utilisateur de spécifier l’imprimante à utiliser, le format de papier et d’autres propriétés d’impression.
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;Il est également possible de définir certaines propriétés par défaut en modifiant l’ QPrinter avant qu’il ne soit transmis à la boîte de dialogue d’impression. Par exemple, les applications qui génèrent des lots de rapports à imprimer peuvent configurer l’ QPrinter pour qu’il pointe par défaut vers write to a local file plutôt que vers une imprimante.
Tracé sur une page
Une fois qu’un objet ` QPrinter ` a été créé et configuré, un ` QPainter ` peut être utilisé pour effectuer des opérations de dessin sur celui-ci. Nous pouvons créer et configurer un ` ` de la manière suivante :
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();Comme l’ QPrinter commence avec une page vierge, il suffit d’appeler la fonction newPage() après avoir dessiné chaque page, à l’exception de la dernière.
Le document est envoyé à l’imprimante ou enregistré dans un fichier local lorsque l’on appelle la fonction ` end()`.
Systèmes de coordonnées
QPrinter fournit des fonctions permettant d’obtenir des informations sur les dimensions du papier (le rectangle du papier) et celles de la zone imprimable (le rectangle de la page). Celles-ci sont exprimées en coordonnées logiques du périphérique, qui peuvent différer des coordonnées physiques utilisées par le périphérique lui-même, ce qui indique que l’imprimante est capable de restituer du texte et des graphiques à une résolution (généralement supérieure) à celle de l’écran de l’utilisateur.
Bien que nous n’ayons pas à gérer nous-mêmes la conversion entre coordonnées logiques et physiques, nous devons tout de même appliquer des transformations aux opérations de dessin, car les mesures en pixels utilisées pour dessiner à l’écran sont souvent trop petites pour les résolutions plus élevées des imprimantes courantes.
| Systèmes de coordonnées de l’imprimante et du dessinateur Les fonctions ` paperRect()` et ` pageRect()` fournissent des informations sur la taille du papier utilisé pour l'impression et sur la zone de celui-ci sur laquelle il est possible de dessiner. Le rectangle renvoyé par pageRect() se trouve généralement à l’intérieur du rectangle renvoyé par paperRect(). Vous n’avez pas besoin de tenir compte des positions et des tailles de ces zones lorsque vous utilisez un objet ` QPainter ` avec un ` QPrinter ` comme périphérique de dessin sous-jacent ; l’origine du système de coordonnées du dessinateur coïncidera avec le coin supérieur gauche du rectangle de la page, et les opérations de dessin seront limitées aux limites de la partie dessinable de la page. | ![]() |
Le système de dessin utilise automatiquement les métriques correctes du périphérique lors du dessin du texte ; toutefois, si vous devez positionner du texte à l’aide d’informations issues des métriques de police, vous devez vous assurer que le périphérique d’impression est spécifié lors de la construction des objets ` QFontMetrics ` et ` QFontMetricsF `, ou veiller à ce que chaque ` QFont ` utilisé soit construit à l’aide de la forme du constructeur qui accepte un argument ` QPaintDevice `.
Impression de widgets
Pour imprimer un widget, vous pouvez utiliser la fonction QWidget::render(). Comme indiqué précédemment, la résolution de l’imprimante est généralement supérieure à celle de l’écran ; vous devrez donc redimensionner le painter. Vous souhaiterez peut-être également positionner le widget sur la page. L’exemple de code suivant illustre cette procédure.
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);Cela centrera le widget sur la page et le redimensionnera pour qu’il s’adapte à la page.
Impression à partir de widgets complexes
Certains widgets, tels que QTextEdit et QGraphicsView, affichent un contenu enrichi généralement géré par des instances d’autres classes, telles que QTextDocument et QGraphicsScene. Par conséquent, ce sont ces classes de gestion de contenu qui fournissent généralement des fonctionnalités d’impression, soit via une fonction permettant d’effectuer la tâche complète, soit via une fonction acceptant un objet QPainter existant. Certains widgets fournissent des fonctions pratiques permettant d’accéder aux fonctionnalités d’impression sous-jacentes, ce qui évite d’avoir à obtenir le gestionnaire de contenu uniquement pour appeler une seule fonction.
Le tableau suivant indique quelles classes et fonctions sont chargées de l’impression à partir d’une sélection de widgets différents. Pour les widgets qui n’exposent pas directement les fonctionnalités d’impression, les classes de gestion de contenu contenant ces fonctionnalités peuvent être obtenues via une fonction de l’API du widget correspondant.
| Widget | Fonction d’impression | Accepte |
|---|---|---|
| QGraphicsView | QGraphicsView::render() | QPainter |
| QSvgWidget | QSvgRenderer::render() | QPainter |
| QTextEdit | QTextDocument::print() | QPrinter |
| QTextLayout | QTextLayout::draw() | QPainter |
| QTextLine | QTextLine::draw() | QPainter |
QTextEdit nécessite un objet de type « QPrinter » plutôt qu’un « QPainter », car il utilise les informations relatives aux dimensions de la page configurées afin d’insérer des sauts de page aux endroits les plus appropriés dans les documents imprimés.
Utilisation du module
L'utilisation d'un module Qt nécessite une liaison avec la bibliothèque du module, soit directement, soit via d'autres dépendances. Plusieurs outils de compilation prennent cela en charge, notamment CMake et qmake.
Compilation avec CMake
Utilisez la commande « find_package() » pour localiser les composants du module nécessaires dans le paquet « Qt6 » :
find_package(Qt6 REQUIRED COMPONENTS PrintSupport)
target_link_libraries(mytarget PRIVATE Qt6::PrintSupport)Voir également la présentation de la compilation avec CMake.
Compilation avec qmake
Pour configurer le module en vue d'une compilation avec qmake, ajoutez le module en tant que valeur de la variable ` QT ` dans le fichier .pro du projet :
QT += printsupportÉvolution du module
La section «Modifications apportées à Qt Print Support » répertorie les changements importants apportés à l’API et aux fonctionnalités du module dans le cadre de la série Qt 6 de Qt.
Licences et marques déposées
Le module Qt Print Support est disponible sous licence commerciale auprès de The Qt Company. Il est également disponible sous licence de logiciel libre : la Licence publique générale restreinte GNU, version 3, ou la Licence publique générale GNU, version 2. Consultez la page Licences Qt pour plus de détails.
Veuillez noterqu'Adobe® impose des restrictions quant à l'utilisation de ses marques déposées (y compris ses logos) en lien avec le format PDF ; par exemple, « Adobe PDF ». Veuillez consulter la page www.adobe.com pour connaître les directives applicables.
© 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.
