找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

QT软件开发-第十五章 基于QT5打印机设备开发

admin 2019-5-10 14:54 512人围观 Qt相关



点击上方蓝字关注我们





QT5支持打印机的相关类如下:


QPrinter类是在打印机上绘制的绘图设备。

QPrintDialog类提供了一个用于指定打印机配置的对话框。

QPrintPreviewDialog类提供了一个对话框,用于预览和配置打印机输出的页面布局。

15.1 QPrinter类


头文件  :#include <QPrinter>

qmake   :QT += printsupport

继承类  :QPagedPaintDevice


15.1.1 QPrinter类功能详细介绍


QPrinter类是在打印机上绘制的绘图设备。

该设备代表一系列打印输出页面,其使用方式与QWidget和QPixmap等其他绘图设备几乎完全相同。提供了一组附加功能来管理特定于设备的功能,例如方向和分辨率,以及在生成文档时逐步浏览页面。

在Windows或macOS上直接打印到打印机时,QPrinter使用内置的打印机驱动程序。在X11上,QPrinter使用通用Unix打印系统(CUPS)将PDF输出发送到打印机。作为替代方法,printProgram()函数可用于指定要使用的命令或实用程序,而不是系统默认值。

请注意,未定义在无效打印机上设置纸张大小和分辨率等参数。在更改任何参数之前,你可以使用QPrinter :: isValid()来验证这一点。

QPrinter支持许多参数,大多数参数可由最终用户通过打印对话框进行更改。通常,QPrinter将这些函数传递给底层的QPrintEngine。

最重要的参数是:

setOrientation()告诉QPrinter要使用哪个页面方向。

setPaperSize()告诉QPrinter打印机需要什么样的纸张尺寸。

setResolution()告诉QPrinter你希望打印机提供的分辨率,以每英寸点数(DPI)为单位。

setFullPage()告诉QPrinter你是要处理整页还是只打印打印机可以绘制的部分。

setCopyCount()告诉QPrinter它应该打印多少份文档。

许多这些函数只能在实际打印开始之前调用(即,在调用QPainter :: begin()之前)。 这通常是有道理的,因为,例如,当你打印一半时,无法更改份数。 用户也设置了一些设置(通过打印机对话框),并且应该遵守应用程序。 有关更多详细信息,请参阅QAbstractPrintDialog的文档。

当调用QPainter :: begin()时,它操作的QPrinter准备用于新页面,使QPainter能够立即用于绘制文档中的第一页。绘制完第一页后,可以调用newPage()来请求绘制新的空白页,或者可以调用QPainter :: end()来完成打印。第二页和所有后续页面是在绘制之前使用对newPage()的调用准备的。

文档中的第一页不需要在调用newPage()之前。如果需要在打印文档的开头插入空白页,则只需要在QPainter :: begin()之后调用newPage()。类似地,在绘制文档的最后一页之后调用newPage()将导致在打印文档的末尾附加尾随空白页。

如果要中止打印作业,abort()将尽力停止打印。它可能取消整个工作或仅取消其中的一部分。

由于QPrinter可以打印到任何QPrintEngine子类,因此可以通过继承QPrintEngine并重新实现其接口来扩展打印支持以覆盖新类型的打印子系统。

另请参见QPrintDialog和Qt打印支持。

15.1.2 设置虚拟打印的文档名称


在X11上,文档名称用作QPrintDialog中的默认输出文件名。

请注意,如果打印机正在打印到文件,则文档名称不会影响文件名。 使用setOutputFile()函数。

void QPrinter::setDocName(const QString &name)

QString QPrinter::docName() const


15.2 QPrintDialog类


头文件:#include <QPrintDialog>

qmake :QT += printsupport

继承  :QAbstractPrintDialog

15.2.1 QPrintDialog类功能详细介绍


QPrintDialog类提供了一个用于指定打印机配置的对话框。

该对话框允许用户更改与文档相关的设置,例如纸张尺寸和方向,打印类型(彩色或灰度),页面范围和要打印的份数。

还提供了控件,使用户可以从可用的打印机中进行选择,包括任何已配置的网络打印机。

通常,QPrintDialog对象使用QPrinter对象构造,并使用exec()函数执行。

QPrintDialog printDialog(printer, parent);

  if (printDialog.exec() == QDialog::Accepted) {

      // print ...

  }

如果用户接受该对话框,则正确配置QPrinter对象以进行打印。

完整示例代码r如下:

void MainWindow::filePrint()

{

    // 创建打印机对象

    QPrinter printer;

    //设置打印机虚拟打印时保存的名称 (使用本地系统时间当做字符串名称)

    printer.setDocName(QDateTime::currentDateTime().toString());

    // 创建打印对话框

    QString printerName = printer.printerName();

    if(printerName.size() == 0)

       return;

    QPrintDialog dlg(&printer, this);

    //如果编辑器中有选中区域,则打印选中区域

    if(ui->textEdit->textCursor().hasSelection())

       dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);

    //如果在对话框中按下了打印按钮,则执行打印操作

    if (dlg.exec() == QDialog::Accepted)

    {

      ui->textEdit->print(&printer);

    }

}

运行效果:





打印机对话框可以访问常见的打印属性。 在使用CUPS打印系统的X11平台上,可以通过对话框的“属性”按钮修改每个可用打印机的设置。

在Windows和macOS上,使用本机打印对话框,这意味着不会遵守对话框中设置的某些QWidget和QDialog属性。 macOS上的本机打印对话框不支持设置打印机选项,即setOptions()和setOption()无效。

在Qt 4.4中,可以使用静态函数在macOS上显示工作表。 Qt 4.5不再支持此功能。 如果你需要此功能,请使用QPrintDialog :: open()。

另请参见QPageSetupDialog和QPrinter。

15.2.2 开始执行对话框


int QPrintDialog::exec()

从QDialog :: exec()重新实现。

15.3 QPrintPreviewDialog类


头文件:#include <QPrintPreviewDialog>

qmake :QT += printsupport

继承  :QDialog

15.3.1 QPrintPreviewDialog类详细介绍


QPrintPreviewDialog类提供了一个对话框,用于预览和配置打印机输出的页面布局。

在现有应用程序中使用QPrintPreviewDialog非常简单:

1. 创建QPrintPreviewDialog。

你可以使用现有的QPrinter对象构造QPrintPreviewDialog,也可以让QPrintPreviewDialog为你创建一个,这将是系统默认的打印机。

2. 将paintRequested()信号连接到插槽。

当对话框需要生成一组预览页面时,将发出paintRequested()信号。 您可以使用与实际打印完全相同的代码来生成预览,包括调用QPrinter :: newPage()以在预览中启动新页面。 将一个插槽连接到paintRequested()信号,在该信号上绘制传递到插槽的QPrinter对象。

3. 调用exec()。

调用QPrintPreviewDialog :: exec()以显示预览对话框。

另请参见QPrinter,QPrintDialog,QPageSetupDialog和QPrintPreviewWidget。

15.3.2 示例代码


// 打印预览

void MainWindow::doPrintPreview()

{

    QPrinter printer;

    //设置打印机虚拟打印时保存的名称 (使用本地系统时间当做字符串名称)

    printer.setDocName(QDateTime::currentDateTime().toString());

    // 创建打印预览对话框

    QPrintPreviewDialog preview(&printer,this);

    // 当要生成预览页面时,发射paintRequested()信号

    connect(&preview, SIGNAL(paintRequested(QPrinter*)),

                  this,SLOT(printPreview(QPrinter*)));

    preview.setWindowTitle("打印预览窗口"); //设置预览窗口的名称

    preview.exec();

}

void MainWindow::printPreview(QPrinter *printer)

{

    ui->textEdit->print(printer);

}

运行效果图:



 图15.1 打印预览效果图


技术合作与咨询

QQ:1126626497
关注我长按二维码可识别微信号:xl1126626497



----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:DS小龙哥 嵌入式技术资讯,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......