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,因为它使用有关已配置页面尺寸的信息,以便在打印文档中最合适的位置插入分页符