Qt 绘图设备

绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和 QPicture。其中,
1.QPixmap专门为图像在屏幕上的显示做了优化,和平台相关,不能对图片进行修改;
2.QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap;
3.QImage专门为图像的像素级访问做了优化,可以对图片进行修改,可以在线程中绘图
4.QPicture则可以记录和重现QPainter的各条命令,保存绘图的状态(二进制文件)。

例:使用QPixmap类的对象作为绘图设备

#include "mywidget.h"
#include "ui_mywidget.h"
#include<QPainter>
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    //这里因为我们不在窗口里面绘图,所以不用在MyWidget中重写paintEvent函数
    //本次指定绘图设备是Pixmap

    //绘图设备,400*300
    QPixmap pixmap(400,300);
    QPainter p(&pixmap);//创建画家对象并指定绘图设备

    //填充背景色为白色,两种方法
    pixmap.fill(Qt::white);
    //p.fillRect(0,0,400,300,QBrush(Qt::white));

    p.drawPixmap(0,0,80,80,QPixmap(":/new/prefix1/image/face.png"));

    //因为没有在窗口上绘图,所以要保存图片才能看效果
    pixmap.save("../pixmap.png");

}

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

例:使用QImage类的对象作为绘图设备

#include "mywidget.h"
#include "ui_mywidget.h"
#include<QImage>
#include<QPainter>
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);

    //创建一个绘图设备,QImage::Format_ARGB32背景是透明
    QImage image(400,300,QImage::Format_ARGB32);
    QPainter p(&image);

    //绘图
    p.drawImage(0,0,QImage(":/new/prefix1/image/face.png"));

    //对绘图设备前50个像素点进行操作
    for(int i=0;i<50;i++)
        for(int j=0;j<50;j++)
        {
            image.setPixel(QPoint(i,j),qRgb(0,255,255));
        }


    image.save("../image.png");

}

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


例:使用QImage类的对象作为绘图设备
mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QPaintEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
protected:
    void paintEvent(QPaintEvent *event);
private:
    Ui::MyWidget *ui;
};
#endif // MYWIDGET_H

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include<QPainter>
#include<QPicture>
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);

    QPicture picture;
    QPainter p(&picture);

    p.drawPixmap(0,0,80,80,QPixmap(":/new/prefix1/image/face.png"));

    p.end();//告诉系统终止记录(这句话别漏了!)

    //保存的是二进制文件
    picture.save("../picture.bin");
    //接下来我们要把上面存的这个二进制文件在窗口上绘图

}

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

void MyWidget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    QPicture pic;
    pic.load("../picture.bin");//加载二进制文件
    p.drawPicture(0,0,pic);
}

最后看一下QPixmap-与QImage的相互转换:

void MyWidget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    QPixmap pixmap;
    pixmap.load(":/new/prefix1/image/face.png");

    //QPixmap-->QImage
    QImage tempImage=pixmap.toImage();
    p.drawImage(0,0,tempImage);

    QImage image;
    image.load(":/new/prefix1/image/Luffy.png");
    //QImage-->QPixmap
    QPixmap tempPixmap=QPixmap::fromImage(image);
    p.drawPixmap(100,0,tempPixmap);



}
发布了241 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ShenHang_/article/details/104991925