QT学习之绘图

绘图事件

void Widget::paintEvent(QPaintEvent *event)
{
    //实例化画家对象,this是指在当前widget设备上进行画画
    QPainter painter(this);

    //设置画笔, 要先设置画笔才会有显示
    QPen pen(QColor(255,0,0));
    pen.setStyle(Qt::DashLine);
    pen.setWidth(5);

    //让画家使用笔
    painter.setPen(pen);

    //设置画刷
    QBrush brush(QColor(10,2,15));
    brush.setStyle(Qt::VerPattern);//风格
    painter.setBrush(brush);//对封闭图形进行填充上色

    //画一条线
    painter.drawLine(QPoint(0,0),QPoint(100,100));
    //画圆
    painter.drawEllipse(QPoint(100,500),50,50);
    //画矩形
    painter.drawRect(QRect(100,50,20,20));
    //画文字
    painter.drawText(200,200,"你好");


}

在这里插入图片描述

高级设置

抗锯齿

    painter.drawEllipse(QPoint(110,110),100,100);
    painter.setRenderHint(QPainter::Antialiasing);//设置抗锯齿能力
    painter.drawEllipse(QPoint(400,110),100,100);//可以看到第二个圆更平滑些

在这里插入图片描述

移动绘画坐标系的坐标原点

painter.drawRect(QRect(100,100,200,100));
    painter.translate(300,0);//转移绘画坐标系的坐标原点,向x轴移动300,y轴不动

    
    painter.drawRect(QRect(100,100,200,100));
    painter.translate(300,0);
    painter.drawRect(QRect(100,100,200,100));

在这里插入图片描述

    QPainter painter(this);

    painter.drawRect(QRect(100,100,200,100));
    painter.translate(300,0);//转移绘画坐标系的坐标原点,向x轴移动300,y轴不动

    //保存画家状态
    painter.save();

    painter.drawRect(QRect(100,100,200,100));

    painter.translate(300,0);

    //还原画家状态
    painter.restore();

    painter.drawRect(QRect(100,100,200,100));

在这里插入图片描述

手动调用绘画事件

QT中的图片叫pixmap

点击按钮,图片会向右移动

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

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

    //点击移动按钮,图片右移
    connect(ui->pushButton,&QPushButton::clicked,this,[=](){
        //调用paintEvent(QPaintEvent *event)函数不能直接使用这个函数
        //如果要手动调用绘图事件,要用update更好
        this->pos_x =this->pos_x + 10;
        update();
    });
}

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

void Widget::paintEvent(QPaintEvent *event)
{
    //利用绘图来画资源图片
    QPainter painter(this);
    if(pos_x > this->width())//图片出了屏幕后回到原点
    {
        pos_x = 0;
    }
    painter.drawPixmap(QPoint(this->pos_x,10),QPixmap(":/new/prefix1/Image/onep.ico"));
}

去除按钮,实现图片自动移动

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

    //自动实现图片右移
    QTimer * timer = new QTimer(this);
    timer->start(50);
    connect(timer,&QTimer::timeout,this,[=](){
        this->pos_x =this->pos_x + 1;
        update();
    });
}

绘图设备

给图设备是指继承 QPainterDevice的子类。一共提供了四个这样的类,分别
是QPixmap、QBitmap、QImage和QPicture。其中,
QPixmap专门方图像在屏幕上的显示做了优化

QBitmap是 QPixmap_的一个子类,它的色深限定为1,可以使用QPixmap_的isQBitmap(函数来确定这个QPixmap_是不是一个QBitmap。

QImage.专门为图像的集素级访问做了优化。

QPicture_则可以记录和重现 QPainter_的各条命令。

QPixmap

注意要包含对应的头文件

    //Pixmap绘图设备
    QPixmap pix(300,300);

    //填充颜色
    pix.fill(Qt::white);
    
    //声明画家
    QPainter painter(&pix);//在QPixmap设备上画
    painter.setPen(QColor(155,0,0));
    painter.drawEllipse(QPoint(150,150),50,50);

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

QImage

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

    //QImage 绘图设备 可以对像素进行访问
    QImage ima(QSize(300,300),QImage::Format_MonoLSB);

    ima.fill(Qt::white);

    QPainter painter(&ima);
    painter.setPen(QColor(0,0,255));
    painter.drawEllipse(QPoint(150,150),50,50);

    ima.save("F:\\ima.png");
}

同时可以对像素进行访问

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

    //利用QImage 对像素进行修改
    QImage image;
    image.load(":/new/prefix1/Image/a_444982.jpg");

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

在这里插入图片描述

QPicture

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

    //QPicture 绘图设备  可以记录和重现绘图指令
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);//开始画
    painter.setPen(Qt::blue);
    painter.drawEllipse(QPoint(100,100),50,50);
    painter.end();//画完了

    //保存到磁盘
    pic.save("F:\\pic.zt");//后缀名可以自己起
}


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

    //重现QPicture的绘图指令
    QPicture pic;
    pic.load("F:\\pic.zt");

    pa.drawPicture(QPoint(0,0),pic);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值