【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.8 画刷设置

news2024/11/16 17:42:29

本节对应的视频讲解:B_站_视_频

https://www.bilibili.com/video/BV1A44y1Z7vz
在这里插入图片描述


本节讲解画刷的设置,包括画刷的颜色和样式

画刷设置完后,就可以把该画刷设置给 QPainter 了


1. 相关 API

1.1 画刷颜色

// 获取和设置画刷的颜色
const QColor &color() const
void setColor(const QColor &color)

1.2 样式

// 获取和设置画刷的样式
Qt::BrushStyle style() const
void setStyle(Qt::BrushStyle style)

其中,Qt::BrushStyle 是一个枚举,取值和效果,如下:

image-20221216100949545


2. 具体实现

2.1 关联信号槽

为颜色、样式关联信号槽

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 画刷颜色
    connect(ui->btnBrushColor, SIGNAL(clicked()), this, SLOT(onBtnBrushColorClicked()));
    // 画刷样式
    connect(ui->cboBrushStyle, SIGNAL(activated(QString)), this, SLOT(brushChanged()));
}

2.2 声明并实现槽函数

首先,在 widget.h 中声明 brushChanged 和 onBtnPenColorClicked 这两个槽函数:

class Widget : public QWidget
{
private slots:
    void onBtnBrushColorClicked();
    void brushChanged();
};

然后,在 widget.cpp 中实现这两个槽函数:

void Widget::onBtnBrushColorClicked()
{
    QColor color = QColorDialog::getColor(QColor(255, 0, 0), this, "画刷颜色");
    if ( !color.isValid() ) {
        return;
    }

    // 回显画笔颜色
    QPalette pal = ui->btnBrushColor->palette();
    pal.setColor(QPalette::Button, color);
    ui->btnBrushColor->setPalette(pal);
    ui->btnBrushColor->setAutoFillBackground(true);
    ui->btnBrushColor->setFlat(true);

    brushChanged();
}

void Widget::brushChanged()
{
    // 1. 获取画刷颜色
    QPalette pal = ui->btnBrushColor->palette();
    QColor color = pal.color(QPalette::Button);

    // 2. 获取画刷样式
    int index = ui->cboBrushStyle->currentIndex();
    Qt::BrushStyle style = (Qt::BrushStyle)ui->cboBrushStyle->itemData(index).toInt();

    // 3. 设置画刷
    if ( style == Qt::LinearGradientPattern ) {
        // 线性渐变
        //        QLinearGradient linearGradient(0, 0, 100, 100);
        QLinearGradient linearGradient(0, 50, 100, 50);
        linearGradient.setColorAt(0.0, Qt::white);
        linearGradient.setColorAt(0.2, color);
        linearGradient.setColorAt(1.0, Qt::black);
        ui->paintWidget->setBrush(linearGradient);
    } else if ( style == Qt::RadialGradientPattern ) {
        // 线径向渐变
        QRadialGradient radialGradient(50, 50, 50, 70, 70);
        radialGradient.setColorAt(0.0, Qt::white);
        radialGradient.setColorAt(0.2, color);
        radialGradient.setColorAt(1.0, Qt::black);
        ui->paintWidget->setBrush(radialGradient);
    } else if ( style == Qt::ConicalGradientPattern ) {
        // 锥形渐变
        // QConicalGradient(qreal cx, qreal cy, qreal startAngle)
        QConicalGradient conicalGradient(50, 50, 150);
        conicalGradient.setColorAt(0.0, Qt::white);
        conicalGradient.setColorAt(0.2, color);
        conicalGradient.setColorAt(1.0, Qt::black);
        ui->paintWidget->setBrush(conicalGradient);
    } else if ( style == Qt::TexturePattern ) {
        // 纹理样式
        ui->paintWidget->setBrush(QBrush(QPixmap(":/images/brick.png")));
    } else {
        // 其他
        ui->paintWidget->setBrush(QBrush(color, style));
    }
}

2.3 实现 setBrush 函数

在 widget.cpp 中的 brushChanged 槽函数中,最终调用 PaintWidget 类中的 setBrush 来设置画刷,完成绘制。

首先,在 PaintWidget.h 中声明 setBrush 函数,并定义一个成员变量 mBrush,如下:

#include <QBrush>

class PaintWidget : public QWidget
{
public slots:
    void setBrush(const QBrush &brush);

private:
    QBrush mBrush;
};

然后,在 PaintWidget.cpp 中,实现 setBrush 函数:

void PaintWidget::setBrush(const QBrush &brush)
{
    this->mBrush = brush;
    update();
}

最后,由于上边调用了 update 之后,系统会自动调用 paintEvent

因此,在 paintEvent 中需要将画刷设置给 QPainter,来完成绘制

void PaintWidget::paintEvent(QPaintEvent *event)
{

    QPainter painter(this);
    painter.setBrush(mBrush);
}

这样就完成了画刷的设置


2.4 优化

修改 widget.cpp,设置画刷的默认颜色为红色

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 回显画刷颜色
    pal = ui->btnBrushColor->palette();
    pal.setColor(QPalette::Button, QColor(0, 255, 0));
    ui->btnBrushColor->setPalette(pal);
    ui->btnBrushColor->setAutoFillBackground(true);
    ui->btnBrushColor->setFlat(true);

    brushChanged();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新冠阳性的第三篇博客,使用Swagger管理API

新冠阳性的第三篇博客&#xff0c;使用Swagger管理API1.Swagger简介2.在项目中使用Swagger3.配置swagger4.swagger配置扫描接口5.配置API文档的分组6.swagger的实体类扫描7.给Controller加文档注释今天是新冠确诊的第二天&#xff0c;得了新冠也不要忘记学习啊&#xff01;&…

一文读懂自动驾驶汽车:软硬结合 造就未来出行体验(上篇)

在 GTC 2022 秋季大会上&#xff0c;NVIDIA 汽车部门营销经理 Katie Burke Washabaugh&#xff0c;面向想要了解自动驾驶汽车、并有志于投身自动驾驶行业的观众&#xff0c;介绍了自动驾驶汽车的历史、工作原理、相关技术以及发展前景。本文对此次分享的精华内容进行了汇总和整…

基于蒙特卡诺的电动汽车对电网影响(数据+Matlab代码)

目录 0 知识回顾 1 电网没考虑电动汽车时 1.1 案例1&#xff08;4kw&#xff09; 1.2 案例2&#xff08;7kw&#xff09; 31.3 案例3&#xff08;20kw&#xff09; 2 静态测试 2.1 收敛的最优结果 2.2 改变电动汽车数量的影响 2.3 收敛的最优结果 3 动态测试 4 一…

图结构

图结构 从哥尼斯堡的七桥问题开始 ▪ 18世纪初普鲁士的哥斯尼堡,有一条河穿过,河上有两个小岛,有七座桥把两个小岛与河岸联系起来 ▪ 问题:一个步行者怎样才能不重复、不遗漏地一次走完七座桥&#xff0c;最后回到出发点。 ▪ 难点&#xff1a;可能的走法----7&#xff01;5…

苹果给出 AirTag 固件更新日志,苹果Find My功能越来越完善

自 11 月以来&#xff0c;苹果已经为其 AirTag 物品追踪器发布了两个固件更新。然而&#xff0c;该公司此前并没有详细说明这些更新带来了什么变化。不过有网友发现&#xff0c;苹果终于分享了最新 AirTag 固件更新的更新内容。 以下是 AirTag 固件更新 2.0.24 和 2.0.36 带来…

[力扣c++实现]85. 最大矩形

85. 最大矩形 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”…

2022最新最全的Java面试八股文小抄开源!带你摸熟 20+ 互联网公司面试考点

2022真是多变的一年&#xff0c;相对往年我们会发现今年猎头电话少了&#xff0c;大部分企业年终奖缩水&#xff0c;加薪幅度也不如往年&#xff0c;选择好 offer 就要趁早&#xff0c;现在开始准备吧&#xff0c;刷一波 Java 面试题&#xff0c;能回答 70%就去 BATJTMD 大胆试…

基于SSM实现的网上手机商城项目(附源码)

基于SpringSpring MVCMyBatisLayui框架 项目完整源码下载 https://download.csdn.net/download/DeepLearning_/87327169 功能&#xff1a; 前台 登录、注册、注销查看商品、商品评论、热销商品收藏、取消收藏商品加入购物车购物车增、删、改、查购买商品、确认收货、删除已…

stop pin/ignore pin/exclude pin/float pin

stop pin、ignore pin、exclude pin和float pin的区别如下图&#xff1a; 1、Stop pins stop pin是clock tree的leaf pin&#xff0c;作为clock tree的终点&#xff0c;需要balance insertion delay&#xff08;latency&#xff09;&#xff0c;clock sink都是stop pin。 2、…

七、http模块

HTTP —— 超文本传输协议&#xff0c;用于规范客户端浏览器和服务端以何种格式进行通信和数据交互&#xff1b;HTTP由请求和响应构成的&#xff0c;是一个标准的客服端服务器模型。 HTTP请求响应过程 先简单的来了解以下HTTP的请求响应过程&#xff1a;1.地址解析&#xff1a…

普通人为什么要学习python?有什么用

为什么要学习python&#xff1f; 比如新媒体职业&#xff1a; 1、简单来说&#xff0c;你会python后就相当于自己建造一个属于自己工作区块的微博热搜榜。你可以利用爬虫、收据抓取等技术知道哪些话题近期特别火&#xff0c;为什么火、有什么共通点&#xff0c;然后根据这些依…

3.1 多集放大电路的耦合方式

在实际应用中&#xff0c;常对放大电路的性能提出多方面的要求。所以&#xff0c;仅靠任何一种基本的放大电路并不能满足要求&#xff0c;此时可以选择多个基本放大电路级联在一起构成多级放大电路。 组成多级放大电路的每一个基本放大电路称为一级&#xff0c;级与级之间的连接…

Win11的两个实用技巧系列之玩游戏闪跳、错误代码0x80004005解决

Win11玩游戏经常无缘无故跳回桌面怎么解决? 最近有Win11用户反应&#xff0c;自己在玩游戏的时候遇到了经常无缘无故跳回桌面的情况&#xff0c;本文就为大家带来了详细的解决方法&#xff0c;需要的朋友一起看看吧 最近有Win11用户反应&#xff0c;自己在玩游戏的时候遇到了…

关于ShardingSphere内置分片算法及其数据倾斜问题总结

ShardingSphere是一款不错的分库分表中间件&#xff0c;并且其内置提供了多种分片算法。但是使用内置的分片算法会造成数据倾斜问题。下面以5.2.0版本的ShardingSphere详细介绍下几种内置分片算法并且分析下数据倾斜问题。 一、ShardingSphere内置分片算法介绍 根据官网描述&…

web前端-javascript-包装类(String,Number,Boolean,基本数据类型调用方法先转换为对象再调换)

包装类 1. 说明 在 JS 中为我们提供了三个包装类&#xff0c;通过这三个包装类可以将基本数据类型的数据转化为对象String() 可以将基本数据类型字符串转换为 String 对象 Number() 可以将基本数据类型的数字转换为 Number 对象 Boolean() 可以将基本数据类型的布尔值转换为 …

【C语言】重要函数atoi的使用

目录 一、atoi函数的介绍 二、atoi函数的使用 三、atoi函数的模拟实现 一、atoi函数的介绍 一个专门将字符串转换为整数的库函数&#xff0c;具体用法如下&#xff1a; 字符串str&#xff0c;将其内容转化为整数&#xff0c;该整数作为int值返回。 二、atoi函数的使用 atoi函…

CentOS7安装apache2并启动

CentOS7安装apache2并启动源码安装启动和停止源码安装 地址&#xff1a;https://downloads.apache.org/httpd/ https://downloads.apache.org/httpd/httpd-2.4.54.tar.gz 参考&#xff1a;https://www.cnblogs.com/xiangqs/p/8663947.html 启动和停止 网上搜到的都是/usr/lo…

linux安装redis

目录 一、准备redis 二、上传redis到linux 三、编译与安装 四、修改配置文件 五、设置开放的服务或端口号或直接关闭防火墙 法1&#xff1a; 法2&#xff1a; 六、验证是否成功 1.直接在linux启动客户端 2.在windows启动redis客户端&#xff0c;连接linux的redis服务…

Java+mysql基于ssm的大学生求职招聘系统

本求职招聘管理系统主要包括系统用户管理模块、企业新闻管理模块、招聘发布会管理、招聘信息管理、登录模块、和退出模块等多个模块。它帮助求职招聘管理实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了求职招聘管理数据资源,有效的减…

Docker方式发布jar文件

在IDEA中将SpringBoot项目打为jar包步骤&#xff1a; 1、打开项目的pom.xml文件&#xff0c;添加或修改packaging标签&#xff0c;如下图&#xff1a; <packaging>jar</packaging> 2、点击右侧maven&#xff0c;展开lifecycle&#xff0c;先clean&#xff0c;然后…