一、简介
Qt 打印支持模块为打印提供了跨平台支持。Qt 应用程序可以打印到连接的打印机并通过网络打印到远程打印机。打印系统还支持 PDF 文件生成。
二、绘制设备和打印
打印机以 QPrinter 为核心,这是一个提供特定于打印功能的绘图设备。 因此,打印实际上就是使用 QPainter 在页面上绘制内容。
2.1、创建 QPrinter
构造的 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 提供给打印对话框之前修改它来设置某些默认属性。
2.2、在页面上绘制
一旦构建并设置了 QPrinter 对象,就可以使用 QPainter 对其执行绘画操作。可以通过以下方式构造和设置一个painter:
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() 时,文档被发送到打印机,或写入本地文件。
2.3、坐标系
QPrinter 提供的函数可用于获取有关纸张尺寸和可打印区域尺寸的信息。这些是在逻辑设备坐标中给出的,可能与设备本身使用的物理坐标不同,这表明打印机能够以比用户显示器的分辨率(通常更高)呈现文本和图形。
虽然用户不需要自己处理逻辑坐标和物理坐标之间的转换,但仍然需要对绘制操作应用转换,因为用于在屏幕上绘制的像素测量值对于打印机的高分辨率而言通常太小。
2.3.1、打印机和绘制坐标系
QPrinter::paperRect() 和 QPrinter::pageRect() 函数提供有关用于打印的纸张大小以及可以在其上绘制的区域的信息。
pageRect() 返回的矩形通常位于 paperRect() 返回的矩形内。当使用 QPainter 和 QPrinter 作为底层绘制设备时,QPainter 绘制坐标系的原点将与 pageRect() 的左上角重合,并且绘制操作将被裁剪到页面可绘制部分的边界。
三、打印 QWidget
要打印 QWidget,可以使用 QWidget::render() 函数。如前所述,打印机的分辨率通常高于屏幕分辨率,因此必须缩放 QPainter。
QPrinter printer;
QPrintDialog dialog(&printer, nullptr);
if (dialog.exec())
{
QPainter painter(&printer);
auto pageRect_ = printer.pageRect(QPrinter::DevicePixel);
double xscale = pageRect_.width() / double(this->width());
double yscale = pageRect_.height() / double(this->height());
double scale = qMin(xscale, yscale);
painter.scale(scale, scale);
painter.translate((pageRect_.width()-width()) / 2, (pageRect_.height()-height()) / 2);
render(&painter);
}
四、打印复杂的小部件
某些小部件,例如 QTextEdit 和 QGraphicsView,用于显示由其他类的实例管理的内容,例如 QTextDocument 和 QGraphicsScene。因此,正是这些内容处理类通常提供打印功能。
下表显示了哪些类和函数负责从选择的不同小部件中进行打印。