此篇文章来源于自己在学习QT过程中遇到Qpen时总结的知识点,覆盖每个成员函数的相关代码讲解,本人水平有限,如果有其他问题,大家在评论区交流即可,共同学习,一起进步。
一、QPen简介
Qt中的QPen类是一个核心图形模块中的重要类,用于定义Qt绘图系统中线条的外观属性。QPen类的对象代表了一支虚拟的“画笔”,你可以通过设置它的各种属性来控制使用QPainter在QPaintDevice上绘制直线、曲线或形状轮廓时线条的表现。
QPen的主要属性包括:
颜色 (
color()
或set_color()
):
- 可以设置为任意的QColor对象,用来指定线条的颜色。例如,可以通过预定义的颜色常量如
Qt::black
设置为黑色,也可以使用RGB、ARGB值自定义颜色。宽度 (
width()
或setWidth()
,widthF()
或setWidthF()
):
- 设置线条的粗细,可以是整数值或浮点数,单位通常与设备相关的像素或逻辑单位。
样式 (
style()
或setStyle()
):
- 定义线条的基本形状,比如连续线(
SolidLine
)、虚线(DashLine
)、点线(DotLine
)、中心线(DashDotLine
)等等。笔刷 (
brush()
或setBrush()
):
- 使用QBrush对象来填充线条,允许线条具有复杂的填充样式,例如渐变色或图案填充。
线帽样式 (
capStyle()
或setCapStyle()
):
- 控制线段末端的形状,可选样式包括平头(
SquareCap
)、圆头(RoundCap
)和默认(FlatCap
)。连接样式 (
joinStyle()
或setJoinStyle()
):
- 决定两线段相交或转折处的连接方式,如斜接(
BevelJoin
)、圆角(RoundJoin
)和平接(MiterJoin
)。
二、成员函数
1、QPen::QPen(QPen &&pen)
这个构造函数的作用是执行资源的移动操作,而不是复制操作。当一个新的QPen对象通过右值引用(rvalue reference)来初始化时,它会接管原有QPen对象的所有权和状态,而原QPen对象通常会被置为空状态或者不可用状态,避免了昂贵的深拷贝。
具体到QPen类,这意味着新创建的QPen对象将直接获取原始QPen对象所包含的颜色、宽度、样式等所有属性,并且不会额外分配新的内存资源。这样的设计有助于提高性能,尤其是在处理大型数据结构或者频繁创建销毁临时对象的情况下。
示例代码:
QPen originalPen(Qt::blue, 2, Qt::SolidLine);
// 创建一个新的QPen对象,通过移动构造函数从originalPen那里接管状态
QPen movedPen(std::move(originalPen));
// 这时,movedPen拥有了originalPen的所有属性,而originalPen可能处于未定义状态或空状态
在上述代码片段中,std::move
是一个强制转换操作,用于表明我们打算放弃对原始QPen对象的所有权,将其资源转移给新创建的QPen对象。
2、QPen::QPen(const QPen &pen)
QPen::QPen(const QPen &pen)
是C++中QPen类的一个复制构造函数。这个函数用于创建一个新的QPen对象,该对象是已存在QPen对象的一个副本,即新对象的属性完全复制自传入的参数pen
。
在Qt的绘图系统中,当你需要创建一个与现有QPen相同属性的新画笔时,就会用到这个复制构造函数。例如,你可能需要在一个地方保存原始画笔的状态,然后基于此创建并修改一个新的画笔。
示例代码:
QPen originalPen(Qt::blue, 2, Qt::SolidLine);
// 创建一个新的QPen对象,其属性与originalPen完全一致
QPen copiedPen(originalPen);
// 此时,copiedPen和originalPen都有相同的颜色(蓝色)、宽度(2像素)和样式(实线)
在这个过程中,复制构造函数将会对原始QPen对象的颜色、宽度、样式以及其他所有相关属性进行深度复制,确保新创建的QPen对象与原始对象有独立但相同的属性设置。
3、QPen::QPen(const QBrush &brush, qreal width, Qt::PenStyle style = Qt::SolidLine, Qt::PenCapStyle cap = Qt::SquareCap, Qt::PenJoinStyle join = Qt::BevelJoin)
此函数是Qt框架中的QPen类的一个构造函数,它用于初始化一个新的QPen对象,该对象定义了绘制图形轮廓的属性。
const QBrush &brush
: 指定画笔的颜色或图案,可以是一个纯色或渐变色等复杂填充方式的QBrush对象。
qreal width
: 设置画笔的宽度,单位通常为逻辑像素。
Qt::PenStyle style
: 定义画笔的线条样式,可选值包括但不限于:
Qt::SolidLine
(实线)Qt::DashLine
(虚线)Qt::DotLine
(点线)- 等其他多种风格
Qt::PenCapStyle cap
: 指定线条端点的形状,如:
Qt::SquareCap
(方形)Qt::RoundCap
(圆形)Qt::FlatCap
(平头)
Qt::PenJoinStyle join
: 定义两条线段交汇处的连接方式,例如:
Qt::BevelJoin
(斜角连接)Qt::RoundJoin
(圆角连接)Qt::MiterJoin
(尖角连接)
通过这个构造函数,您可以一次性创建一个具有指定颜色、宽度、线条样式、线帽样式以及线连接样式的QPen对象,并将其应用于 QPainter 对象来进行2D绘图操作。如果不指定某些参数,则会使用默认值,如上述构造函数声明所示。
4、QPen::QPen(const QColor &color)
QPen::QPen(const QColor &color)
是Qt框架中QPen类的一个构造函数,它的目的是创建一个基于给定颜色的新QPen对象。这个构造函数简化了创建只设置颜色属性的画笔的过程,而其它属性如宽度、线条样式、线帽样式和线连接样式则采用QPen类的默认值。
const QColor &color
: 这个参数是用来指定画笔颜色的,QColor是Qt中的颜色类,它可以表示各种RGB、RGBA或其他颜色空间中的颜色。
通过此构造函数创建的QPen将会具有用户指定的颜色,并且默认宽度为1,线条样式为实线(Qt::SolidLine
),线帽样式为方形(Qt::SquareCap
),线连接样式为斜角连接(Qt::BevelJoin
)。这样的QPen对象常被用于在QPainter上下文中绘制具有单一颜色边界的图形元素。
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QColor>
class DrawingWidget : public QWidget {
public:
DrawingWidget(QWidget *parent = nullptr) : QWidget(parent) {}
protected:
void paintEvent(QPaintEvent *) override {
QPainter painter(this);
// 创建一个红色的QPen
QPen redPen(QColor("red"));
// 设置当前画笔为红色画笔
painter.setPen(redPen);
// 使用红色画笔绘制一个矩形
painter.drawRect(50, 50, 200, 100);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
DrawingWidget widget;
widget.show();
return app.exec();
}
在这个例子中,我们首先定义了一个继承自QWidget的DrawingWidget
类,在其paintEvent
方法中,我们创建了一个带有红色颜色的QPen对象,然后将其设置为当前QPainter的画笔。接着,我们使用这个设置了红色画笔的QPainter来绘制一个矩形,这样矩形的边框就会显示为红色。
5、QPen::QPen(Qt::PenStyle style)
QPen::QPen(Qt::PenStyle style)
是Qt库中QPen类的一个构造函数,它接收一个Qt::PenStyle类型的参数,用于创建一个仅定义了线条样式的新QPen对象。Qt::PenStyle枚举类型包含了多种线条样式,例如实线(SolidLine)、虚线(DashLine)、点线(DotLine)等。
这个构造函数创建的QPen对象的其它属性,如颜色、宽度、线帽样式和线连接样式,都将采用默认值。例如,默认颜色是黑色,宽度默认为1,线帽和线连接样式也有各自的默认值。
以下是一个简单的示例:
QPen dashedPen(Qt::DashLine);
上面的代码将创建一个样式为虚线的QPen对象,其颜色和宽度均为默认值。这个QPen对象可以用于QPainter进行绘图操作,使绘制出的线条呈现虚线效果。
6、QPen::~QPen()
QPen::~QPen()
是Qt库中QPen类的析构函数。在C++中,析构函数是一个特殊的方法,当一个对象生命周期结束时(比如对象的作用域结束或者显式调用delete销毁对象时)自动调用,用于释放该对象所占用的资源。
对于QPen类来说