(十一)QPainter绘图, QPixmap,QImage,QPicture,QBitmap

 

 

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QFont>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    x = 20;
    ui->setupUi(this);

    connect(ui->move, &QPushButton::clicked, this, [=]()
    {
       // 刷新窗口
        update();   // 系统调用paintEvent 函数
    });
}

Widget::~Widget()
{
    delete ui;
}


void Widget::paintEvent(QPaintEvent *)
{
    // 创建画家类对象
    QPainter p(this);   // 指定绘图设备

#if 0
    // 创建新画笔 -- 轮廓
    QPen pen;
    pen.setColor(/*Qt::green*/QColor(0, 255, 0));
    pen.setWidth(10);   // 像素
    pen.setStyle(Qt::DotLine);

    // 闭合区域使用画刷
    QBrush brush(QPixmap(":/Image/face.png"));
    p.setBrush(brush);

    // 将新画笔设置给画家类
    p.setPen(pen);
    // 画背景图
    p.drawPixmap(0, 0, QPixmap(":/Image/xks.png"));

    // 画直线
    p.drawLine(QPoint(100, 100), QPoint(300, 500));

    // 画椭圆
    p.drawEllipse(QPoint(200, 200), 100, 50);

    // 画矩形
    p.drawRect(400, 200, 200, 200);

    // 写字
    QFont font("华文彩云", 48, 75, true);
    p.setFont(font);
    p.drawText(100, 400, "我是中国人, 我爱我的祖国!!!");

    int width = this->width();
    int heght = this->height();
#endif
    // 提供笑脸
    x += 5;
    if(x > this->width())
    {
        x = 20;
    }
    p.drawPixmap(x, 100, QPixmap(":/Image/sunny.png"));

}

 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    /*
     *  1. 回调函数
     *  2. 此函数不需要用户与调用, 再刷新的时候会自定调用
     *      1. 窗口显示的时候
     *      2. 最大化, 最小化
     *      3. 窗口被这遮挡, 重新显示的时候
     *      4. 用户强制刷新的时候
     *      5. ...........
     *  3. 如果想使用画家类在窗口中画图, 操作必须在paintEvent函数中完成
    */
    void paintEvent(QPaintEvent *);

private:
    Ui::Widget *ui;
    int x;
};

#endif // WIDGET_H

 QPixmap,QImage,QPicture

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPicture>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 在QPixmap中画图
    QPixmap pix(300, 300);  // 纸的大小
    pix.fill(Qt::red);
    QPainter p(&pix);
    p.setPen(QPen(Qt::green, 10));
    p.drawRect(10, 10, 280, 280);
    p.drawEllipse(150, 150, 50, 50);
    pix.save("D:\\mypixmap.png");

    // 指定绘图设备 1. 构造函数中(参数是绘图设备)
    // 2. begin(参数是绘图设备)
     //    end();
     // 在QImage中画图
    QImage img(300, 300, QImage::Format_RGB32);  // 纸的大小
    img.fill(Qt::red);
    p.begin(&img);
    p.setPen(QPen(Qt::green, 10));
    p.drawRect(10, 10, 280, 280);
    p.drawEllipse(150, 150, 50, 50);
    p.end();
    img.save("D:\\myImage.png");

    // 在QPicture中画图
    // 1. 保存的是绘图步骤 -- 画家类
    // 2. 不是图片, 二进制文件(save保存生成的文件)
    // 3. 不依赖平台
   QPicture pic;  // 纸的大小
   p.begin(&pic);
   p.setPen(QPen(Qt::green, 10));
   p.drawRect(10, 10, 280, 280);
   p.drawEllipse(150, 150, 50, 50);
   p.end();
   pic.save("D:\\mypic.aaa");
}

// QWidget
// QPixmap QImage QPicture QBitmap(黑白图片)
// QBitmap 父类 QPixmap
// QPixmap -- 图片类, 主要用来显示, 它针对于显示器显示做了特殊优化, 依赖于平台的, 只能在主线程中使用(UI线程)
// QIamge -- 图片类 , 不依赖有平台, (图片传输 , 可以在多线程中对其进行操作)
Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    QPicture pic;
    pic.load("D:\\mypic.png");
    p.drawPicture(100, 100, pic);
}

 

QPixmap:
    p.load("路径");———加载图片
    p.drawPixmap(b);
    a.专门为图像在屏幕上的显示做了优化,依赖于平台
    b.主要应用于平台上的图形显示,在不同的平台上拥有相同是显示效果
QBitmap b;--
    p.drawPixmap(b)
    是QPixmap的一个子类,只显示黑白色
QImage
    a.使用独立于硬件的绘制系统,专门为图像的像素级访问做了优化
    b.可以在多线程中使用
    c.可以修改图片中的任意一个像素值
QPicture -- 二进制文件
    a.记录和重现QPainter 的各种命令
    b.与平台无关
    
QPixmap 和 QImage 的直接相互转换
    1.QPixmap-->QImage:QPixmap::toImage()
    2.QImage-->QPixmap:QPixmap::fromImage() [static]

 

posted @ 2019-04-23 22:45  狂奔~  阅读(5403)  评论(0编辑  收藏  举报