QT学习日记20221016之绘图

参考参考

三个类:QPainter、QPainterDevice、QPaintEngine

QPainter执行操作(相当于画家)

QPainterDevice :QPainter的工作空间,相当于画板

QPaintEngine:提供QPainter在不同设备上进行绘制的统一接口,不同的画板都能使用一种画笔

Qt 的绘图系统实际上是,使用 QPainter 在 QPainterDevice 上进行绘制,它们之间使用QPaintEngine 进行通讯(也就是翻译 QPainter 的指令)

paintEvent() 就是当窗口发生重绘时触发的事件方法

1、画一条直线

// 窗体发生重绘时触发的事件
void Widget::paintEvent(QPaintEvent *)
{
    // 创建一个局部变量 QPainter 对象,即每次运行 paintEvent() 方法的时候都会重新创建该对象。
    // QPainter 接收一个 QPaintDevice 指针作为参数,QPaintDevice 表示绘图设备,
    // 即指定我们在哪个设备上进行绘图。this 表示当前主窗口对象,即在当前窗口上进行绘图。

    QPainter painter(this);
    
    // 画一条直线:参数为两个点(两点决定一条直线)
    painter.drawLine(QPoint(10, 10), QPoint(100, 100));
}

 2、画一个矩形,并指定矩形边框的颜色

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    
    // 设置一个红色的画笔
    painter.setPen(Qt::red);
    
    // 画一个矩形
    painter.drawRect(QRect(10, 10, 100, 100));//左边两个数为左上角的坐标,然后就是width和height
}

 3、画椭圆形,指定边框颜色粗细,并制定图形填充颜色

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    
    // 设置一个绿色的画笔,并指定画笔的宽度为 8
    painter.setPen(QPen(Qt::green, 8));//QPen(颜色、粗细、线条样式)
    
    // 设置一个蓝色的画刷,用来填充绘制的图形
    painter.setBrush(Qt::blue);
    
    // 画一个椭圆:指定圆心,宽和高
    painter.drawEllipse(QPoint(100, 100), 80, 50);
}

 

 QPaintDevice:绘图设备

1、QPixmap:可以接收一个字符串作为一个文件的路径来显示这个文件,使用 QPinter 的 drawPixmap() 方法可以把这个文件绘制到一个指定的绘图设备上。

void Widget::paintEvent(QPaintEvent *)
{
    // 创建一个绘图对象,指定绘图设备为当前主窗口
    QPainter painter(this);
    
    // 绘制一个图像:参数为显示图像的开始 x、y 坐标,和显示图像的宽度和高度,以及要显示的图像
    painter.drawPixmap(10, 10, 100, 100, QPixmap(":/Image/Luffy.png"));
}//宽高可以不输入

如果想换一个控件画图即把this换掉参考参考

2、QBitmap:继承自 QPixmap,因此具有 QPixmap 的所有特性。QBitmap 的色深始终为 1,色深是指用于表现颜色的二进制位数。比如我们要表示 8 种颜色,需要用 3 个二进制位,这时我们就说色深是 3。因此,所谓色深为 1所表示的颜色只有两种,黑和白。所以,QBitmap 实际上是只有黑白两色的图像数据。

由于 QBitmap 色深小,因此只占用很少的内存空间,所以适合做光标文件和笔刷。

3、QImage:提供了像素级别的操作,并且能够在不同系统之上提供一个一致的显示形式。

我们声明一个 QImage 对象,大小是 200x200,颜色模式是 RGB32,即使用 32 位数值表示一个颜色的 RGB 值,也就是说每种颜色使用 8 位。然后我们为每个像素进行颜色赋值,从而构成了这个图像。
 

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    
    // 创建一个 QImage 对象
    QImage image(200, 200, QImage::Format_RGB32);
    
    QRgb value;
    
    // 将图片背景填充为绿色
    image.fill(Qt::green);
    
    // 改变指定区域的像素点的值
    for (int i = 50; i < 100; i++)
    {
        for(int j = 50; j < 100; j++)
        {
            value = qRgb(255, 0, 0);        // 红色
            image.setPixel(i, j, value);    // 设置每个像素点的值
        }
    }
    
    // 将图像绘制到窗口中
    painter.drawImage(10, 10, image);
}

QImage 和 QPixmap 的相互转换:

    // 将 QImage 转换成 QPixmap:使用 QPixmap 的静态成员函数 fromImage();
    QPixmap pixmap = QPixmap::fromImage(image);
    
    // 将 QPixmap 转换成 QImage:使用 QPixmap 类的成员函数 toImage();
    QImage img = pixmap.toImage();
 

 

4、QPicture:这是一个可以记录和重现 QPainter 命令的绘图设备。QPicture 将 QPainter 的命令序列化到一个 IO 设备,保存为一个平台独立的文件格式。这种格式有时候会是 “元文件(mate-files)”。Qt 的这种格式是二进制的,不同于某些本地的元文件

QPicture 是平台无关的,因此他可以使用在多种设备之上,

如果我们要记录下 QPainter 的命令,首先要使用 QPainter::begin() 函数,将 QPicture 实例作为参数传递进去,以便告诉系统开始记录,记录完毕后使用 QPainter::end() 函数终止。
 

void Widget::paintEvent(QPaintEvent *)
{
    QPicture picture;
    QPainter painter;
    
    // 将图像绘制到 QPicture 中,并保存到文件
    // 开始记录
    painter.begin(&picture);
    
    // 开始绘图
    painter.drawEllipse(10, 10, 100, 50);       // 画一个椭圆
    painter.fillRect(10, 70, 100, 50, Qt::red); // 填充一个矩形
    
    // 结束记录
    painter.end();
    
    // 保存文件
    picture.save("D://drawing.pic");
    
    // 加载保存的绘图动作
    picture.load("D://drawing.pic");
    
    // 将保存的绘图重新绘制到设备上 
    painter.begin(this);
    painter.drawPicture(10, 10, picture);
    painter.end();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值