Qt开发基础(12)——绘图事件

目录

1.绘图事件的基本操作

2.绘图事件的高级设置

 3.利用画家画资源图片

4.绘图设备 


1.绘图事件的基本操作

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

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

void Widget::paintEvent(QPaintEvent *)
{
    //实例化画家对象,this指定的是绘图设备
    QPainter painter(this);

    //设置画笔的颜色
    QPen pen(QColor(255,0,0));

    //设置笔的宽度
    pen.setWidth(3);

    //让画家使用这个颜色的笔
    painter.setPen(pen);

    //设置画刷
    QBrush brush(QColor(0,255,0));//或者 QBrush brush(QColor::green);

    //设置画刷风格
    brush.setStyle(Qt::Dense7Pattern);

    //让画家使用画刷
    painter.setBrush(brush);

    //画线
    painter.drawLine(QPoint(0,0),QPoint(100,100));
    //画圆:圆心,半径rx=ry,就是一个圆
    painter.drawEllipse(QPoint(100,100),50,50);

    //画圆:圆心,半径rx!=ry,就是一个椭圆
    painter.drawEllipse(QPoint(100,100),50,70);


    //画矩形
    painter.drawRect(QRect(20,20,50,50));

    //画文字
    painter.drawText(QRect(10,200,100,50),"hello world");
}

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

2.绘图事件的高级设置

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

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

void Widget::paintEvent(QPaintEvent *)
{

    QPainter painter(this);
    painter.drawEllipse(QPoint(100,50),50,50);

    //对于下面的圆设置一下抗锯齿的能力,就是没有毛刺,更加清晰,但效率较低
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawEllipse(QPoint(200,50),50,50);


    //画两个重合的矩形
    painter.drawRect(QRect(200,200,50,50));

    //为了不让重合,我们可以移动画家画的位置
    painter.translate(100,0);
    
    //还原画家的保存状态
    painter.restore();
    
    painter.drawRect(QRect(200,200,50,50));
}

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

 3.利用画家画资源图片

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

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

    //点击移动按钮,移动右图片,我们只需改x的位置即可
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        //如果要手动调用绘图事件,用updata()更新
        update();
    });

}

void Widget::paintEvent(QPaintEvent *)
{

    QPainter painter(this);

    //如果超出屏幕,从0开始
    if(posX>this->width())
    {
        posX=0;
    }
    posX+=20;//让这幅图每次按一次移动20个单位
    painter.drawPixmap(posX,0,QPixmap("D:/testImage/2.jpg"));

}

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

4.绘图设备 

 绘图设备时指继承QPainterDevice的子类,Qt一共提供了四个这样的类,分别如下所示:

  • QPixmap专门为图像在屏幕上的显示做了优化
  • QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用QPixmap的isQBitmap来确定这个QPixmap是不是QBitmap
  • QImage专门为图像的像素级访问做了优化
  • QPicture则可以记录和重现QPainter的各条命令

之前我们绘制都是往widget上画,现在我们往磁盘上画:

新建文件如下所示:

将Pixmap作为绘图设备:

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //Pixmap绘图设备
    QPixmap pix(300,300);//设定宽高

    //填充颜色
    pix.fill(Qt::white);

    //声明画家
    QPainter painter(&pix);//往pix上画
    painter.setPen(QPen(Qt::green));
    painter.drawEllipse(QPoint(150,150),100,100);

    //保存
    pix.save("D:/pix.png");
}

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

 



 将QImage作为绘图设备:可以对像素进行访问


    //QImage作为绘图设备
    QImage img(300,300,QImage::Format_RGB32);//宽高和格式
    img.fill(Qt::white);

    QPainter painter(&img);
    painter.setPen(QPen(Qt::green));
    painter.drawEllipse(QPoint(150,150),100,100);

    //保存
    img.save("D:/img.png");


像素访问:

widget.cpp如下:

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //Pixmap绘图设备
//    QPixmap pix(300,300);//设定宽高

//    //填充颜色
//    pix.fill(Qt::white);

//    //声明画家
//    QPainter painter(&pix);//往pix上画
//    painter.setPen(QPen(Qt::green));
//    painter.drawEllipse(QPoint(150,150),100,100);

//    //保存
//    pix.save("D:/pix.png");


    //QImage作为绘图设备
//    QImage img(300,300,QImage::Format_RGB32);//宽高和格式
//    img.fill(Qt::white);

//    QPainter painter(&img);
//    painter.setPen(QPen(Qt::green));
//    painter.drawEllipse(QPoint(150,150),100,100);

//    //保存
//    img.save("D:/img.png");



}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    //利用QImage 对像素进行修改
    QImage img;
    img.load("D:\\testImage\\2.jpg");

    //修改像素值
    for(int i=50;i<100;i++)
    {
        for(int j=50;j<100;j++)
        {
            QRgb value = qRgb(255,0,0);
            img.setPixel(i,j,value);
        }
    }
    painter.drawImage(0,0,img);


}


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



QPicture绘图设备:可以记录和重现绘图指令

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

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

    //QPicture绘图设备,可以记录和重现绘图指令
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);
    painter.setPen(QPen(Qt::cyan));
    painter.drawEllipse(QPoint(150,150),100,100);
    painter.end();//结束画画

    //保存磁盘
    pic.save("D:/pic.zt");
}

void Widget::paintEvent(QPaintEvent *)
{

}


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



重现QPicture的绘图指令

widget.cpp

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

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

    //QPicture绘图设备,可以记录和重现绘图指令
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);
    painter.setPen(QPen(Qt::cyan));
    painter.drawEllipse(QPoint(150,150),100,100);
    painter.end();//结束画画

    //保存磁盘
    pic.save("D:/pic.zt");
}

void Widget::paintEvent(QPaintEvent *)
{
    //重现绘图指令
    QPainter painter(this);
    QPicture pic;
    pic.load("D:/pic.zt");

    painter.drawPicture(0,0,pic);

}


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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI炮灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值