导语

Qt提供了四个类来处理图像数据:QImageQPixmapQBitmapQPicture,它们也都是常用的绘图设备。其中QImage主要用来进行I/O处理,它对I/O处理操作进行了优化,而且也可以用来直接访问和操作像素;QPixmap主要用来在屏幕上显示图像,它对在屏幕上显示图像进行了优化;QBitmapQPixmap的子类,它是一个便捷类,用来处理颜色深度为1的图像,即只能显示黑白两种颜色;QPicture用来记录并重演QPainter命令。这一节我们只讲解QPixmap

环境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2

目录

  • 一、简单绘制图片
  • 二、平移图片
  • 三、缩放图片
  • 四、旋转图片
  • 五、扭曲图片

正文

一、简单绘制图片

1.这次我们重新创建一个Qt Gui应用,项目名称为painter_2,在类信息页面,将基类更改为QDialog,类名使用默认的Dialog即可。

2.然后在源码目录中复制一张图片,比如这里是一张背景透明的logo.png图片,如下图所示。

3.在dialog.h文件中添加重绘事件处理函数的声明:

protected:void paintEvent(QPaintEvent *);

4.到dialog.cpp文件中先添加头文件包含#include <QPainter>,然后添加函数的定义:

void Dialog::paintEvent(QPaintEvent *)
{QPainter painter(this);QPixmap pix;pix.load("../painter_2/logo.png");painter.drawPixmap(0, 0, 129, 66, pix);
}

这里使用了相对路径,因为Qt Creator默认是使用影子构建,即编译生成的文件在painter_2-build-desktop-Debug这样的目录里面,而这个目录就是当前目录,所以源码目录就是其上级目录了。大家可以根据自己的实际情况来更改路径,也可以使用绝对路径,不过最好使用资源文件来存放图片。drawPixmap()函数在给定的矩形中来绘制图片,这里矩形的左上角顶点为(0, 0)点,宽129,高66,如果这个跟图片的大小不相同,默认会拉伸图片。运行效果如下图所示。

(注意:下面的操作涉及到了坐标系统,这里不再详细讲解,大家先进行操作查看效果,具体的坐标内容将在下一节讲解。)

二、平移图片

QPainter类中的translate()函数实现坐标原点的改变,改变原点后,此点将会成为新的原点(0,0)。下面来看一个例子。

paintEvent()函数里面继续添加如下代码:

painter.translate(100, 100); //将(100,100)设为坐标原点
painter.drawPixmap(0, 0, 129, 66, pix);

运行程序,效果如下图所示。

这里将(100,100)设置为了新的坐标原点,所以下面在(0,0)点贴图,就相当于在以前的(100,100)点贴图。

三、缩放图片

我们可以使用QPixmap类中的scaled()函数来实现图片的放大和缩小。

paintEvent()函数中继续添加代码:

qreal width = pix.width(); //获得以前图片的宽和高
qreal height = pix.height();
//将图片的宽和高都扩大两倍,并且在给定的矩形内保持宽高的比值不变
pix = pix.scaled(width*2, height*2, Qt::KeepAspectRatio);
painter.drawPixmap(70, 70,pix);

其中参数Qt::KeepAspectRatio,是图片缩放的方式。我们可以查看其帮助。将鼠标指针放到该代码上,当出现F1提示时,按下F1键,这时就可以查看其帮助了。当然我们也可以直接在帮助里查找该关键字。如下图所示。

这里有三个值,只看其图片就可大致明白,Qt::IgnoreAspectRatio是不保持图片的宽高比,Qt::KeepAspectRatio是在给定的矩形中保持宽高比,最后一个也是保持宽高比,但可能超出给定的矩形。这里给定的矩形是由我们显示图片时给定的参数决定的,例如painter.drawPixmap(0,0,100,100,pix);就是在以(0,0)点为起始点的宽和高都是100的矩形中。

运行程序效果如下图所示。

四、旋转图片

旋转使用的是QPainter类的rotate()函数,它默认是以原点为中心进行旋转的。我们要改变旋转的中心,可以使用前面讲到的translate()函数完成。

paintEvent()函数中继续添加如下代码:

painter.translate(64, 33); //让图片的中心作为旋转的中心
painter.rotate(90); //顺时针旋转90度
painter.translate(-64,-33); //使原点复原
painter.drawPixmap(100, 100, 129, 66, pix);

这里必须先改变旋转中心,然后再旋转,然后再将原点复原,才能达到想要的效果。 运行程序,效果如图所示。

五、扭曲图片

实现图片的扭曲,是使用的QPainter类的shear(qreal sh,qreal sv)函数完成的。它有两个参数,前面的参数实现横行变形,后面的参数实现纵向变形。当它们的值为0时,表示不扭曲。

paintEvent()中继续添加如下代码:

painter.shear(0.5, 0); //横向扭曲
painter.drawPixmap(100, 0, 129, 66, pix);

运行效果如下图所示。

结语

这一节中只讲解了QPixmap类的简单应用。对于后面讲到的图片变形的应用,细心的读者可能已经发现了,旋转了坐标系统以后再绘制图片都是纵向的,这就是因为旋转了坐标系统而没有进行恢复造成的。具体的坐标操作我们会在下一节讲解。

第15篇 2D绘图(五)绘制图片相关推荐

  1. [Qt教程] 第15篇 2D绘图(五)绘制图片

    [Qt教程] 第15篇 2D绘图(五)绘制图片 楼主  发表于 2013-5-2 17:59:00 | 查看: 886| 回复: 3 绘制图片 版权声明 该文章原创于Qter开源社区(www.qter ...

  2. 【Qt】2D绘图之绘制图片

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 简单绘制图片 04. 平移图片 05. 缩放图片 06. 旋转图片 07. 扭曲图片 08. 附录 01. 概述 Qt提供 ...

  3. [Qt教程] 第13篇 2D绘图(三)绘制文字

    [Qt教程] 第13篇 2D绘图(三)绘制文字 楼主  发表于 2013-4-25 23:04:46 | 查看: 720| 回复: 0 绘制文字 版权声明 该文章原创于Qter开源社区,作者yafei ...

  4. [Qt教程] 第11篇 2D绘图(一)绘制简单图形

    [Qt教程] 第11篇 2D绘图(一)绘制简单图形 楼主  发表于 2013-4-23 12:52:35 | 查看: 1398| 回复: 5 绘制简单图形 版权声明 该文章原创于Qter开源社区,作者 ...

  5. [Qt教程] 第14篇 2D绘图(四)绘制路径

    [Qt教程] 第14篇 2D绘图(四)绘制路径 楼主  发表于 2013-4-27 12:40:52 | 查看: 611| 回复: 0 绘制路径 版权声明 该文章原创于Qter开源社区(www.qte ...

  6. [Qt教程] 第20篇 2D绘图(十)图形视图框架(下)

    [Qt教程] 第20篇 2D绘图(十)图形视图框架(下) 楼主  发表于 2013-5-4 15:43:02 | 查看: 861| 回复: 0 图形视图框架(下) 版权声明 该文章原创于Qter开源社 ...

  7. [Qt教程] 第19篇 2D绘图(九)图形视图框架(上)

    [Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主  发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘 ...

  8. 【Qt】2D绘图之绘制图像(二)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制QImage图像 04. 绘制QPixmap图像 05. 绘制QPicture图像 06. 综合对比 07. 附录 0 ...

  9. 【Qt】2D绘图之绘制简单的图形

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制图形 04. 画笔和画刷 05. 绘制弧线 06. 附录 01. 概述 Qt中提供了强大的2D绘图系统,可以使用同一A ...

最新文章

  1. shell脚本中的特殊变量与if条件测试
  2. ZeroMQ接口函数之 :zmq_poll - I/O多路技术
  3. spring3.0注解
  4. pytorch topk()
  5. VS2017调用MySQL 8.0(附上C++程序)
  6. 如何发布一个npm包?
  7. 【CF1344D】Résumé Review【数学】【二分】
  8. [Pku 2774] 字符串(六) {后缀数组的构造}
  9. Serverless实战之路
  10. nmos导通流向_技术参数详解,MOS管知识最全收录!
  11. python编程入门第3版pdf-Python程序设计 第3版pdf
  12. Google PR 到4了
  13. iOS - 正则表达式判断邮箱、身份证..是否正确
  14. 炜煌E30 E31微型热敏打印机 STM32 串口驱动
  15. c语言1至100的累乘求和,c语言 累加累乘课件.ppt
  16. 一招教你解决“删除:需要管理员权限才能删除的文件夹”
  17. 关于边缘计算与区块链结合系统研究的综述
  18. SpringBoot 的请求参数校验注解
  19. js undefined和null区别
  20. 计算机学霸电视剧,“学霸爱上学渣”的4部电视剧,部部甜到爆炸,全看过的真有眼光...

热门文章

  1. 基于Node.js的3DTiles三维倾斜摄影模型爬虫
  2. 分形之城--没过,吃宵夜去了,生蚝真好吃
  3. 微信小程序实现星星评分
  4. Smart-Link、Monitor-Link介绍与配置举例
  5. Python系列-Django-Ninja
  6. 【python】pythonPTA编程练习2
  7. 安装vim的最新版本
  8. 介绍NPOI 的颜色卡、名称以及索引
  9. 华硕FL5900U笔记本电脑重装win10专业版详细操作教程
  10. 常用的配电箱有哪几种?