若该文为原创文章,转载请注明原文出处
本文章博客地址: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(intpage=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()。当使用带有QPrinter的QPainter作为底层绘画设备时,不需要考虑这些区域的位置和大小;画家坐标系的原点将与页面矩形的左上角重合,绘画操作将被剪裁到页面可绘制部分的边界。
绘制文本时,绘制系统会自动使用正确的设备度量,但如果需要使用从字体度量中获得的信息来定位文本,则需要确保在构造QFontMetrics和QFontMetricsF对象时指定了打印设备,或者确保使用的每个QFont都是使用接受QPaintDevice参数的构造函数的形式构造的。
打印部件
要打印部件,可以使用QWidget::render()函数。如上所述,打印机的分辨率通常高于屏幕分辨率,因此您必须缩放绘图。可能还希望将窗口放置在页面上。以下代码示例显示了这可能是什么样子。
QPainter painter;painter.begin(&printer);doublexscale=printer.pageRect().width()/double(myWidget->width());doubleyscale=printer.pageRect().height()/double(myWidget->height());doublescale=qMin(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文件中引入打印支持模块:
QT+=printsupport步骤二:引入打印机信息类
#include<QPrinterInfo>步骤三:构造空对象
构造一个空的,此时对象真的是空的,不要怀
疑。
QPrinterInfo printerInfo;步骤四:获取所有有效打印机
用单独一个空对象可以获取整个打印机名称列表信息。
(注意:这里就算打印机指定了单个,也是可以通过该方式获取所有)
QStringList listPrinterNames=printerInfo.availablePrinterNames();步骤五:用单个名称获取其打印信息
LOG<<printerInfo.printerInfo(listPrinterNames.at(index));步骤六:打印输出打印机信息
整理一下:
查看电脑打印机设备:
模块化
关键源码
voidPrinterManager::getAllPrinterInfo(){QPrinterInfo printerInfo;LOG<<printerInfo;QStringList listPrinterNames=printerInfo.availablePrinterNames();LOG<<listPrinterNames;for(intindex=0;index<listPrinterNames.size();index++){LOG<<"================ printer index:"<<index<<"printer name:"<<listPrinterNames.at(index);LOG<<printerInfo.printerInfo(listPrinterNames.at(index));}}工程模板v1.0.0
上一篇:没有了
下一篇:敬请期待…
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/162658234