Qt开发技术:Qt打印系统(一)打印系统介绍和基础环境Demo

发布时间:2026/7/8 9:30:32
Qt开发技术:Qt打印系统(一)打印系统介绍和基础环境Demo 若该文为原创文章转载请注明原文出处本文章博客地址https://hpzwl.blog.csdn.net/article/details/162658234长沙红胖子Qt长沙创微智科博文大全开发技术集合包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等持续更新中…Qt开发专栏三方库开发技术上一篇没有了下一篇敬请期待…前言使用Qt的打印系统以及打印机功能。Qt打印系统介绍Qt提供了广泛的跨平台打印支持。通过各平台的打印系统Qt应用程序可向连接的打印机打印亦可通过网络向远程打印机打印。Qt的打印系统还支持PDF文件生成为基本报表生成功能奠定基础。相关类以下类支持打印机的选择与设置以及打印输出。绘制设备和打印在Qt中打印机由QPrinter表示QPrinter是一种绘画设备提供特定于打印的功能例如支持多页和双面输出。因此打印涉及使用QPainter在一系列页面上绘制就像在自定义小部件或图像上绘制一样。创建QPrinter打印设备虽然QPrinter对象可以在不需要用户输入的情况下构建和设置但打印通常是应用户请求而执行的例如当用户在GUI应用程序中选择文件|打印…菜单项时。在这种情况下新构造的QPrinter对象被提供给QPrintDialog允许用户指定要使用的打印机、纸张尺寸和其他打印属性。QPrinter printer;QPrintDialogdialog(printer,this);dialog.setWindowTitle(tr(Print Document));if(editor-textCursor().hasSelection()){dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection);}if(dialog.exec()!QDialog::Accepted){return;}在将QPrinter提供给打印对话框之前也可以通过修改QPrinter来设置某些默认属性。例如生成批量报告进行打印的应用程序可以将QPrinter设置为默认写入本地文件而不是写入打印机。在页面上绘画一旦构建并设置了QPrinter对象就可以使用QPainter对其执行绘画操作。可以通过以下方式构建和绘制QPrinterprinter(QPrinter::HighResolution);printer.setOutputFileName(print.ps);QPainter painter;painter.begin(printer);for(intpage0;pagenumberOfPages;page){// Use the painter to draw on the page.if(page!lastPage){printer.newPage();}}painter.end();由于QPrinter从空白页开始我们只需要在绘制每一页后调用newPage()函数除了最后一页。当我们调用end()时文档会被发送到打印机或写入本地文件。坐标系QPrinter提供的功能可用于获取有关纸张尺寸纸张矩形和可打印区域尺寸页面矩形的信息。这些以逻辑设备坐标给出可能与设备本身使用的物理坐标不同表明打印机能够以比用户显示器更高的分辨率通常更高渲染文本和图形。虽然我们不需要自己处理逻辑和物理坐标之间的转换但我们仍然需要将转换应用于绘画操作因为用于在屏幕上绘制的像素测量值对于典型打印机的更高分辨率来说往往太小。打印机和打印机坐标系paperRect()和pageRect()函数提供有关用于打印的纸张大小及其上可以涂漆的区域的信息。pageRect()返回的矩形通常位于paperRect()。当使用带有QPrinter的QPainter作为底层绘画设备时不需要考虑这些区域的位置和大小画家坐标系的原点将与页面矩形的左上角重合绘画操作将被剪裁到页面可绘制部分的边界。绘制文本时绘制系统会自动使用正确的设备度量但如果需要使用从字体度量中获得的信息来定位文本则需要确保在构造QFontMetrics和QFontMetricsF对象时指定了打印设备或者确保使用的每个QFont都是使用接受QPaintDevice参数的构造函数的形式构造的。打印部件要打印部件可以使用QWidget::render()函数。如上所述打印机的分辨率通常高于屏幕分辨率因此您必须缩放绘图。可能还希望将窗口放置在页面上。以下代码示例显示了这可能是什么样子。QPainter painter;painter.begin(printer);doublexscaleprinter.pageRect().width()/double(myWidget-width());doubleyscaleprinter.pageRect().height()/double(myWidget-height());doublescaleqMin(xscale,yscale);painter.translate(printer.paperRect().x()printer.pageRect().width()/2,printer.paperRect().y()printer.pageRect().height()/2);painter.scale(scale,scale);painter.translate(-width()/2,-height()/2);myWidget-render(painter);这将使小部件位于页面的中心并对其进行缩放使其适合页面从复杂小部件打印某些小部件如QTextEdit和QGraphicsView显示了丰富的内容这些内容通常由其他类的实例如QTextDocument和QGraphicsScene管理。因此这些内容处理类通常通过可用于执行完整任务的函数或接受现有QPainter对象的函数提供打印功能。一些小部件提供了方便的功能来公开底层打印功能避免了仅仅为了调用单个函数而获取内容处理程序的需要。下表显示了从一系列不同的小部件中负责打印的类和函数。对于不直接公开打印功能的小部件可以通过相应小部件的API中的函数获取包含该功能的内容处理类。QTextEdit需要QPrinter而不是QPainter因为它使用有关配置页面尺寸的信息以便在打印文档中最合适的位置插入分页符。获取打印机信息Demo步骤一添加打印模块在pro/pri文件中引入打印支持模块QTprintsupport步骤二引入打印机信息类#includeQPrinterInfo步骤三构造空对象构造一个空的此时对象真的是空的不要怀疑。QPrinterInfo printerInfo;步骤四获取所有有效打印机用单独一个空对象可以获取整个打印机名称列表信息。注意这里就算打印机指定了单个也是可以通过该方式获取所有QStringList listPrinterNamesprinterInfo.availablePrinterNames();步骤五用单个名称获取其打印信息LOGprinterInfo.printerInfo(listPrinterNames.at(index));步骤六打印输出打印机信息整理一下查看电脑打印机设备模块化关键源码voidPrinterManager::getAllPrinterInfo(){QPrinterInfo printerInfo;LOGprinterInfo;QStringList listPrinterNamesprinterInfo.availablePrinterNames();LOGlistPrinterNames;for(intindex0;indexlistPrinterNames.size();index){LOG printer index:indexprinter name:listPrinterNames.at(index);LOGprinterInfo.printerInfo(listPrinterNames.at(index));}}工程模板v1.0.0上一篇没有了下一篇敬请期待…本文章博客地址https://hpzwl.blog.csdn.net/article/details/162658234