Qt—QPainter基本图形绘制详解

17 篇文章 16 订阅
文章介绍了Qt中QPainter类在图形绘制中的应用,包括对QPaintDevice和QPaintEngine的解释,以及如何使用QPainter进行线条、形状、文本、图片等的绘制。此外,详细阐述了画笔颜色、线宽、样式、填充规则等图形样式控制,并给出了具体的代码示例。
摘要由CSDN通过智能技术生成

QPainter描述

1、QPainter 类在小部件和其他绘制设备上执行低级绘制。

2、QPainter 提供了高度优化的功能来完成大多数图形GUI程序所需的工作。它可以画从简单的线条到复杂的形状。它还可以绘制对齐的文本和像素图。QPainter 可以对继承 QPaintDevice 类的任何对象进行操作。

3、QPainter 与 QPaintDevice 和 QPaintEngine 类一起构成了Qt绘制系统的基础:

  • QPainter 是用于执行绘图操作的类。

  • QPaintDevice 表示可以使用 QPainter 在其上绘制的设备。

  • QPaintEngine 提供了一个接口,QPainter 可以使用这个接口来绘制不同类型的设备。

项目示例

在右边可以选择绘图样式,左边显示对应的样式效果

绘图区

新建类PaintArea,基类QWidget,作为绘制图形区域。其成员有:

m_shape用于记录绘图样式,例如绘制线或者绘制矩形;m_pen用于记录画笔样式;m_brush用于记录画刷样式,m_fillrule用于记录填充规则。

当左端控制区发生样式改变时,将对应的样式属性传递给PaintArea类对应的成员,然后调用update( )方法重绘窗体来实现绘图区样式的改变。这就需要我们重写printEvent( )方法,来实现绘制自己需要的图形。

PaintArea类构造函数中,设置背景颜色为白色,以及固定大小

控制区样式改变时,将对应的样式属性传递给PaintArea类的对应成员

重写paintEvent( )方法,在函数中根据m_shape图片类型调用对应的绘图函数。

控制区

控制区就是我们的主窗口类,类名为MainWidget,基类QWidget。将上面我们自定义的PaintArea类作为主窗口类的成员,成员名为m_paintArea。

画笔颜色

当点击"更改"按钮时弹出一个颜色对话框,将用户选择的颜色显示在中间QFrame部件中,同时更改绘图区边框颜色

在初始化函数中初始化QFrame的颜色,以及按钮的槽方法连接。tr可以使该显示的文本能够被翻译。

ShowPenColor( )槽方法

在该槽方法中,我们首先获得QFrame部件的颜色,作为打开颜色对话框时的初始颜色,接着从其他样式选项框中获取和画笔样式有关的值。调用PaintArea类的setPen( ) 方法设置画笔样式。

  • 获得部件颜色:QColor color = 部件名称->palette( ).color(QPalette : :Window);参数QPalette::Window表示获得该部件的窗体颜色

  • 获得组合框选中的值:首先调用组合框的currentIndex( )方法获得组合框当前选中值的索引,再调用组合框的itemData(int index).toInt( ),传入索引,并且将返回值转换成int类型,再强转成对应的样式枚举值。

绘制形状

形状选取是一个组合框部件,在初始换函数中将可选取的值添加到组合框中.

在初始化函数中,向组合框添加形状条目,这里我们又将能绘制的形状单独在PaintArea类中用枚举类型声明了一下

ShowShape(int)槽方法

在该槽方法中,我们获取形状组合框选取的值,再调用PaintArea类的setShape( )方法设置形状.

线宽

设置线宽我们采用一个QSpinBox部件来实现,设置取值范围为1到20。

初始化函数

ShowPenWidth( int)槽方法

槽方法可以直接获取到更改的笔宽值

画笔风格

画笔风格的选择是一个组合框,我们可以选择不同的风格,例如实线(SolidLine)、点线(DotLine)或者其他样式,也可以选择自定义的DashLine。

不同的画笔风格对应的效果大致如下

画笔风格的实现代码与画笔颜色大致相同:首先在初始化函数中向组合框添加可选项,再将组合框的信号与槽方法连接。在槽方法中需要注意的是需要设置自定义的DashLine的样式。

初始化函数

ShowPenStyle(int)槽方法

在槽方法中需要设置自定义的DashLine样式

笔帽风格

不同的笔帽风格对应的样式如下

释义:

  • Qt::SquareCap 方形线端,不覆盖线的端点

  • Qt::FlatCap 方形线端,覆盖线的端点,并以线框一半向外延伸

  • Qt::RoundCap 圆线端

初始化函数

ShowPenStyle(int)槽方法

连接点样式

不同的连接点样式对应的效果如下

释义:

  • Qt::BevelJoin 两条线相汇形成方形连接

  • Qt::MiterJoin 两条线相汇形成尖角连接

  • Qt::RoundJoin两条线相汇形成圆角连接

初始化函数

ShowPenJoin(int)槽方法

填充模式

不同的填充模式对应的效果如下

Qt::OddEvenFill填充规则:从图形中某一点画一条水平线到图形外,若这条线与图形边线的交点为奇数则说明此点位于图形的内部;若交点为偶数,则此点在图形的外部。

Qt::WindingFill填充规则:从图形总某一点画一条水平线到图形外,每个交点外边线方向可能向上、向下、方向相反的相互抵消,若结果不为0表此点在图形内,若为0则在图形外。其中边线的方向是由QPainterPath创建时根据描述的顺序决定的,如果采用addRect()或addPolygon()等函数加入的图形默认为顺时针方向。

初始化函数

ShowFileRule(int)槽方法

铺展效果

不同的铺展样式效果如下

初始化函数

ShowSpread(int)槽方法

m_brushSpread是一个QGradient : :Spread类型,用来记录选择的铺展效果。之后调用ShowBrushStyle( int )槽方法来改变样式效果

画刷风格

不同的画刷风格效果如下

初始化函数

ShowBrushStyle(int)槽方法

画刷风格中有几种样式需要特别设置参数,例如QLineGradient就需要设置渐变区域和渐变色

追风赶月莫停留,平芜尽处是春山!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值