Qt桌面应用开发 第七天(绘图事件 绘图设备)

目录

1.绘图事件paintEvent

2.高级绘图

3.图片绘制

4.绘图设备

4.1QPixmap

4.2QBitmap

4.3QImage

4.4QPicture


1.绘图事件paintEvent

  • paintEvent------绘图事件

需求:利用QPainter绘制点、线、圆、矩形、文字;设置画笔改为红色,宽度为2,;设置画刷为蓝色,用于填空圆和矩形

cpp 复制代码
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    
    //设置画笔
    QPen pen(QColor(255,0,0));
    pen.setWidth(2);
    pen.setStyle(Qt::DotLine);//虚线
    painter.setPen(pen);
    
    //设置画刷
    QBrush brush(Qt::blue);
    brush.setStyle(Qt::Dense5Pattern);
    painter.setBrush(brush);
    
    painter.drawPoint(100,20);
    
    painter.drawLine(QPoint(0,0),QPoint(100,100));
    
    painter.drawEllipse(QPoint(100,100),50,50);
    
    painter.drawRect(QRect(20,20,50,50));
    
    painter.setFont(QFont("黑体",20));
    painter.drawText(QRect(0,200,150,100),"好好学习,天天向上");
}

2.高级绘图

绘图设备是指继承QPainterDevice的子类,如QPixmap、QBitmap、QPicture

需求1::绘制两个原型,一个普通,一个抗锯齿效果

cpp 复制代码
void Widget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    
    painter.drawEllipse(QPoint(100,100),50,50);
    
    //抗锯齿
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawEllipse(QPoint(250,100),50,50);
}

需求2:

cpp 复制代码
void Widget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    painter.drawRect(QRect(20,20,50,50));
    painter.translate(100,0);
    painter.drawRect(QRect(20,20,50,50));
    painter.save();
}

需求3:再次移动画家,restore恢复画家状态,绘制矩形Qrect(20,20,50,50)

cpp 复制代码
void Widget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    painter.translate(100,0);
    painter.restore();
    painter.drawRect(QRect(20,20,50,50));
}

3.图片绘制

绘制图片,也就是将已有资源图片,绘制到窗口中,利用QPainter在QLabel上绘制图片,主要调用drawPixmap

cpp 复制代码
void QPainter::drawPixmap(int x,int y,const QPixmap &pixmap);
cpp 复制代码
void Widget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/Image/1.png");
    painter.drawPixmap(0,0,pix);
}
  • update()------手动更新绘制事件

4.绘图设备

4.1QPixmap

适用于图像在屏幕上的显示,继承QPaintDevice

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    QPixmap pix(300,300);
    //填充背景色
    pix.fill(Qt::white);
    QPainter paint(&pix);
    paint.setPen(QPen(Qt::green));
    //画圆
    paint.drawEllipse(QPoint(150,150),100,100);
    
    //保存在磁盘中
    pix.save("E:\\a\\pix.png");
}
  • pix.fill(Qt::white); //填充背景色

效果如下:

4.2QBitmap

继承QPixmap,色深是1(只能用一位二进制数表示颜色,即0或1),即表示的颜色只有两种,黑和白,占用存储空间很少,故适合做光标文件和笔刷。

cpp 复制代码
void Widget::paintEvent(QPaintEvent *event)
{
    QBitmap bitmap1(":/Image/butterfly.png");
    QBitmap bitmap2(":/Image/butterfly1.png");
    
    QPainter painter(this);
    painter.drawPixmap(0,50,bitmap1);
    painter.drawPixmap(200,50,bitmap2);
}

效果如下:

4.3QImage

适用于图像的像素级访问

  • setPixel()或pixel()------存取指定的像素
  • fromImage()【QPixmap静态成员函数】------QImage转QPixmap
  • toImage()【QPixmap的成员函数】------QPixmap转QImage

需求1:用QImage显示一张图

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QImage image(300,300,QImage::Format_RGB32);
    //填充背景色
    image.fill(Qt::white);
    QPainter paint(&image);
    paint.setPen(QPen(Qt::green));
    //画圆
    paint.drawEllipse(QPoint(150,150),100,100);

    //保存在磁盘中
    image.save("E:\\Qt project\\pix2.png");
}

效果如下:

需求2:将50-100像素的点改为红色

cpp 复制代码
void Widget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    QImage image;
    image.load("E:\\Qt project\\pix2.png");

    for(int i=50;i<=100;i++)
    {
        for(int j=50;j<=100;j++)
        {
            //红色
            QRgb val=qRgb(255,0,0);
            //将坐标为(i,j)的设置为红色
            image.setPixel(i,j,val);
        }
    }
    painter.drawImage(0,0,image);
}

效果如下:

4.4QPicture

可以记录和重现QPainter的各条命令

操作步骤:

  1. 使用QPainter::begin(),将QPicture实例作为参数传递进去,告诉系统开始记录
  2. QPainter::end()将命令终止

需求:用QPicture记录绘图指令,在paintEvent中重现绘图指令

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    
    QPicture pic;
    QPainter painter;
    
    //记录绘图指令
    painter.begin(&pic);

    painter.setPen(QPen(Qt::red));
    painter.drawEllipse(QPoint(150,150),100,100);
    painter.end();

    //后缀pic
    pic.save("E:\\Qt project\\pix3.pic");
}

void Widget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    QPicture pic;
    pic.load("E:\\Qt project\\pix3.pic");
    //重现绘图步骤
    painter.drawImage(0,0,pic);
}

效果如下:

相关推荐
侃侃_天下18 小时前
最终的信号类
开发语言·c++·算法
echoarts18 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix18 小时前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题19 小时前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说19 小时前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔19 小时前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
我是菜鸟0713号20 小时前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_20 小时前
QT(4)
开发语言·汇编·c++·qt·算法
Brookty20 小时前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
百锦再20 小时前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame