linux下qt打印功能如何实现,Qt Graphics-View的打印功能实现

本文来研究一下Qt Graphics-View的打印功能实现。

在Qt的官方文档中介绍了Graphics-View的打印相关内容。

7937c6680e73fc619cde8715a1586200.png

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() <

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() <

return;

}

m_pScene->render(&painter);

painter.end();

}

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

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

qt Graphics View Framework&lpar;非重点&rpar;

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

Qt 之 Graphics View Framework 简介

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

Qt 学习之路:Graphics View Framework

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

浅谈QT打印功能实现

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

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

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

pyqt5 graphics view简单使用

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

Graphics View框架

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

Qt Model&sol;View(官方翻译,图文并茂)

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

随机推荐

ASP&period;NET 多语言的实现(后台消息&plus;前台消息&plus;页面自动绑定)

一 前言 界面支持多种语言,在使用ASP.NET自带的多语言方案时遇到下列问题: 在做管理类的功能时,有添加.修改和查看页面,需要支持多语言的控件基本相同,但要维护多处,产生冗余(ASP.NET有共享 ...

js日期格式化函数

/** * @author ocq * * 对Date的扩展,将 Date 转化为指定格式的String * 月(M).日(d).12小时(h).24小时(H).分(m).秒(s).周(E).季度(q ...

SqlSever基础 dateadd year,增加五年

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

xcode plugin

http://alcatraz.io/ https://github.com/macoscope/CodePilot prepo  curl -fsSL https://raw.githubuserc ...

&lbrack;Android&rsqb;mac下开发环境搭建

好像没神马好些的? 1.下载adt-bundle-mac-x86_64bit(http://developer.android.com/sdk/installing/bundle.html) 2.解压 ...

CentOS6&period;5安装MySQL5&period;6

CentOS6.5安装MySQL5.6,开放防火墙3306端口,允许其他主机使用root账户密码访问MySQL数据库 查看操作系统相关信息 ** 该查看方法只适用于CentOS6.5 (lsb_rel ...

canvas刮奖

(function (global, factory) { typeof module === 'object' && typeof module.exports === 'objec ...

Java对象序列化与RMI

对于一个存在于Java虚拟机中的对象来说,其内部的状态只保持在内存中.JVM停止之后,这些状态就丢失了.在很多情况下,对象的内部状态是需要被持久化下来的.提到持久化,最直接的做法是保存到文件系统或是数 ...

测试一下你的T-SQL基础知识-subquery

一直以为自己SQL挺好的,没有想到今天在重构存储过程遇到了一个子查询的问题,修改为自连接之后发现居然结果不对,于是有了下面的测试.假设表中有如下数数据,请问Query1,Query2,Query3的查 ...

oracle主键约束、唯一键约束和唯一索引的区别

(1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除: (2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空: (3)相同字段序 ...

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值