QPaintEvent 与 画家QPainter

一、QPaintEvent 绘图事件

1、paintEvent 函数

  • 该绘图函数为虚函数,一般要在子类中去重新实现,来接受绘图事件。
  • 通过QPainter来绘图时,一般必须要在paintEvent 函数中来进行。在该函数中重新实现所有的绘图操作,程序在初始化之后会自动调用该绘图事件函数来进行绘图。

2、绘图函数的调用

  • 绘图函数paintEvent 的首次调用是在所有的UI都初始化之后进行的。
  • 当程序的UI发生变化时,如控件大小位置变化、控件由隐藏到显示变化时,程序会调用paintEvent函数
  • 当调用repaintupdate函数时,会导致程序调用paintEvent 函数。一般推荐使用update函数,因为Qt针对update做了优化和处理,而repaint则没有。

二、QPainter基础

1、简介

  • QPainter一般在 paintEvent 事件函数中去使用,否则不会生效。在虚函数paintEvent中去重新实现对应功能,如构建和自定义画家QPainter对象,并指定绘图设备(即具体在什么上绘制,如指定的labelwidget等控件),进行绘制对应的UI
  • QPainter 在绘制GUI的程序上,提供了高度的优化功能。它能绘制几乎所有的 UI,如:点、线条、矩形、圆弧、椭圆、弦、图片、文字、填充等。

2、常用接口

  • QPainter (QPaintDevice *device):构建画家对象,并指定绘图设备,即在哪上面进行绘制。
  • drawArc:在指定的矩形中画内切的圆弧
  • drawChord:在指定的矩形中画弦
  • drawPie:在指定矩形中画饼型图
  • drawConvexPolygon:根据给定的多个点来画凸多边形
  • drawPolygon:画多边形
  • drawEllipse:在指定矩形内画椭圆
  • drawImage:绘制图片,相当于用指定的图片来填充指定的矩形。
  • drawLine:根据给定的点来画线
  • drawPolyline:根据多个点来画折线,折线的首尾不相连
  • drawPath (const QPainterPath &path):画指定的路径图,可以画各种各样的不规则图形。
  • drawPicture:在给定的点重新加载展示指定的图片
  • drawPixmap:画像素图,即用指定的图来在指定矩形中进行填充
  • drawPoint:画一个点
  • drawRect:画方正的矩形
  • drawRoundedRect:画带圆角的矩形
  • drawText:画文本文字
  • fillRect:用指定的颜色来填充矩形区域,此时没有边线,只是填充指定区域
  • font:返回当前用来绘制文本的字体
  • fontMetrics:在画家处于激活的状态下返回当前字体的几何尺寸信息
  • opacity:返回当前的画家的透明度,默认值为1
  • layoutDirection:当绘制文本内容时,返回布局方向
  • setPen:设置画笔的样式
  • setOpacity:设置不透明度,取值的范围是 0.0 0.0 0.0 ~ 1.0 1.0 1.0,当值为 0.0 0.0 0.0时为完全透明,当值为 1.0 1.0 1.0时为完全不透明。
  • setBackground:设置填充背景的颜色样式,当背景模式为透明时,该函数将不起作用
  • setBrush:以指定的颜色样式填充所画的图形
  • setFont:绘制文本内容时,来设置对应的字体样式
  • setLayoutDirection:当绘制文本内容时,用来设置布局的方向

3、对比 QPainterQPen

QPainterQPen都可以调用各自的setBrush函数,但是作用的效果完全不同

(1)、 QPainter 调用setBrush函数

  • 此时画家QPainter可以以指定的颜色来填充所绘制的整个封闭图形(只有封闭的图形才能被填充,如弦Arc未封闭将不能被填充),相当于刷子。
  • 或者此时画家QPainter以指定的样式来填充封闭图形,(以颜色或样式填充只能有一种起作用,不可以同时起作用)。
  • 应用示例
void PaintEventTest::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    
    painter.setBrush(QColor(0, 200, 250, 200)); //设置填充颜色
    painter.setPen(QPen(Qt::red,20)); //设置画笔的颜色和宽度。若不设置画笔,则画家会以默认宽度和颜色的画笔来绘制边线
    painter.drawPie(QRect(50, 50, 500, 500), 0, 260 * 16);
}

在这里插入图片描述

(2)、 QPen 调用setBrush函数

  • 此时只是用来填充笔画,其效果相当于setColor。即只是设置线条的颜色。
  • 应用示例
void PaintEventTest::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    
    QPen pen;
    pen.setBrush(Qt::red); //只是设置画笔的颜色
    //pen.setColor(Qt::blue); //和上面setBrush作用相同都是设置画笔的颜色
    pen.setWidth(6);
    painter.setPen(pen);
    painter.drawPie(QRect(100, 100, 500, 500), 0, 260 * 16);

}

在这里插入图片描述


三、基本应用

1、设置画笔样式 setPen 有三种方式

(1)、setPen(const QPen &pen) :直接设置画笔QPen的样式,该项可以同时设置画笔的众多属性,如:宽度、线条样式、颜色等,因此最为常用。

  • 首先创建QPen的对象画笔,然后设置该画笔
  • 在此可以通过构造函数或子函数来设置画笔的:样式、颜色(包括透明度)、线宽等属性。
  • 然后画家通过 setPen 函数来将该画笔设置到对应的画家对象上。
  • Qt::PenStyle默认为实线类型。
  • 使用示例如下:
    // 1、通过构造函数创建画笔pen01的属性
    QPen pen01(Qt::red, 8);
    // 2、通过子函数来单独设置pen02的属性
    QPen pen02;
    pen02.setBrush(QColor(0, 200, 200, 100));
    pen02.setWidth(10);
    pen02.setStyle(Qt::DotLine);

(2)、setPen(const QColor &color) :只能设置画笔的颜色

  • 该函数只能设置画笔的颜色,包括透明度;不可以设置其它的属性
  • QColor(int r, int g, int b, int a = 255)在设置颜色的时候,可以通过构造函数来设置其对应的值,其中透明度值只能是0到255之间,不可以用0.0~1.0之间的值来代替
  • 透明度默认值为 255,即不透明。
  • 使用示例
	// 直接通过画家设置其颜色和透明度,最后一个值255为透明度
    painter.setPen(QColor(200,0,0,255));

(3)、setPen(Qt::PenStyle style) :设置画笔的样式,如实线、虚线、点画线等样式

  • 只能设置画笔的样式,默认为实线,应用最少。

2、绘制圆弧类图形,如drawArc,drawChord,drawPie

(1)、绘制圆弧时,函数参数具体如下:

  • 指定的矩形起始的角度圆弧的跨度角。其中圆弧内切于指定的矩形;起始角度和圆弧跨度角必须为一个角度的 1 16 \frac{1}{16} 161 ,如需要绘制的圆弧图形起始角度为 10 ° 10° 10°,跨度角为 90 ° 90° 90°,就需要指定对应的参数为:起始角度startAngle = 10*16,跨度角spanAngle = 90*16。因为该函数在绘制圆弧时会自动取给定角度参数的 1 16 \frac{1}{16} 161 ,所以要将需要的角度值乘以 16,才能得到预定的结果。
  • 起始角度 0 度位于3点钟方向,即 X X X轴正方向的位置,如下图所示:
    在这里插入图片描述
  • 角度值为正,则是逆时针;角度值为负,则是顺时针

(2)、示例如下:

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

    QPen pen01(Qt::red, 8);
    QPen pen02(QColor(0, 200, 200), 6);
    QPen pen03(QColor(0, 0, 255, 200), 7);

    painter.setPen(pen01);
    painter.drawArc(QRect(10, 10, 500, 500), 0, 260 * 16);

    painter.setPen(pen02);
    painter.drawChord(QRect(600, 10, 500, 500), 0, 260 * 16);

    painter.setPen(pen03);
    painter.drawPie(QRect(1160, 10, 500, 500), 0, 260 * 16);
}

从左到右依次为drawArc,drawChord,drawPie
在这里插入图片描述

3、填充矩形区域 fillRect

(1)、应用分析

  • 用指定的颜色来填充矩形区域,且该矩形区域没有边线,此时可以通过画家QPainter来调用fillRect函数实现。
  • fillRect可以用指定的颜色或样式来对矩形区域进行填充,相当于画刷。

(2)、示例

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

    // 以指定颜色填充矩形
    painter.fillRect(QRect(50, 50, 600, 300), QColor(0, 200, 250, 200));
    // 以指定样式填充矩形
    painter.fillRect(QRect(700, 50, 600, 300), Qt::DiagCrossPattern);
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值