Qt 打印机支持模块

摘要:
Qt的打印系统还支持PDF文件生成,为基本的报告生成设施奠定了基础。在这种情况下,新构造的QPrinter对象被提供给QPrintDialog,允许用户指定要使用的打印机、纸张大小和其他打印属性。因此,正是这些内容处理类通常通过可用于执行完整任务的函数或通过接受现有QPainter对象的函数来提供打印功能。
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作为底层涂装设备时,您不需要考虑这些区域的位置和尺寸; 画家坐标系的原点将与页面矩形的左上角重合,绘画操作将被剪裁到页面可绘制部分的边界。

Qt 打印机支持模块第1张

在绘制文本时,绘图系统会自动使用正确的设备指标,但是,如果需要使用从字体指标获取的信息来定位文本,则需要确保在构造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中的函数获取包含此功能的内容处理类。

窗口小部件打印功能接受
QGraphicsViewQGraphicsView::render()QPainter
QSvgWidgetQSvgRenderer::render()QPainter
QTextEditQTextDocument::print()QPrinter
QTextLayoutQTextLayout::draw()QPainter
QTextLineQTextLine::draw()QPainter

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

免责声明:文章转载自《Qt 打印机支持模块》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java 使用 Map 实现缓存工具Swing UI下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

python爬取图片遇见src乱码: data:image/png;base64

Python抓取图像并遇到src乱码:data:image/png;Base64会抓取您喜欢的图像,但图像的src在抓取的代码中出现了乱码:data:image/png;base64.)“”头1,编码=字符串。splitdata=b64decodedwithopenasf:f.写入。close()注意:我还没有成功。。。。。。...

Xmind常用快捷键

快捷鍵(WINDOWS)快捷鍵(MAC)描述Ctrl+NCommand+N建立新工作簿Ctrl+OCommand+O开启工作簿Ctrl+SCommand+S储存目前工作簿Ctrl+Shift+SCommand+Shift+S储存全部工作簿Ctrl+WCommand+W关闭目前工作簿Ctrl+Shift+WCommand+Shift+W关闭全部工作簿Ctrl+...

[转载]su认证失败

我认为桌面用户拥有更高的安全性是合适的;但是,可以将服务器设置为允许“su”作为root用户,但不允许root用户直接登录。问题如下:1me@ubuntu:~$su2Password:˂---在安装过程中输入root用户的密码。3su:身份验证失败允许su root。这很简单。您只需要重置密码。...

JAVA 实现CLOB转String

CLOB定义了用于在数据库中保存文件的类型。SQLCLOB是一种内置类型,它将一个大型字符对象作为列值存储在数据库表的一行中。默认情况下,驱动程序使用SQLlocator实现Clob对象,这意味着Clob对象包含指向SQLCLOB数据的逻辑指针,而不是数据本身。Clob对象在其创建的事务期间有效。在一些数据库系统中,文本也用作CLOB的别名。例如,SQL S...

Android 上的 10 款 Web 开发工具推荐

作为一个狂热的Android用户,我一直在寻找适合Web开发人员使用的一些应用程序。以下推荐10款非常实用的Android端的Web开发工具。EditorJoooid1.1Editor这款工具非常适合用来发布包含HTML、文本、图片和相册的文章,还包含了GPL定位信息。...

移动通信网络中的 GTP 协议

在EPSUP中使用GTP的优点之一是GTP具有固有的可识别隧道机制和GTP可以为UE提供的移动性。注意:GTPv2-U协议不存在。GTP-C协议GTP-C是GTP的控制平面,使用UDP端口2123。在EPS中,GTPv2-C协议负责创建、维护和删除S1、S5/S8和其他接口上的GTP-U隧道。它是一种基于IP的隧道协议,允许在GTP UProtocolEnt...