众所周知,使用QLabel的setPixmap()就可以将图片显示出来,做视屏解码后显示也可以如此。但是为何我今天还要费力使用基函数drawPixmap()来做绘图?理由有这么些吧:

1、使用QLabel很耗费CPU,播放画面过多有卡卡的感觉;

2、drawPixmap()使用GPU处理,相对减轻了CPU的负担;

当然,今天这里,只是给出基本思路方法,并非对视频解码后的图像做原样的解析。

那么,我们开始吧!

a、首先使用Qtcreator建立项目吧,我这里取名Painter,然后我在网上下载了4副图片,个人觉得还是挺漂亮的,一会展示给大家看;

b、下来新建文件夹,名字就叫images吧,此时了,便于使用,最好把图片名字改成便于自己记忆的。然后添加Qt资源,将4副图全部导入资源文件。

c、此时,我们回到项目的ui文件,在设计器里面,拖进来4个QFrame或者QWidget控件,我是拖进来4个QFrame的,因为可以勾划边框;

d、下来对命名后的4个QWidget使用网格布局吧;

e、此时回到paint的.h文件,加上几个头文件:

  1. #include <QPixmap>
  2. #include <QPaintEvent>

并在私有属性添加以下:

  1. QPixmap image1;
  2. QPixmap image2;
  3. QPixmap image3;
  4. QPixmap image4;

在protected方法里面添加:

  1. void paintEvent(QPaintEvent *);

f、好了,我们回到对应cpp文件吧,首先了,我们已经声明了几个QPixmap,我们需要对这几个变量处理,我在构造函数里:

  1. image1.load(":/images/chuyin1.jpg");
  2. image2.load(":/images/chuyin2.jpg");
  3. image3.load(":/images/chuyin3.jpg");
  4. image4.load(":/images/chuyin4.jpg");

此时,QPixmap已经与相对应的图片绑定了,下来我们需要让他显示出来:

  1. void PaintWidget::paintEvent(QPaintEvent *)
  2. {
  3. //void QPainter::drawPixmap(int x, int y, int width, int height, const QPixmap &pixmap)
  4. QPainter painter(this);
  5. int x1 = ui->view1Frame->pos().x();
  6. int y1 = ui->view1Frame->pos().y();
  7. painter.drawPixmap(x1,y1,ui->view1Frame->width(),ui->view1Frame->height(),image1);
  8. int x2 = ui->view2Frame->pos().x();
  9. int y2 = ui->view2Frame->pos().y();
  10. painter.drawPixmap(x2,y2,ui->view2Frame->width(),ui->view2Frame->height(),image2);
  11. int x3 = ui->view3Frame->pos().x();
  12. int y3 = ui->view3Frame->pos().y();
  13. painter.drawPixmap(x3,y3,ui->view3Frame->width(),ui->view3Frame->height(),image3);
  14. int x4 = ui->view4Frame->pos().x();
  15. int y4 = ui->view4Frame->pos().y();
  16. painter.drawPixmap(x4,y4,ui->view4Frame->width(),ui->view4Frame->height(),image4);
  17. }

划//的部分是专门贴上来让大家知道怎么使用drawpixmap()函数的,当然也可以使用其他的重载。

哦,对了,使用了画笔,怎么不给声明标识?我们在此cpp的头文件里面加上:

  1. #include <QPainter>

好了,大功告成。编译、运行,你看下面就是显示出来的图像:

怎么样?还不错吧!我们点击标题栏,进行放大,图片也跟着放大了。

http://blog.csdn.net/u010111033/article/details/53785223

使用QPainter的drawPixmap()绘制多幅图片 good的更多相关文章

  1. QPainter绘制图片填充方式(正常大小、剪切大小、自适应大小、平铺)

    Qt中QPainter提供了绘制图像的API,极大地方便了我们对图像的绘制. Qt中提供了QPixmap, QBitmap,QBitMapQImage,QPicture等图像绘图设备,它们的类关系如下 ...

  2. 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)

    利用QPainter绘制各种图形 Qt的二维图形引擎是基于QPainter类的.QPainter既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...

  3. QT 基本图形绘制

    QT 基本图形绘制 1.告诉绘制引擎一些东西 QPainter::Antialiasing 在可能的情况下,反锯齿       QPainter::TextAntialiasing 在可能的情况下,文 ...

  4. Qt之图形(QPainter的基本绘图)

    简述 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类. QPainter用来执行 ...

  5. python数字图像处理(5):图像的绘制

    实际上前面我们就已经用到了图像的绘制,如: io.imshow(img) 这一行代码的实质是利用matplotlib包对图片进行绘制,绘制成功后,返回一个matplotlib类型的数据.因此,我们也可 ...

  6. QT绘制系统简介

    #3个类:QPainter,QPainterDevice 和 QPaintEngine 三个类 #qpainter用于执行绘制操作 #QPainterDevice是一个二维空间抽象,允许qpainte ...

  7. Qt__绘制系统

    Qt绘制系统简介 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制.整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类. QPaint ...

  8. python matplotlib.pyplot对图像进行绘制

    imshow()是对图像进行绘制 imshow()函数格式为: matplotlib.pyplot.imshow(X, cmap=None) X: 要绘制的图像或数组. cmap: 颜色图谱(colo ...

  9. Qt 2D绘图之一:基本图形绘制和渐变填充

    Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.它们三者的关系如下图所示: QP ...

随机推荐

  1. 过滤Filter推断用户是否登录

    WEB.XML <!-- 用户session的 键 sessionKEY --> <context-param> <param-name>userSessionKe ...

  2. sparksql json 合并json数据

    java public class Demo { private static SparkConf conf = new SparkConf().setAppName("demo" ...

  3. 浅谈java枚举类

    一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...

  4. url操作等

    取得url ?及以前: baseUrl = url.substr(0,url.indexOf('?')+1) searchParam = searchParam.slice(0, -1);//去掉最后 ...

  5. Etag & If-None-Match 专题

    一.概述 缓存通俗点讲,就是将已经得到的‘东东’存放在一个相对于自己而言,尽可能近的地方,以便下次需要时,不会再二笔地跑到起始点(很远的地方)去获取,而是就近解决,从而缩短时间和节约金钱(坐车要钱嘛) ...

  6. $.extend(true,{},a,b)解析

    原文:$.extend(true,{},a,b)解析 版权声明: https://blog.csdn.net/bsfz_2018/article/details/81738437 什么是$.exten ...

  7. Linux下编译,要下载tar.xz,而不要下载zip,因为换行的编码不一样,对.h.cpp没有影响,但是对脚本有影响 good

    原因是 在win下编辑的时候,换行结尾是\n\r , 而在linux下 是\n,所以才会有 多出来的\r但是这个我是直接下载的官网文件解压的,没有动过啊. 破案了. linux下编译要下 .tar.x ...

  8. 转义及编码(\u, \x)

    首先前面的 \表示转义, \x:只是 16 进制的意思,后边跟两位,则表示单字节编码: \d:十进制:\o:八进制: 对于 \xaa ⇒ chr(0xaa) ⇒ chr(16*a+a) \u:unic ...

  9. fzu-1753 Another Easy Problem-高速求N!多少个月p

    它计算每个C(N,M)什么号码乘以像.... #include <iostream> #include<stdio.h> #include<vector> #inc ...

  10. Hadoop MapReduce编程入门案例

    Hadoop入门例程简介 一个.有些指令 (1)Hadoop新与旧API差异 新API倾向于使用虚拟课堂(象类),而不是接口.由于这更easy扩展. 比如,能够无需改动类的实现而在虚类中加入一个方法( ...