zoukankan      html  css  js  c++  java
  • Qt 绘图事件:QPainter、QPaintEngine和QPaintDevice

    一、绘图,刷新界面的方法

    1、绘图事件

    一般在绘图事件中绘图

     1 void paintEvent(QPaintEvent *);//绘图事件在窗口重绘的时候(即状态改变)的时候调用
     2     {
     3         //1、创建画家对象
     4         QPainter p(this);//指定当前窗口为绘图设备
     5 
     6         //2、具体操作
     7         //画背景图    /* 不需要添加资源文件 */
     8         QPixmap("../Image/bk.png"));//参数:顶点坐标、长、宽
     9         //p.drawPixmap(rect(), QPixmap("../Image/bk.png"));//参数:定点坐标,宽,高,图片
    10 
    11         //画直线
    12         #if 0
    13         //定义画笔     用以绘制轮廓线
    14         QPen pen;
    15         pen.setWidth(5); //设置线宽
    16         //pen.setColor(Qt::red); //设置颜色
    17         pen.setColor( QColor(14, 9, 234) );//rgb设置颜色
    18         pen.setStyle(Qt::DashLine); //设置风格
    19         //把画笔交给画家
    20         p.setPen(pen);
    21         #endif
    22         p.drawLine(50,50,150,50);//起点和终点坐标
    23 
    24         //画矩形
    25         p.drawRect(50,50,150,150);
    26 
    27         //画圆
    28         p.drawEllipse(QPint(50,50),50,25);//参数:圆心    水平方向半径    垂直方向半径
    29         #if 0//画刷        用以用来填充
    30             QBrush brush; //创建画刷对象
    31             brush.setColor(Qt::red); //设置颜色
    32             brush.setStyle(Qt::Dense1Pattern);//设置样式
    33             p.setBrush(brush);//把画刷交给画家
    34         #endif
    35     }

    2、手动刷新

    update();//库函数update,间接调用paintEvent

    二、QBitmap和QPixmap
      QBitmap只有黑白2种颜色,而QPixmap彩色绘图
      当不需要彩色的时候,可以使用QBitmap;因为QBitmap耗费资源少。

    1 //QPixmap和QBitmap的使用方法基本相同
    2 QPainter p(this);
    3 p.drawPixmap(0,0, QPixmap("../image.png"));
    4 p.drawPixmap(200,0, QBitmap("../image.png"));//参数3    彩色图片显示的也是黑白

    三、常用的绘图设备

      一般情况,QPixmap用于显示;QImage用于传输;
    1、QPixmap:针对屏幕进行优化,和平台相关,不能对图片进行修改(像素点)

    1 QPixmap pixmap(400,300);//直接指定绘图设备的大小400*300
    2 QPainter p(&pixmap);    //画家
    3 #if 0
    4 //填充背景
    5     p.fillRect(0,0,400,300, QBrush(Qt::white));
    6     pixmap.fill(Qt::white);
    7 #endif
    8 p.drawPixmap(0,0,80,80, QPixmap("../image/face.png"));
    9 pixmap.save("../pixmap.jpg);    //保存画家画的图片

    2、QImage:和平台相关,可以对图片进行修改,可以在线程中绘图

     1 QImage image(400, 300, QImage::Format_ARGB32);//QImage::Format_ARGB32背景是透明
     2 QPainter p(&image);
     3 //绘图
     4 p.drawImage(0, 0, QImage("../Image/face.png"));//drawPixmap()也行
     5 //对绘图设备前50个像素点进行操作
     6 for(int i = 0; i < 50; i++)
     7 {
     8     for(int j = 0; j < 50; j++)
     9     {
    10         image.setPixel(QPoint(i, j), qRgb(0, 255, 0));
    11     }
    12 }
    13 image.save("../image.png");

    3、QPicture:保存绘图的状态(二进制文件)

    1 QPicture picture;
    2 QPainter p(&picture);
    3 p.drawPixmap(0,0,80,80, QPixmap("../image/face.png"));
    4 picture.save("../picture");//保存的是二进制文件
    5 #if 0//加载QPicture图片
    6   QPicture pic;
    7   pic.load("../picture");
    8 #endif

    4、QPixmap与QImage的转换
    //QImage用于传输、QPixmap用于显示

     1 QPainter p(this);
     2 QPixmap pixmap;
     3 pixmap.load("../Image/face.png");
     4 //QPixmap -> QImage
     5 QImage tempImage = pixmap.toImage();
     6 p.drawImage(0, 0, tempImage);
     7 
     8 QImage image;
     9 image.load("../Image/face.png");
    10 //QImage -> QPixmap
    11 QPixmap tempPixmap = QPixmap::fromImage(image);
    12 p.drawPixmap(100, 0, tempPixmap);
  • 相关阅读:
    IntelliJ Idea 2017 免费激活方法
    RabbitMq、ActiveMq、ZeroMq、kafka之间的比较
    Oracle锁的机制
    序列化和持久化的区别
    Hibernate框架之get和load方法的区别
    Hibernate框架之入门案例
    Oracle添加数据报文字与格式字符串不匹配错误
    Linux设备驱动程序 之 异步通知
    Linux设备驱动程序 之 poll和select
    Linux设备驱动程序 之 休眠
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13516118.html
Copyright © 2011-2022 走看看