Qt学习笔记--绘图

绘图工具

1.画家
#include<QPainter>
构造函数
在这里插入图片描述

2.画笔
#include<QPen>
构造函数
在这里插入图片描述
3.画刷
#include<QBrush>
构造函数
在这里插入图片描述

4.绘图设备
QPixmap:针对屏幕进行优化,和平台有关,不能对图片进行修改
QImage:和平台无关,可以对图片进行修改,在线程中绘图
QPicture:保存绘图的状态(二进制文件)

QPixmap

针对屏幕进行优化,和平台有关,不能对图片进行修改

用法

用下面简单的代码实现向主窗口绘图

--------------------------Widget.h--------------------------

------------------------------------------------------------
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
	//绘图事件
    void paintEvent(QPaintEvent *);

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    int x;
};
#endif // WIDGET_H



--------------------------Widget.cpp--------------------------

--------------------------------------------------------------
void Widget::paintEvent(QPaintEvent *)
{
    //QPainter p(this);

    QPainter p;//创建画家对象
    p.begin(this);//指定当前窗口为绘图设备
    //绘图操作
    
    //定义画笔
    QPen pen;
    pen.setWidth(5);
    pen.setColor(QColor(14,9,234));
    pen.setStyle(Qt::DashDotLine);

    //创建画刷对象
    QBrush brush;
    brush.setColor(Qt::red);
    brush.setStyle(Qt::Dense1Pattern);


    //画笔交给画家
    p.setPen(pen);

    //画直线
    p.drawLine(50,50,150,50);
    p.drawLine(50,50,50,150);

    //画矩形
    p.drawRect(150,150,100,50);

    //画圆形
    p.drawEllipse(QPoint(150,150),50,25);//圆心,上端距圆心距离,下端距圆心距离

    //加载图片
    p.drawPixmap(x,180,80,80,QPixmap("../Image/233.jpg"));//此处格式表示是上级目录里的文件Image
    													  //里的2333.jpg图片

    p.end();

}



不用窗口作为绘图设备,在Widget的构造函数实现

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

    QPixmap pixmap(400,300);

    QPainter p(&pixmap);
    //画家填充背景色
    p.fillRect(0,0,400,300,QBrush(Qt::white));

    pixmap.fill(Qt::blue);

    p.drawPixmap(0,0,80,80,QPixmap("../me/t012f79c8d50e170027.jpg"));

    //保存图片
    pixmap.save("../pixmap.png");//图片保存在Debug的上级目录的名为pixmap.png的文件中
}

注意点

1.重写绘图事件:如果在窗口绘图必须放在绘图事件里实现
2.绘图事件内部自动调用—窗口需要重绘的时候(状态改变)
3.准备步骤基本为:创建画家、确定绘图设备、画笔、画刷。
4.pixmap.save("…/pixmap.png");//图片保存在Debug上级目录的名为pixmap.png的文件中,如果没有…/就是在debug文件里

子类QBitmap

QBitmap与QPixmap不同:QBitmap类提供了单色(1位深度)像素映射。
QBitmap类是一个单色的画图设备,主要用于创建自定义QCursor和QBrush对象,构造QRegion对象,以及设置位图和小部件的遮罩。因此内存相比于原来要小得多,用法基本与QPixmap同
Widget.h和上同
在以窗口为绘图设备的基础上

--------------------------Widget.cpp--------------------------

--------------------------------------------------------------
void Widget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    //QPixmap图片
    QPixmap pixmap;
    pixmap.load("../Image/2333.jpg");//加载图片
    p.drawPixmap(0,200,50,50,pixmap);


    //QBitmap图片背景白色
    QBitmap bitmap;
    bitmap.load("../Image/666.jpg");
    p.drawPixmap(200,200,50,50,bitmap);
}

对比就能看出差别
在这里插入图片描述

QImage

和平台无关(和平台的适应性降低),可以对图片进行修改,在线程中绘图

用法

仍是在QWidget的构造函数

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

    //透明背景
    QImage image(400,300,QImage::Format_ARGB32);
    QPainter p;
    p.begin(&image);//将image设为绘图设备

    //绘图,线程绘图,对像素点进行操作
    p.drawImage(0,0,QImage("../Image/2333.jpg"));

    //对绘图设备50*50像素点进行操作
    for(int i= 0;i<50;i++)
    {
        for(int j= 0;j<50;j++)
        {
            image.setPixel(i,j,qRgb(0,255,255));//rgb值设置颜色
            image.pixel(QPoint(i,j));
        }
    }//让它们变蓝

    p.end();

    image.save("../iamge.png");//保存到上一级路径

}

QImage与QPixmap转换

void Widget::paintEvent(QPaintEvent *event)
{
	QPainter p(this);

    //Pixmap和Image转换
    QPixmap pixmap;
    pixmap.load("../Image/2333.jpg");

    //QPixmap->QImage
    QImage tempImage=pixmap.toImage();

    p.drawImage(0,0,tempImage);

    //QImage->QPixmap
    QImage image;
    image.load("../Image/2333.jpg");

    QPixmap tempPixmap=QPixmap::fromImage(image);
    p.drawPixmap(100,0,100,100,tempPixmap);
}

要注意两个转换有点不同

QPicture

保存绘图的状态(二进制文件),适合跨平台使用

用法

仍是在QWidget的构造函数

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

    QPicture pic;
    QPainter p;
    p.begin(&pic);

    p.drawPixmap(0,0,80,80,QPixmap("../me/t01dde92c7fb6aa61f2.jpg"));
    p.drawLine(50,50,150,50);

    p.end();
    pic.save("../picture.png");//保存为二进制文件
}

想用窗口为绘图设备
就必须重写绘图事件

--------------------------Widget.cpp--------------------------

--------------------------------------------------------------
void Widget::paintEvent(QPaintEvent *event)
{
    QPicture picture;
    picture.load("../picture.png");//加载文件
    QPainter p(this);
    p.drawPicture(0,0,picture);//读取二进制文件
    p.end();
}

可以看出三者使用起来差别并不是特别大,各有各的优点
常用共同函数:
1.为设备添加图片
load
load(const QString &fileName, const char *format = nullptr)
2.保存
save
save(const QString &fileName, const char *format = nullptr)1


  1. 此处只列出了三者通用的使用方法 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值