本文来研究一下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();
}

最新文章

  1. 常用 Git 命令清单
  2. 前端知识杂烩(Javascript篇)
  3. Android_ListView简单例子
  4. ps应用
  5. 将 JAR 转为 EXE – EXE4J 的使用教程(第一期)(转载)
  6. InnoDB O_DIRECT选项漫谈(一)【转】
  7. 2.在程序中如何实现Cookie信息的设置,读取和删除
  8. REDIS key notification
  9. Java RMI 框架
  10. SQL基本语句(1)
  11. 【CTSC 2015】&amp;【APIO 2015】酱油记
  12. Solr高亮与Field权重
  13. lvs之 lvs原理架构介绍
  14. JS高级程序设计第3章读书笔记
  15. lightoj 1025 区间dp
  16. Docker的安装和测试
  17. [.net core] 在 Windows 中运行出现 WinHttpException: The parameter is incorrect
  18. [原]Jenkins(二十一) jenkins再出发Build periodically和Poll SCM
  19. phpmyadmin新姿势getshell
  20. U启动安装原版Win7系统教程

热门文章

  1. history.back(-1)和history.go(-1)的区别 (有错误)
  2. TensorFlow Lite for Android示例
  3. 原语:从0到1,从硬件指令集到OS原语,锁原语的哲学
  4. bzoj2287【POJ Challenge】消失之物 缺一01背包
  5. 洛谷 P1508
  6. JOI2013-2019
  7. iptables 常用命令解析
  8. redis 键值对 有效期设置
  9. Notepad++使用NppFTP插件编辑linux上的文件
  10. 如何减少 webpack 构建 vue 项目的编译时间