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);
}

效果如下:

相关推荐
晚安,cheems2 分钟前
c++(入门)
开发语言·c++
小乖兽技术3 分钟前
C#13新特性介绍:LINQ 的优化设计
开发语言·c#·linq
Mcworld85710 分钟前
C语言:strcpy
c语言·开发语言
人才程序员39 分钟前
详解Qt QStorageInfo 存储信息类
c语言·开发语言·c++·后端·qt·界面
ZHOUPUYU40 分钟前
最新‌VSCode保姆级安装教程(附安装包)
c语言·开发语言·c++·ide·windows·vscode·编辑器
__lost1 小时前
Python 使用 OpenCV 将 MP4 转换为 GIF图
开发语言·python·opencv
机器视觉知识推荐、就业指导1 小时前
基于Qt/C++/Opencv实现的一个视频中二维码解析软件
c++·qt·opencv
霍夫曼vx_helloworld73521 小时前
(二)手势识别——动作模型训练【代码+数据集+python环境(免安装)+GUI系统】
开发语言·python
誓约酱1 小时前
Linux 下进程基本概念与状态
linux·运维·服务器·开发语言·c++
学习前端的小z1 小时前
【C语言】深入剖析 C 语言中数组与指针的紧密联系及高效应用
c语言·开发语言