本文来研究一下Qt Graphics-View的打印功能实现。
在Qt的官方文档中介绍了Graphics-View的打印相关内容。

Qt中对打印的支持是有一个独立的printsupport模块来完成的,所以,要想在程序中使用Qt的打印功能,必须先在pro文件中添加下面这句代码:
QT += printsupport

图形视图通过它的展示函数:QGraphicsScene::render()和QGraphicsView::render()提供单线(single-line)打印。这些函数提供相同的API,通过将QPainter传递给展示函数,你可以打印场景、视图的全部或部分内容。例子显示了如何使用QPainter将场景的全部内容打印到整页纸上。

QGraphicsScene scene;
scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));

QPrinter printer;
if (QPrintDialog(&printer).exec() == QDialog::Accepted) {
  QPainter painter(&printer);
  painter.setRenderHint(QPainter::Antialiasing);
  scene.render(&painter);
}

场景和视图函数展示函数的差异是一个在场景坐标,另一个在视图坐标。QGraphicsScene::render()常用于打印无变换的场景的全部内容,如画几何数据文档等。QGraphicsView::render()适合于打印屏幕快照(screenshots),缺省情况下,它展示视图端口中的当前内容。

QGraphicsScene scene();
scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));
//QPixmap pixmap; 官当文档这样是错误的,pixmap初始化为空,没空间可不行
QPixmap pixmap(scene->sceneRect().width(), scene->sceneRect().height());
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
painter.end();
pixmap.save("scene.png");

当源区域和目标区域的大小不匹配时,源内容进行伸展以适合目标区域。通过传递Qt::AspectRatioMode给你正调用的展示函数,你可以在源内容伸缩时,保持或忽略纵横比。

下面是我实验的代码,仅供参考。

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 
void MainWindow::printReview()
{
    QPrinter printer(QPrinter::HighResolution);
    // 创建打印预览对话框
    QPrintPreviewDialog preview(&printer, this,
                                windowFlags() | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);
    // 当要生成预览页面时,发射paintRequested()信号
    connect(&preview, SIGNAL(paintRequested(QPrinter *)),
            this, SLOT(printPreview(QPrinter *)));
    preview.exec();
}

void MainWindow::printPreview(QPrinter *printer)
{
    QPainter painter(printer);
    painter.setRenderHints(QPainter::Antialiasing |
                           QPainter::TextAntialiasing |
                           QPainter::SmoothPixmapTransform,
                           true);
    m_pScene->render(&painter);
}

void MainWindow::printToPrinter()
{
    QPrinter printer(QPrinter::HighResolution);
    if (QPrintDialog(&printer).exec() == QDialog::Accepted)
    {
        QPainter painter(&printer);
        painter.setRenderHint(QPainter::Antialiasing);
        m_pScene->render(&painter);
    }
}

void MainWindow::printToImage()
{
    // 记住,一定要初始化QPixmap的大小
    QPixmap pixmap(m_pScene->sceneRect().width(),
                   m_pScene->sceneRect().height());
    pixmap.fill(Qt::white);
    QPainter painter(&pixmap);
    painter.setRenderHint(QPainter::HighQualityAntialiasing);
    m_pView->render(&painter);
    painter.end();

QString filePath = QFileDialog::getSaveFileName(this, "Save Image",
                       "", "BMP (*.bmp);;PNG (*.png);;JPEG (*.jpg *.jpeg);;All files (*.*)");
    if (filePath == "" && pixmap.isNull())
    {
        qDebug() << "Error!";
        return;
    }

pixmap.save(filePath);
}

void MainWindow::printToPdf()
{
    QPrinter printer(QPrinter::HighResolution);
    printer.setPageSize(QPrinter::A4);
    printer.setOrientation(QPrinter::Portrait);
    printer.setOutputFormat(QPrinter::PdfFormat);
    // file will be created in your build directory (where debug/release directories are)
    printer.setOutputFileName("MyGV-OpenGL.pdf");

QPainter painter;
    if(!painter.begin(&printer))
    {
        qDebug() << "Error!";
        return;
    }
    m_pScene->render(&painter);
    painter.end();
}

Qt Graphics-View的打印功能实现的更多相关文章

  1. 关于QT Graphics View开启OpenGL渲染后复选框、微调框等无法正常显示的问题

    之前学习QT Graphics View框架,除了基本的图元外,还可以通过QGraphicsProxyWidget类添加QT的基本Widget(如按钮.复选框.单选框等),常使用的场景类接口如下: Q ...

  2. qt Graphics View Framework(非重点)

    Graphics View 提供了一种接口,用于管理大量自定义的 2D 图形元素,并与之进行交互:还提供了用于将这些元素进行可视化显示的观察组件,并支持缩放和旋转. 说明;Graphics View ...

  3. Qt 之 Graphics View Framework 简介

    Graphics View Framework 交互式 2D 图形的 Graphics View 框架概述.自 Qt4.2 中引入了 Graphics View,以取代其前身 QCanvas.Grap ...

  4. Qt 学习之路:Graphics View Framework

    Graphics View 提供了一种接口,用于管理大量自定义的 2D 图形元素,并与之进行交互:还提供了用于将这些元素进行可视化显示的观察组件,并支持缩放和旋转.我们通常所说的 Linux 的 KD ...

  5. 浅谈QT打印功能实现

    QT作为一款轻量级的集成开发环境,其设计的目标是使开发人员利用QT这个应用程序框架更加快速及轻易的开发应用程序.要达到此目的,要求QT必须能够跨平台,QT能够在32位及64位的Linux,MAC OS ...

  6. Qt 学习之路 2(30):Graphics View Framework

    Qt 学习之路 2(30):Graphics View Framework 豆子 2012年12月11日 Qt 学习之路 2 27条评论 Graphics View 提供了一种接口,用于管理大量自定义 ...

  7. pyqt5 graphics view简单使用

    Graphics View提供了一个平面,用于管理和交互大量自定义的2D图形图元,以及一个用于可视化图元的视图窗口小部件,支持缩放和旋转. 该框架包括一个事件传播架构,允许场景中图元的精确双精度交互功 ...

  8. Graphics View框架

    Qt4.2开始引入了Graphics View框架用来取代Qt3中的Canvas模块,并在很多地方作了改进,Graphics View框架实现了模型-视图结构的图形管理,能对大量图元进行管理,支持碰撞 ...

  9. Qt Model/View(官方翻译,图文并茂)

    http://doc.trolltech.com/main-snapshot/model-view-programming.html 介绍 Qt 4推出了一组新的item view类,它们使用mode ...

随机推荐

  1. Comet OJ 夏季欢乐赛 篮球校赛

    Comet OJ 夏季欢乐赛 篮球校赛 题目传送门 题目描述 JWJU注重培养学生的"唱,跳,rap,篮球"能力.于是每年JWJU都会举办篮球校赛,来给同学们一个切磋篮球技术的平台 ...

  2. python将数组写入文件

    import numpy as npdata = np.array([[1,2], [3,4]]) np.savetxt('out.txt', data, fmt="%d") #保 ...

  3. Vyos的基本配置

    修改用户密码 Enter configuration mode configure Set password set system login user [username] authenticati ...

  4. python基础之九:文件操作

    1.绝对路径与相对路径 path1 = "D:\orders.txt" # 绝对路径:包含根地址的路径 path2 = "homework.py" # 相对路径 ...

  5. html--前端javascript初识

    一.JavaScript简介 JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,有了JavaScript,可使网页变得生动.使用它的目的是与HTML超文本标识语言.Java 脚本语 ...

  6. 为什么说JAVA程序员必须掌握SpringBoot?

    原文链接:https://w.url.cn/s/AuDahfb SpringBoot 2.0 的推出又激起了一阵学习 SpringBoot 热,那么, SpringBoot 诞生的背景是什么?Spri ...

  7. dos下编辑过sh脚本后无法运行

    情景: 同样的的脚本,在不同的机器下运行有的可以成功,有的运行失败, 前提:sh脚本windos下编辑过. 脚本在windows上修改之后,在每行尾部多了个 ^M,导致sh脚本在执行的时候可能shba ...

  8. ABP 菜单和权限

    大致操作步骤,原理之后补充. 添加菜单: 在 ContractOwner.Web.Startup.ContractOwnerNavigationProvider 的SetNavigation方法中添加 ...

  9. three.js 添加 图形控制界面 gui

    需要导入这个js: import { GUI } from '/three.js/jsm/libs/dat.gui.module.js'; 局部代码: var params = { color: 0x ...

  10. R语言学习(基本知识)

    0)查看帮助 library(help="ballgown") #查看包帮助 getwd() #查看当前工作目录 setwd('C:/Users/djx/Desktop/信号肽系统 ...