Qt示例 | 基本图型的绘制

举报
黑兔子 发表于 2022/10/17 16:35:15 2022/10/17
【摘要】 该示例提供了一个渲染区域,显示当前活动的形状,使用QPainter参数操作渲染形状及其外观:可以改变活动形状(形状),并修改QPainter的钢笔(钢笔宽度,钢笔样式,钢笔帽,钢笔连接),画笔(画笔样式)和渲染提示(抗锯齿)。此外,可以旋转形状(转换)。

示例运行效果:

1.gif

该示例提供了一个渲染区域,显示当前活动的形状,使用QPainter参数操作渲染形状及其外观:可以改变活动形状(形状),并修改QPainter的钢笔(钢笔宽度,钢笔样式,钢笔帽,钢笔连接),画笔(画笔样式)和渲染提示(抗锯齿)。此外,可以旋转形状(转换)。

文件目录:

image.png

主要包含一个渲染区域的类RenderArea和一个主窗体window类。还包含了两个图片资源。

具体实现:

main函数:

image.png

main函数主要将主窗体显示出来。

Window类:

image.png

Window类继承了QWidget,它是应用程序的主窗口,除了显示几个参数小部件外,还显示一个RenderArea小部件。
Window类中除了定义了小部件的变量,还包括一个构造函数和三个私有的槽函数。

  • 当改变当前活动的形状时,shapeChanged()槽会更新RenderArea中的小部件。
  • 当QPainter的钢笔参数发生变化时,会调用penChanged()槽。
  • 当改变画笔样式时,brushChanged()槽会更新RenderArea小部件。

构造函数:

在构造函数中,创建并初始化了出现在主应用程序窗口中的各种小部件。

image.png

这里创建了视图区域和形状选择下拉框。并填充了下拉框的选项。

setBuddy: 将这个标签的好友设置为指定部件。好友机制仅适用于包含一个字符以’&'作为前缀的文本的QLabels。按下“Alt+S”组合键时,焦点就会到shapeComboBox上面去。

image.png

这里为Pen Width参数创建一个QSpinBox部件用于选择画笔的宽度。

  • QPainter的画笔是一个QPen对象;
  • QPen类定义了QPainter应该如何绘制图形的线条和轮廓。
  • QPen有几个属性:宽度、样式、笔帽和连接。
  • QPen的宽度可以为零或更大,但最常见的宽度为零。请注意,这并不意味着0像素。

image.png

创建了选择钢笔样式类型、笔帽类型、笔连接类型等下拉选择框。默认样式是solid (Qt::SolidLine)。设置样式为none (Qt::NoPen)告诉QPainter不要画线或轮廓。

  • 笔帽定义如何绘制直线的端点。
  • 笔连接定义了当绘制多条连接线时两条线如何连接。
  • 笔帽和连接仅适用于宽度为1像素或更大的线。

image.png

为画笔样式参数创建一个QComboBox,并添加相关的项(即Qt::BrushStyle enum的值)。
QBrush类定义了由QPainter绘制的形状填充模式。默认的笔刷样式是Qt::NoBrush。这个样式告诉QPainter不进行填充。填充的标准样式是Qt::SolidPattern。

image.png

抗锯齿是一个“平滑”的像素,以创建更多的均匀和不参差不齐的线条,可以使用QPainter的渲染提示应用。QPainter::RenderHints被用来指定QPainter的标志。
转换选项意味着对坐标系统的操作,它将显示为呈现的形状在三维空间中旋转。
这里创建一个抗锯齿选项的QCheckBox。

image.png

完成信号槽的连接。确保当用户改变形状或任何其他参数时,RenderArea小部件会被更新。

image.png

完成页面的布局。

image.png

完成页面的初始化。设置窗口的标题,调用shapeChanged()、penChanged()和brushChanged()槽来初始化应用程序。我们还打开了抗锯齿。

Window类:

shapeChanged函数:

image.png

每当点击shape的下拉框选项时会更改当前活动的形状,将调用shapeChanged()槽。
QComboBox::itemData()函数可以检索用户选择的形状。
这个函数返回组合框中给定索引中给定角色的数据。
使用QComboBox::currentIndex()来检索形状的索引,角色由Qt::ItemDataRole enum定义;IdRole是Qt::UserRole的别名。

penChanged函数:

image.png

每当更改pen参数时,都会调用penChanged()槽。
使用QComboBox::itemData()函数来获取参数,然后调用RenderArea::setPen()槽来更新RenderArea小部件。

brushChanged函数:

image.png

每当更改画笔选项时,调用QComboBox::itemData()函数检索的画笔参数,就会调用brushChanged()插槽。

  • 如果刷参数是渐变填充,需要特殊的操作。QGradient类与QBrush类结合使用来指定梯度填充。
    Qt目前支持三种类型的梯度填充:线性、径向和锥形。每一个都由一个子类的QGradient表示:QLinearGradient, QRadialGradient和QConicalGradient。
  • 所以如果画笔样式是Qt::LinearGradientPattern,首先创建一个QLinearGradient对象,在作为参数传递给构造函数的坐标之间有插值区域。位置是使用逻辑坐标指定的。然后使用QGradient::setColorAt()函数设置渐变的颜色。颜色是使用由位置(在0和1之间)和QColor组成的停止点来定义的。停止点的集合描述了应该如何填充梯度区域。一个梯度可以有任意数量的停止点。
  • 最后,调用RenderArea::setBrush()槽来用QLinearGradient对象更新RenderArea小部件的画笔。
    类似于QLinearGradient所使用的动作模式,也被用于Qt::RadialGradientPattern和Qt::ConicalGradientPattern。唯一的区别是传递给构造函数的参数:对于QRadialGradient构造函数,第一个参数是中心,第二个参数是径向梯度的半径。第三个参数是可选的,但可以用来定义圆内渐变的焦点(默认焦点是圆的中心)。对于QConicalGradient构造函数,第一个参数指定圆锥体的中心,第二个参数指定插值的起始角度。
  • 如果笔刷样式是Qt::TexturePattern,我们从QPixmap创建一个QBrush。然后调用RenderArea::setBrush()槽来用新创建的画笔更新RenderArea小部件。否则,简单地用给定的样式和绿色创建一个笔刷,然后调用RenderArea::setBrush()槽来用新创建的笔刷更新RenderArea小部件。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。