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. C++父子类继承时的隐藏、覆盖、重载

    存在父子类继承关系时,若有同名成员函数同时存在,会发生隐藏.覆盖和重载这几种情况.对于初学者也比较容易混淆,为此,我整理了一下我的个人看法,仅供参考.希望对大家理解有帮助,也欢迎指正. 1.父子类继承 ...

  2. Swift中UIView类方法(animateWithDuration)的使用

    需求:利用Swift语言实现OC语言中UIView类方法 [UIView animateWithDuration:0.5 animations:^{ bgView.alpha= 1; }]; 在Swi ...

  3. ZThread在Windows下打印若干DEBUG信息到console的原因

    代码见这篇随笔 在Windows下的运行结果:ZThread打印了一堆东西(并不是我写的) 文件结构: 最开始我以为是编译选项没弄对,同样的代码放到Linux下编译,还是打印这些信息 注意我在Linu ...

  4. 有效提升大数据量写入excel的效率

    在开发过程中经常会有需要将数据导出到 excel 的需求,当数据量很大,达到几万甚至几十万.几百万级别的时候,如何加快生成 excel 的速度呢?首先普及一下知识背景:Excel2003 及以下版本一 ...

  5. 再来一个expect脚本

    [root@jenkins scripts]# cat expect_test1205.sh #!/usr/bin/expect ################################### ...

  6. 文本识别OCR浅析:特征篇

    OCR技术浅探:特征提取(1) 研究背景 关于光学字符识别(Optical Character Recognition, 下面都简称OCR),是指将图像上的文字转化为计算机可编辑的文字内容,众多的研究 ...

  7. shellscript

    shell script 运行方法 -------------------------------------- 1. 以命令方式执行( 一般是以这种方式执行 ) 首先修改档案权限可以运行 chmod ...

  8. HTML5课程

    1.新语义化标签:section.header.footer.nav.article.aside.figure.dialog.time.meter.mark.progress.video 2.最新的属 ...

  9. Hbase存储详解

    转自:http://my.oschina.net/mkh/blog/349866 Hbase存储详解 started by chad walters and jim 2006.11 G release ...

  10. 如何将HTML页面的标题设置为“数字天堂”。

    如何将HTML页面的标题设置为“数字天堂”. 解答: <html> <head><title>数字天堂</title></head> < ...