当前位置: 首页 > news >正文

QT:QPen、QBrush、与图形抗锯齿的关联

QPen

QPen 是 Qt 框架中用于定义绘图时使用的画笔属性的类。在使用 QPainter 进行 2D 绘图时,QPen 可以控制线条的外观,比如线条的颜色、宽度、样式(如实线、虚线等)、端点样式(如方形端点、圆形端点等)和连接样式(如斜接、圆角连接等)。

主要属性

颜色(QColor):用于指定线条的颜色。可以使用预定义的颜色(如 Qt::red、Qt::blue 等),也可以自定义 RGB 值。
宽度(qreal):指定线条的宽度,单位通常是像素。
样式(Qt::PenStyle):定义线条的样式,例如实线(Qt::SolidLine)、虚线(Qt::DashLine)、点线(Qt::DotLine)等。
端点样式(Qt::PenCapStyle):确定线条端点的外观,如方形端点(Qt::SquareCap)、圆形端点(Qt::RoundCap)等。
连接样式(Qt::PenJoinStyle):用于设置两条线条连接处的样式,如斜接(Qt::MiterJoin)、圆角连接(Qt::RoundJoin)等。

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QPainterPath>

class PenExampleWidget : public QWidget {
protected:
    void paintEvent(QPaintEvent *event) override {
        Q_UNUSED(event);
        QPainter painter(this);

        // 创建不同属性的 QPen 对象并绘制线条

        // 1. 红色实线,宽度为 2 像素
        QPen pen1(Qt::red);
        pen1.setWidth(2);
        painter.setPen(pen1);
        painter.drawLine(20, 20, 200, 20);

        // 2. 蓝色虚线,宽度为 3 像素
        QPen pen2(Qt::blue);
        pen2.setWidth(3);
        pen2.setStyle(Qt::DashLine);
        painter.setPen(pen2);
        painter.drawLine(20, 50, 200, 50);

        // 3. 绿色点线,宽度为 4 像素,圆形端点
        QPen pen3(Qt::green);
        pen3.setWidth(4);
        pen3.setStyle(Qt::DotLine);
        pen3.setCapStyle(Qt::RoundCap);
        painter.setPen(pen3);
        painter.drawLine(20, 80, 200, 80);

        // 4. 紫色实线,宽度为 5 像素,圆角连接
        QPen pen4(Qt::magenta);
        pen4.setWidth(5);
        pen4.setJoinStyle(Qt::RoundJoin);
        QPainterPath path;
        path.moveTo(20, 110);
        path.lineTo(100, 110);
        path.lineTo(100, 200);
        painter.setPen(pen4);
        painter.drawPath(path);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    PenExampleWidget widget;
    widget.setWindowTitle("QPen Example");
    widget.resize(300, 250);
    widget.show();
    return app.exec();
}

头文件包含:
QApplication:管理 Qt 应用程序的资源和事件循环。
QWidget:作为窗口的基类。
QPainter:用于实际的绘图操作。
QPen:用于定义画笔的属性。
自定义窗口类 PenExampleWidget:
继承自 QWidget,并重写 paintEvent 函数,在该函数中进行绘图操作。
paintEvent 函数:
红色实线:创建 pen1,设置颜色为红色,宽度为 2 像素,然后使用 painter.setPen(pen1) 设置画笔,最后绘制一条水平直线。
蓝色虚线:创建 pen2,设置颜色为蓝色,宽度为 3 像素,样式为虚线(Qt::DashLine),再设置画笔并绘制直线。
绿色点线:创建 pen3,设置颜色为绿色,宽度为 4 像素,样式为点线(Qt::DotLine),端点样式为圆形(Qt::RoundCap),然后绘制直线。
紫色实线及圆角连接:创建 pen4,设置颜色为紫色,宽度为 5 像素,连接样式为圆角连接(Qt::RoundJoin)。使用 QPainterPath 创建一个路径,包含两条线段,最后使用设置好的画笔绘制该路径。
主函数:
创建 QApplication 对象,启动应用程序。
创建 PenExampleWidget 实例,设置窗口标题和大小,并显示窗口。
调用 app.exec() 进入事件循环,等待用户操作。
在这里插入图片描述

看到窗口中绘制了四条不同样式的线条,直观展示了 QPen 不同属性的效果。

QBrush

QBrush 是 Qt 框架中用于定义填充图案和颜色的类,在使用 QPainter 进行 2D 绘图时,QBrush 可用于填充各种图形(如矩形、椭圆等),控制图形内部的颜色和填充样式。

主要属性

颜色(QColor):指定填充的颜色,可以使用预定义的颜色(如 Qt::red、Qt::blue 等),也可以通过 RGB 值自定义颜色。
样式(Qt::BrushStyle):定义填充的样式,常见的样式有:
Qt::SolidPattern:实心填充,使用指定的颜色完全填充图形。
Qt::Dense1Pattern - Qt::Dense7Pattern:不同密度的疏密填充图案。
Qt::HorPattern、Qt::VerPattern、Qt::CrossPattern 等:水平、垂直、交叉等线条图案。
渐变(QGradient):除了纯色填充,QBrush 还支持使用渐变填充,如线性渐变(QLinearGradient)、径向渐变(QRadialGradient)和锥形渐变(QConicalGradient)。

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QBrush>
#include <QLinearGradient>

class BrushExampleWidget : public QWidget {
protected:
    void paintEvent(QPaintEvent *event) override {
        Q_UNUSED(event);
        QPainter painter(this);

        // 1. 实心填充
        QBrush solidBrush(Qt::red, Qt::SolidPattern);
        painter.setBrush(solidBrush);
        painter.drawRect(20, 20, 100, 100);

        // 2. 疏密填充
        QBrush denseBrush(Qt::blue, Qt::Dense3Pattern);
        painter.setBrush(denseBrush);
        painter.drawRect(140, 20, 100, 100);

        // 3. 线性渐变填充
        QLinearGradient linearGradient(20, 140, 120, 140);
        linearGradient.setColorAt(0.0, Qt::green);
        linearGradient.setColorAt(1.0, Qt::yellow);
        QBrush gradientBrush(linearGradient);
        painter.setBrush(gradientBrush);
        painter.drawRect(20, 140, 100, 100);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    BrushExampleWidget widget;
    widget.setWindowTitle("QBrush Example");
    widget.resize(260, 260);
    widget.show();
    return app.exec();
}

头文件包含
QApplication:管理 Qt 应用程序的资源和事件循环。
QWidget:作为窗口的基类。
QPainter:用于实际的绘图操作。
QBrush:用于定义填充的属性。
QLinearGradient:用于创建线性渐变。
2. 自定义窗口类 BrushExampleWidget
继承自 QWidget,并重写 paintEvent 函数,在该函数中进行绘图操作。
3. paintEvent 函数
实心填充:
创建 solidBrush,使用红色(Qt::red)和实心填充样式(Qt::SolidPattern)。
使用 painter.setBrush(solidBrush) 设置画刷,然后使用 painter.drawRect 绘制一个矩形,该矩形将被红色实心填充。
疏密填充:
创建 denseBrush,使用蓝色(Qt::blue)和 Qt::Dense3Pattern 疏密填充样式。
设置画刷并绘制另一个矩形,该矩形将显示为蓝色的疏密填充效果。
线性渐变填充:
创建 linearGradient 线性渐变对象,设置起始点和结束点,以及渐变的颜色停止点(从绿色到黄色)。
使用 gradientBrush 画刷将线性渐变应用到填充中。
设置画刷并绘制第三个矩形,该矩形将显示为从绿色到黄色的线性渐变填充效果。
4. 主函数
创建 QApplication 对象,启动应用程序。
创建 BrushExampleWidget 实例,设置窗口标题和大小,并显示窗口。
调用 app.exec() 进入事件循环,等待用户操作。

在这里插入图片描述

看到窗口中绘制了三个矩形,分别展示了实心填充、疏密填充和线性渐变填充的效果。

与图形抗锯齿的关联

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBrush>

class AntialiasingExampleWidget : public QWidget {
protected:
    void paintEvent(QPaintEvent *event) override {
        Q_UNUSED(event);
        QPainter painter(this);

        // 不开启抗锯齿绘制椭圆
        QPen pen1(Qt::red, 2);
        QBrush brush1(Qt::yellow, Qt::SolidPattern);
        painter.setPen(pen1);
        painter.setBrush(brush1);
        painter.drawEllipse(20, 20, 100, 100);

        // 开启抗锯齿绘制椭圆
        painter.setRenderHint(QPainter::Antialiasing);
        QPen pen2(Qt::blue, 2);
        QBrush brush2(Qt::green, Qt::SolidPattern);
        painter.setPen(pen2);
        painter.setBrush(brush2);
        painter.drawEllipse(150, 20, 100, 100);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    AntialiasingExampleWidget widget;
    widget.setWindowTitle("Antialiasing Example");
    widget.resize(300, 150);
    widget.show();
    return app.exec();
}

包含了必要的 Qt 头文件,分别用于管理应用程序、创建窗口、进行绘图操作、设置
AntialiasingExampleWidget
继承自 QWidget 并重写 paintEvent 函数,在该函数中进行绘图操作。
创建一个红色、宽度为 2 像素的 QPen 和一个黄色实心填充的 QBrush,然后使用 QPainter 在坐标 (20, 20) 处绘制一个宽度和高度均为 100 的椭圆,此时未开启抗锯齿功能。
接着,使用 setRenderHint(QPainter::Antialiasing) 开启抗锯齿功能。创建一个蓝色、宽度为 2 像素的 QPen 和一个绿色实心填充的 QBrush,然后在坐标 (150, 20) 处绘制另一个宽度和高度均为 100 的椭圆。
创建 QApplication 对象来管理应用程序,创建 AntialiasingExampleWidget 窗口实例,设置窗口标题和大小,显示窗口并进入应用程序的事件循环。
在这里插入图片描述
看到窗口中绘制了两个椭圆,开启抗锯齿的椭圆边缘会更加平滑,而未开启抗锯齿的椭圆边缘可能会有锯齿状。

相关文章:

  • 线程同步辅助类的使用
  • 4.3MISC流量分析练习-wireshark-https
  • 内网渗透测试-Vulnerable Docker靶场
  • 深入探究OPA1612AIDR:性能剖析、引脚功能、应用实例与注意事项
  • 如何让别人的电脑蓝屏?(没有任何实质性损害,重启后仍然能正常运行;可恶搞)
  • 向量数据库milvus部署
  • Baklib驱动内容中台智能推荐优化
  • 《深度剖析:生成对抗网络中生成器与判别器的高效协作之道》
  • 华为数通Datacom认证体系详解:从HCIA到HCIE的进阶路径
  • 两种常见视频传输线材
  • 如何防止 Instagram 账号被盗用:安全设置与注意事项
  • 学习threejs,Materials常量汇总
  • Linux中Shell运行原理和权限(下)(4)
  • 玄机-第六章 流量特征分析-蚁剑流量分析
  • 软件工程应试复习(考试折磨版)
  • C语言机试编程题
  • 宋朝七律代表作20首
  • 用于训练基于pytorch构建的小型字符级语言模型的数据集汇总
  • 项目实践 之 pdf简历的解析和填充(若依+vue3)
  • 清华大学出品《DeepSeek 从入门到精通》完整版手册下载和使用教程。
  • 成就彼此,照亮世界:“中欧建交50周年论坛”在沪成功举行
  • 《尤物公园》连演8场:观众上台,每一场演出都独一无二
  • 股价两天涨超30%,中航成飞:不存在应披露而未披露的重大事项
  • 【社论】以法治力量促进民企长远健康发展
  • 欧派家居:一季度营收降4.8%,目前海外业务整体体量仍较小
  • 上海发布大风黄警:预计未来24小时内将出现8-10级大风