Qt 打印机支持模块
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 打印机支持模块的更多相关文章
- Qt框架及模块认识
小白自工作就接触Qt,一直都在使用Qt5.3.1版本,所以没有经历过大牛们把项目从Qt4程序到Qt5的烦恼,没准以后会碰到.对Qt所有的丰富的API表示惊叹,对于Qt的框架及模块认识也是极为模糊的,文 ...
- I.MX6 linux Qt 同时支持Touch、mouse
/***************************************************************************** * I.MX6 linux Qt 同时支持 ...
- 让QT/Embedded支持国际化
让QT/Embedded支持国际化 环境配置: Qt/Embedded ,在主机和目标板上存放路径都为:/root/qt-embedded-free- Qt/X11 3.3 (主要用到其中的lupda ...
- 让Qt Creator支持Windows Phone 8开发
让Qt Creator支持Windows Phone 8开发 近期QtCreator3.2出了.修复了一些Bug.比上一个版本号3.1.2要好了一些. 因为在上一个版本号(Qt for WinRT自带 ...
- 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和商业许可证. 新版 ...
- 【Linux开发】【Qt开发】QT 同时支持鼠标和触摸屏
QT 同时支持鼠标和触摸屏 现在 如果我要使用鼠标 导入环境变量 export QWS_MOUSE_PROTO=MouseMan:/dev/input/mice 使用触摸屏,导入环境变量 export ...
- Orchard源码分析(1):插件式的支持——模块和主题
在Orchard,模块和主题都是可以插拔式的,在源码处理时,用类型(参考:DefaultExtensionTypes)区分,都没太大的本质区别,以下都称做模块. 插件的支持,实现分以下几步: 搜集模块 ...
- Qt的gzip模块实现
一直没找到Qt中方便的gzip模块,于是自己动手,调用zlib模块实现了一份. 目标: 1.gzip的压缩与解压 2.内存中操作 3.方便的Qt接口 实现分析: gzip 压缩算法为 defla ...
- 【linux学习笔记】在ubuntu下使用QT Cmake支持C++11
今天在ubuntu下使用QT来进行C++编程,选择了Cmake,当用到initializer_list的时候提示不支持C++11,现提供一下解决方案: 错误提示: error: This file r ...
随机推荐
- CentOS安装自动补全安装包
CentOS7标准版有这个功能,但是CentOS6却没有,其实很简单: 1.安装bash-completion yum install bash-completion 2.保存一下最新的缓存 yum ...
- 多线程-Thread、Runnable、Callbale、Future
Thread:java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类,可以通过继承Thread类来创建并启动多线程. package org.github.lujiango; ...
- android studio - 导入工程报错[Plugin with id 'com.android.application' not found]
出错现象: 大概意思是找不到:com.android.application 插件,以上现象对于初学者来说会经常碰到,下面分析下产生的原因. 原因分析 首先来看看导入后的工程结构: 对于此工程结构,是 ...
- php中while($row = $results->fetch_row())调用出错
php中while($row = $results->fetch_row())调用出错 错误处在sql语句上
- C++基础细节2
1.关于引用和指针 概念上,引用(&)并不是对象,而是一个已经存在的对象的别名:引用不可以重新绑定到另外一个对象,因此引用必须初始化.(类比const,一经定义就不能修改,所以必须初始化,是同 ...
- 【Java】之static静态方法与非static静态方法区别
1.A.class:没有static public class A { public String getText(){ } B.class调用A的方法时 public class B { publi ...
- Easyui Datagrid的Rownumber行号显示问题
Datagrid中当你的行数据超过9999时,第一列的行号rownumber将会因为表格内容过长而导致无法显示全部数字, 这一点Easyui无法做到自适应 所以需要进行修改,这里扩展一个方法就行了. ...
- 你是怎么理解java的泛型的?
解答: 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知 ...
- WebAPI实现移动端上传头像接口
测试时可以直接使用PostMan模拟发送请求 /// <summary> /// 手机端上传头像接口 /// </summary> /// <param name=&qu ...
- 【vijos】1791 骑士的旅行(特殊的技巧)
https://vijos.org/p/1791 暴力的话只想到bfs,然后估计是状态超了才得20分. 噗,为啥暴力就不能想得简单点QAQ.....这种思想很好啊. 这一题我看了题解后不得不说我竟然没 ...