Qt 打印支持

Qt为打印提供广泛的跨平台支持。使用每个平台上的打印系统,Qt应用程序可以打印到连接的打印机,并通过网络打印到远程打印机。Qt的打印系统还支持PDF文件生成,为基本的报告生成设施奠定了基础。

支持打印的类

以下类支持选择和设置打印机和打印输出。

描述
QAbstractPrintDialog 用于配置打印机的打印对话框的基本实现
QPageSetupDialog 打印机上与页面相关的选项的配置对话框
QPrintDialog 用于指定打印机配置的对话框
QPrintEngine 定义QPrinter如何与给定打印子系统交互的接口
QPrintPreviewDialog 用于预览和配置打印机输出的页面布局的对话框
QPrintPreviewWidget 用于预览打印机输出的页面布局的小组件
QPrinter 在打印机上绘画的油漆设备
QPrinterInfo 提供对现有打印机信息的访问

油漆设备和印刷

在Qt中,打印机由QPrinter表示,QPrinter是一种提供特定于打印功能的绘图设备,例如支持多页和双面输出。因此,打印涉及使用QPainter以与绘制到自定义小部件或图像相同的方式绘制到一系列页面上。

创建QPrinter

尽管可以在不需要用户输入的情况下构造和设置QPrinter对象,但是通常由于用户的请求而执行打印。例如,当用户选择GUI应用程序中的File | Print ...菜单项时。在这种情况下,新构造的QPrinter对象被提供给QPrintDialog,允许用户指定要使用的打印机,纸张大小和其他打印属性。

        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;
}

通过在将QPrinter提供给打印对话框之前修改QPrinter,也可以设置某些默认属性。例如,生成的打印可以设立报告批量应用QPrinter来写入到本地文件默认情况下,而不是一台打印机。

画在页面上

一旦构造并设置了QPrinter对象,就可以使用QPainter对其执行绘制操作。我们可以通过以下方式构建和建立画家:

    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();

由于QPrinter以空白页开始,我们只需在绘制每个页面后调用newPage()函数,但最后一页除外。

当我们调用end()时,文档被发送到打印机,或写入本地文件。

坐标系

QPrinter提供的功能可用于获取有关纸张尺寸(纸张矩形)和可打印区域尺寸(页面矩形)的信息。这些在逻辑设备坐标中给出,其可能与设备本身使用的物理坐标不同,表明打印机能够以比用户显示器(通常更高)的分辨率呈现文本和图形。

虽然我们自己不需要处理逻辑和物理坐标之间的转换,但我们仍然需要将转换应用于绘制操作,因为用于在屏幕上绘制的像素测量通常对于典型打印机的较高分辨率而言太小。

打印机和画家协调系统

所述paperRect()和pageRect()函数提供关于用于打印的纸张的尺寸和可以涂在其上的区域的信息。

通过返回的矩形)pageRect(通常位于返回的矩形内()paperRect。当使用QPainter和QPrinter作为底层涂装设备时,您不需要考虑这些区域的位置和尺寸; 画家坐标系的原点将与页面矩形的左上角重合,绘画操作将被剪裁到页面可绘制部分的边界。

在绘制文本时,绘图系统会自动使用正确的设备指标,但是,如果需要使用从字体指标获取的信息来定位文本,则需要确保在构造QFontMetrics和QFontMetricsF对象时指定打印设备,或确保每个QFont used是使用接受QPaintDevice参数的构造函数的形式构造的。

打印小部件

要打印窗口小部件,可以使用QWidget :: render()函数。如上所述,打印机的分辨率通常高于屏幕分辨率,因此您必须缩放画家。您可能还想在页面上放置小部件。以下代码示例显示了它的外观。

        QPainter painter;
painter.begin(&printer);
double xscale = printer.pageRect().width()/double(myWidget->width());
double yscale = printer.pageRect().height()/double(myWidget->height());
double scale = 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中的函数获取包含此功能的内容处理类。

窗口小部件 打印功能 接受
QGraphicsView QGraphicsView::render() QPainter
QSvgWidget QSvgRenderer::render() QPainter
QTextEdit QTextDocument::print() QPrinter
QTextLayout QTextLayout::draw() QPainter
QTextLine QTextLine::draw() QPainter

QTextEdit需要QPrinter而不是QPainter,因为它使用有关已配置页面尺寸的信息,以便在打印文档中最合适的位置插入分页符

Qt 打印机支持模块的更多相关文章

  1. Qt框架及模块认识

    小白自工作就接触Qt,一直都在使用Qt5.3.1版本,所以没有经历过大牛们把项目从Qt4程序到Qt5的烦恼,没准以后会碰到.对Qt所有的丰富的API表示惊叹,对于Qt的框架及模块认识也是极为模糊的,文 ...

  2. I.MX6 linux Qt 同时支持Touch、mouse

    /***************************************************************************** * I.MX6 linux Qt 同时支持 ...

  3. 让QT/Embedded支持国际化

    让QT/Embedded支持国际化 环境配置: Qt/Embedded ,在主机和目标板上存放路径都为:/root/qt-embedded-free- Qt/X11 3.3 (主要用到其中的lupda ...

  4. 让Qt Creator支持Windows Phone 8开发

    让Qt Creator支持Windows Phone 8开发 近期QtCreator3.2出了.修复了一些Bug.比上一个版本号3.1.2要好了一些. 因为在上一个版本号(Qt for WinRT自带 ...

  5. Qt 4.5发布(最大的变动是换用LGPL许可证,移植进了苹果的Cocoa框架。之前的Qt只支持Carbon框架,现在的Qt 4.5两者都支持。单一源代码创建出支持32位或64位字节的Intel或PowerPC Mac二进制文件)

            Nokia的开源Qt开发工具正式发布了4.5版.如前所述,Qt 4.5最大的变动是换用LGPL许可证,目前采用的三个许可证分别为LGPL/GPL和商业许可证.           新版 ...

  6. 【Linux开发】【Qt开发】QT 同时支持鼠标和触摸屏

    QT 同时支持鼠标和触摸屏 现在 如果我要使用鼠标 导入环境变量 export QWS_MOUSE_PROTO=MouseMan:/dev/input/mice 使用触摸屏,导入环境变量 export ...

  7. Orchard源码分析(1):插件式的支持——模块和主题

    在Orchard,模块和主题都是可以插拔式的,在源码处理时,用类型(参考:DefaultExtensionTypes)区分,都没太大的本质区别,以下都称做模块. 插件的支持,实现分以下几步: 搜集模块 ...

  8. Qt的gzip模块实现

    一直没找到Qt中方便的gzip模块,于是自己动手,调用zlib模块实现了一份. 目标:  1.gzip的压缩与解压 2.内存中操作 3.方便的Qt接口   实现分析: gzip 压缩算法为 defla ...

  9. 【linux学习笔记】在ubuntu下使用QT Cmake支持C++11

    今天在ubuntu下使用QT来进行C++编程,选择了Cmake,当用到initializer_list的时候提示不支持C++11,现提供一下解决方案: 错误提示: error: This file r ...

随机推荐

  1. https证书最佳实战目录

    [svc]openssl对称加密,非对称加密最佳实战 http://blog.csdn.net/iiiiher/article/details/78593464 [svc]证书的生成和各个字段的含义 ...

  2. Java创建多线程的三种方法

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...

  3. 547. Intersection of Two Arrays【easy】

    Given two arrays, write a function to compute their intersection. Notice Each element in the result ...

  4. ORACLE中NVL和COALESCE的区别

    nvl(COMMISSION_PCT,0)如果第一个参数为null,则返回第二个参数如果第一个参数为非null,则返回第一个参数 COALESCE(EXPR1,EXPR2,EXPR3...EXPRn) ...

  5. 基于Java Mina 和Netty 通信框架的JT/T809转发服务器设计

    Apache MINA 是 Apache 组织的一个开源项目,为开发高性能和高可用性的网络应用程序提供了非常便利的框架. 也是Java开发者的一个福利(.NET目前还没有类似封装的这么好的基础sock ...

  6. poj 3246 Balanced Lineup(线段树)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 38942   Accepted: 18247 ...

  7. awk数组处理字符串合并

    需求: 有一文本文件 lessons.txt 内容如下,请使用 awk 处理该文本,并输出内容如 result.txt lessons.txt: 634751 预排 568688 预排 386760 ...

  8. Java与.NET机制比较分析

    一.概述 不管是什么语言开发的web应用程序,都是在解决一个问题,那就是用户输入url怎么把对应的页面响应出来,如何通过url映射到响应的类,由于自己做asp.net的时间也不短了,还算是对asp.n ...

  9. 那些让人睡不着觉的bug,你有没有遭遇过?

    我先讲一个小故事,以前在外企工作时的一个亲身经历. 当时我所在的team,负责手机上多媒体Library方面的开发.有一天,一个具有最高等级的bug被转到了我的手上.这个bug非常诡异,光是重现它就需 ...

  10. swt生成、jar可执行包生成.exe可执行文件(giter)

    http://tomfish88.iteye.com/blog/1074786 —————————————————————————————————————————————————————————— 最 ...