Qt之QGraphicsEffect的简单使用(含源码+注释)
文章目录
- 一、效果示例图
- 1.效果演示图片
- 3.弹窗演示图片
- 二.问题描述
- 三、源码
- CFrame.h
- CFrame.cpp
- CMainWindow.h
- CMainWindow.cpp
- 总结
一、效果示例图
1.效果演示图片


3.弹窗演示图片

二.问题描述
(因为全是简单使用,毫无技巧,直接描述问题)
- 模糊效果:QGraphicsBlurEffect包含setBlurHints函数,其作用为设置模糊质量,但是更新它时我这边肉眼上是没有看出特别明显的效果,需考虑不同情况的状态。
- 阴影效果:使用QGraphicsDropShadowEffect时,当我作用到弹窗上,它不是作用在弹窗边缘之外,而是作用在弹窗边缘之内,所以需要为其预留部分空间显示阴影。
- 透明效果:文中是使用QLinearGradient设置其不透明蒙版,使用中我试图使用三种不同颜色操作蒙版但是失败;其次是我首次将其作用到弹窗中是有效的,但是二次过后就无效,这个我暂时没找到原因。
三、源码
CFrame.h
#ifndef CFRAME_H
#define CFRAME_H#include <QObject>
#include <QFrame>
#include <QLabel>
#include <QHBoxLayout>class CFrame : public QFrame
{Q_OBJECT
public:explicit CFrame(QWidget *parent = nullptr);~CFrame();/*** @brief setStyleSheet 重写样式设置* @param style 样式文本*/void setStyleSheet(const QString &style);// QWidget interface
protected:/*** @brief keyReleaseEvent 键盘释放事件* @param event 事件对象*/void keyReleaseEvent(QKeyEvent *event);/*** @brief mousePressEvent 鼠标按下事件* @param event 事件对象*/void mousePressEvent(QMouseEvent *event);/*** @brief mouseMoveEvent 鼠标移动事件* @param event 事件对象*/void mouseMoveEvent(QMouseEvent *event);private:QPoint m_globalMousePos; // 全局鼠标位置QPoint m_globalWindowPos; // 全局窗口位置QHBoxLayout *m_layout; // 水平布局器对象QLabel *m_label; // 图片样式label};#endif // CFRAME_H
CFrame.cpp
#include "CFrame.h"#include <QKeyEvent>CFrame::CFrame(QWidget *parent) : QFrame(parent)
{this->setToolTip(u8"按任意键关闭窗口");this->setWindowFlag(Qt::FramelessWindowHint, true);// 创建水平布局器对象m_layout = new QHBoxLayout;m_layout->setMargin(10);// 创建图片显示labelm_label = new QLabel;m_layout->addWidget(m_label);// 将布局器设置到当前类中this->setLayout(m_layout);
}CFrame::~CFrame()
{delete m_layout;delete m_label;
}void CFrame::setStyleSheet(const QString &style)
{// 样式设置到label上m_label->setStyleSheet(style);
}void CFrame::keyReleaseEvent(QKeyEvent *event)
{// 任意键释放都关闭窗口this->close();
}void CFrame::mousePressEvent(QMouseEvent *event)
{// 获取鼠标全局位置m_globalMousePos = event->globalPos();// 获取窗口左上角位置m_globalWindowPos = this->frameGeometry().topLeft();
}void CFrame::mouseMoveEvent(QMouseEvent *event)
{//获得鼠标移动的距离QPoint distance = event->globalPos() - m_globalMousePos;//改变窗口的位置this->move(m_globalWindowPos + distance);
}
CMainWindow.h
#ifndef CMAINWINDOW_H
#define CMAINWINDOW_H#include "CFrame.h"#include <QGraphicsBlurEffect>
#include <QGraphicsColorizeEffect>
#include <QGraphicsDropShadowEffect>
#include <QGraphicsOpacityEffect>
#include <QMainWindow>
#include <QLinearGradient>QT_BEGIN_NAMESPACE
namespace Ui { class CMainWindow; }
QT_END_NAMESPACEclass CMainWindow : public QMainWindow
{Q_OBJECTpublic:CMainWindow(QWidget *parent = nullptr);~CMainWindow();private:void connectSigSlot();/*** @brief getCurTypeEffect 获取效果对象* @param id 效果id* @return 效果对象指针*/QGraphicsEffect *getCurTypeEffect(int id);private slots:/*** @brief on_buttonGroup_buttonClicked 单选按钮组点击槽函数* @param id 点击按钮id*/void on_buttonGroup_buttonClicked(int id);/*** @brief on_doubleSpinValueChanged 浮点微调框槽函数* @param arg1 调整值*/void on_doubleSpinValueChanged(double arg1);/*** @brief on_spinValueChanged 整型微调框槽函数* @param arg1 调整值*/void on_spinValueChanged(int arg1);/*** @brief on_btnClicked 按钮点击槽函数*/void on_btnClicked();/*** @brief on_btnSelImg_clicked 图片选择槽函数*/void on_btnSelImg_clicked();/*** @brief on_btnBecomeDlg_clicked 弹窗按钮槽函数*/void on_btnBecomeDlg_clicked();// QWidget interface
protected:/*** @brief closeEvent 关闭事件* @param event 时间对象*/void closeEvent(QCloseEvent *event);private:Ui::CMainWindow *ui;QLinearGradient m_linearGradient; // 透明效果的颜色梯度CFrame *m_dlgFrame; // 弹窗对象
};
#endif // CMAINWINDOW_H
CMainWindow.cpp
#include "CMainWindow.h"
#include "ui_CMainWindow.h"#include <QDebug>
#include <QKeyEvent>
#include <QFileDialog>
#include <QColorDialog>CMainWindow::CMainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::CMainWindow)
{ui->setupUi(this);// 创建弹窗对象m_dlgFrame = new CFrame;// 设置单选按钮id值ui->buttonGroup->setId(ui->checkBoxNoEffect, 0);ui->buttonGroup->setId(ui->checkBoxBlurEffect, 1);ui->buttonGroup->setId(ui->checkBoxColorEffect, 2);ui->buttonGroup->setId(ui->checkBoxShadowEffect, 3);ui->buttonGroup->setId(ui->checkBoxOpacityEffect, 4);// 线性渐变对象颜色位置赋值m_linearGradient.setColorAt(0, Qt::transparent);m_linearGradient.setColorAt(0.5, Qt::black);m_linearGradient.setColorAt(1, Qt::transparent);connectSigSlot();
}CMainWindow::~CMainWindow()
{delete m_dlgFrame;delete ui;
}void CMainWindow::connectSigSlot()
{// 链接浮点型数值框信号槽connect(ui->doubleSpinColorStrength, SIGNAL(valueChanged(double)), this, SLOT(on_doubleSpinValueChanged(double)));connect(ui->doubleSpinBoxOpacity, SIGNAL(valueChanged(double)), this, SLOT(on_doubleSpinValueChanged(double)));// 链接整型数值框信号槽connect(ui->spinBoxBulrRadius, SIGNAL(valueChanged(int)), this, SLOT(on_spinValueChanged(int)));connect(ui->spinBoxHorOffset, SIGNAL(valueChanged(int)), this, SLOT(on_spinValueChanged(int)));connect(ui->spinBoxVerOffset, SIGNAL(valueChanged(int)), this, SLOT(on_spinValueChanged(int)));connect(ui->spinBoxShadowBlurRadius, SIGNAL(valueChanged(int)), this, SLOT(on_spinValueChanged(int)));// 链接按钮信号槽connect(ui->btnColorSel, &QPushButton::clicked, this, &CMainWindow::on_btnClicked);connect(ui->btnShadowColorSel, &QPushButton::clicked, this, &CMainWindow::on_btnClicked);
}QGraphicsEffect *CMainWindow::getCurTypeEffect(int id)
{QGraphicsEffect *effectTmp = Q_NULLPTR;//! 根据ID创建效果对象,并将对应的效果之更新到对象中switch (id) {case 1:{QGraphicsBlurEffect *blurEffect = new QGraphicsBlurEffect; // 模糊效果// 设置颜模糊半径blurEffect->setBlurRadius(ui->spinBoxBulrRadius->value());effectTmp = blurEffect;break;}case 2:{QGraphicsColorizeEffect *colorEffect = new QGraphicsColorizeEffect; // 颜色效果// 设置颜色强度colorEffect->setStrength(ui->doubleSpinColorStrength->value());// 设置颜色colorEffect->setColor(ui->btnColorSel->palette().color(QPalette::Button));effectTmp = colorEffect;break;}case 3:{QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect; // 阴影效果shadowEffect->setColor(ui->btnShadowColorSel->palette().color(QPalette::Button)); // 阴影颜色shadowEffect->setOffset(ui->spinBoxHorOffset->value(), ui->spinBoxVerOffset->value()); // 阴影偏移度shadowEffect->setBlurRadius(ui->spinBoxBulrRadius->value()); // 模糊半径effectTmp = shadowEffect;break;}case 4:{QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect;opacityEffect->setOpacity(ui->doubleSpinBoxOpacity->value()); // 透明度m_linearGradient.setStart(ui->label->geometry().topLeft()); //起始位置m_linearGradient.setFinalStop(ui->label->geometry().bottomLeft()); // 结束位置opacityEffect->setOpacityMask(m_linearGradient);effectTmp = opacityEffect;break;}default:{break;}}return effectTmp;
}void CMainWindow::on_buttonGroup_buttonClicked(int id)
{// 更新栈窗口ui->stackedWidget->setCurrentIndex(id);// 更新控件效果ui->label->setGraphicsEffect(getCurTypeEffect(id));
}void CMainWindow::on_doubleSpinValueChanged(double arg)
{//! 获取发送者类型属性值//! 不同值做不同操作switch (sender()->property("Type").toInt()){case 2:{// 设置颜色强度dynamic_cast<QGraphicsColorizeEffect*>(ui->label->graphicsEffect())->setStrength(arg);break;}case 4:{// 设置透明度dynamic_cast<QGraphicsOpacityEffect*>(ui->label->graphicsEffect())->setOpacity(arg);break;}default:break;}
}void CMainWindow::on_spinValueChanged(int arg)
{//! 获取发送者类型属性值//! 不同值做不同操作switch (sender()->property("Type").toInt()){case 1:{// 设置颜模糊半径dynamic_cast<QGraphicsBlurEffect*>(ui->label->graphicsEffect())->setBlurRadius(arg);break;}case 3:{int flag = sender()->property("WhatThis").toInt();if(0 == flag){// 设置颜模糊半径dynamic_cast<QGraphicsDropShadowEffect*>(ui->label->graphicsEffect())->setBlurRadius(arg);}else if(1 == flag){// 设置垂直偏移dynamic_cast<QGraphicsDropShadowEffect*>(ui->label->graphicsEffect())->setYOffset(arg);}else{// 设置水平偏移dynamic_cast<QGraphicsDropShadowEffect*>(ui->label->graphicsEffect())->setXOffset(arg);}break;}default:break;}
}void CMainWindow::on_btnClicked()
{QPushButton *btn = dynamic_cast<QPushButton *>(sender());// 获取按钮进入的palette对象QPalette palette(btn->palette());// 颜色对象先赋值为当前按钮颜色(防止重新获取颜色时拿到失效颜色)QColor color = palette.color(QPalette::Button);// 然后重新获取颜色color = QColorDialog::getColor();if(!color.isValid()){return;}//! 获取发送者类型属性值//! 不同值做不同操作switch (btn->property("Type").toInt()){case 2:{// 设置颜色dynamic_cast<QGraphicsColorizeEffect*>(ui->label->graphicsEffect())->setColor(color);break;}case 3:{// 设置阴影颜色dynamic_cast<QGraphicsDropShadowEffect*>(ui->label->graphicsEffect())->setColor(color);break;}default:break;}// 更新调色板对象按钮颜色palette.setColor(QPalette::Button, color);btn->setPalette(palette);btn->setFlat(true); // 设置按钮扁平化btn->setAutoFillBackground(true); // 设置自动填充背景
}void CMainWindow::on_btnSelImg_clicked()
{// 获取图片QString fileName = QFileDialog::getOpenFileName(this, u8"选择图片", "./", "*.png *.jpg *.svg");// 为空返回if(fileName.isEmpty()){return;}// 通过样式设置图片ui->label->setStyleSheet(QString("border-image:url(%1)").arg(fileName));
}void CMainWindow::on_btnBecomeDlg_clicked()
{// 设置大小为本类的label(图片显示控件)大小m_dlgFrame->setFixedSize(ui->label->size());// 当前样式图片更新到弹窗label中m_dlgFrame->setStyleSheet(ui->label->styleSheet());// 获取当前属性效果并设置m_dlgFrame->setGraphicsEffect(getCurTypeEffect(ui->buttonGroup->checkedId()));// 显示弹窗m_dlgFrame->show();
}void CMainWindow::closeEvent(QCloseEvent *event)
{// 当弹窗未关闭时进入关闭if(m_dlgFrame->isVisible()){m_dlgFrame->close();}
}
总结
效果使用较为简单,因此暂无强调;文中存在一些问题,后期有解决会更新(要是有大佬指点更好啦)。
友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 o/)
注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除
相关文章:
Qt之QGraphicsEffect的简单使用(含源码+注释)
文章目录 一、效果示例图1.效果演示图片3.弹窗演示图片 二.问题描述三、源码CFrame.hCFrame.cppCMainWindow.hCMainWindow.cpp 总结 一、效果示例图 1.效果演示图片 3.弹窗演示图片 二.问题描述 (因为全是简单使用,毫无技巧,直接描述问题&a…...
前端优化-css
1.css盒子模型 标准盒子模型,IE盒子模型 标准盒子模型:margin-border-padding-content IE盒子模型:margin-content(border-padding-content) 如何转换: box - sizing: border - box; // IE盒子模型 box - sizing: content - …...
第三方ipad笔哪个牌子好用?ipad触控笔推荐平价
至于选择苹果原装的电容笔,还是平替的电容笔,要看个人的需求而定,比如画图用的,可以用Apple Pencil;比如学习记笔记用的,可以用平替电容笔,目前的平替电容笔无论是品质还是性能,都非…...
windows10+detectron2完美安装教程
文章目录 前言下载detectron2安装Visual Studio 2019修改代码 前言 需要下载detectron2的github项目,安装vs2019 (强烈建议这个版本,其他的版本需要做更多地操作才能成功安装),默认其他环境没问题。 下载detectron2 链接:https…...
串口与wifi模块
经过以下学习,我们掌握: AT指令与wifi模块的测试方法:通过CH340直接测试,研究各种AT指令下wifi模块的响应信息形式。编程,使用串口中断接收wifi模块对AT指令的响应信息以及透传数据,通过判断提高指令执行的…...
上财黄烨:金融科技人才的吸引与培养
“金融科技企业在吸引人才前,应先完善人才培养机制,建立员工画像,有针对性地培训提高成员综合素质。” ——上海金融智能工程技术研究中心上海财经大学金融科技研究院秘书长&院长助理黄烨老师 01.何为数字人才? 目前大多数研…...
利用MQ事务消息实现分布式事务
MQ事务消息使用场景 消息队列中的“事务”,主要解决的是消息生产者和消息消费者的数据一致性问题。 拿我们熟悉的电商来举个例子。一般来说,用户在电商 APP 上购物时,先把商品加到购物车里,然后几件商品一起下单,最后…...
C++面向对象设计:深入理解多态与抽象类实现技巧
面向对象的多态 一、概念二、实现1. 静态多态1.1 函数重载1.2 运算符重载 2. 动态多态2.1 虚函数2.2 纯虚函数 三、虚函数1. 定义2. 实现3. 注意 四、纯虚函数1. 定义2. 作用 五、虚析构函数1. 定义2. 作用 六、 抽象类七、实现多态的注意事项1. 基类虚函数必须使用 virtual 关…...
长三角生物医药产业加速跑,飞桨螺旋桨为创新药企、医药技术伙伴装上AI大模型引擎...
生物医药是国家“十四五”规划中明确的战略性新兴产业之一。长三角地区是中国生物医药产业的排头兵,也是《“十四五”生物经济发展规划》的“生物经济先导区”之一。据《上海市生物医药产业投资指南》显示,2022 年上海市生物医药产业在 I 类国产创新药数…...
orin Ubuntu 20.04 配置 Realsense-ROS
librealsense安装 sudo apt-get install libudev-dev pkg-config libgtk-3-dev sudo apt-get install libusb-1.0-0-dev pkg-config sudo apt-get install libglfw3-dev sudo apt-get install libssl-dev sudo apt-get install ros-noetic-ddynamic-reconfigure二进制安装libr…...
MyBatis基础知识点总结
MyBatis了解 MyBatis 是什么? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 MyBatis 可以使用简单的XML或注解用于配置和原始映射,将接口和Java的 POJO&#x…...
校园企业车辆维修报修管理系统设计与开发
本研究课题重点主要包括了下面几大模块:在本基于.net平台的车辆系统中分为管理员和用户2个模块,主要功能包括管理员信息管理,车辆信息管理,驾驶员信息管理,事故信息管理,维修信息管理,维修点管理…...
【企业信息化】第1集 免费开源ERP: Odoo 16 CRM客户关系管理系统
文章目录 前言一、概览二、使用功能1.加快销售速度2.销售线索3.机会4.客户5.高效沟通6.报告7.集成 三、总结 前言 世界排名第一的免费开源ERP: Odoo 16 CRM客户关系管理系统。真正以客户为中心的CRM。 一、概览 获得准确预测 使用可操作数据,以做出更好的决定。 获…...
Flink创建Hudi的Sink动态表
工厂类 HoodieTableFactory 提供的创建动态表接口 createDynamicTableSource 和 createDynamicTableSink,对应的源码文件为:https://github.com/apache/hudi/blob/master/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/table/HoodieT…...
人脸识别技术的安全性及其应用探讨
随着科技的不断发展,人脸识别技术已经成为了一个热门话题。人脸识别系统的出现,给人们的生活带来了极大的便利,同时也为一些犯罪分子提供了方便。因此,人脸识别技术的安全性和可靠性一直备受关注。 一、人脸识别技术的原理 人脸识…...
老域名查询工具- 在线域名批量查询工具
域名批量查询工具 域名批量查询工具是一种帮助用户快速查询多个域名信息的工具,通常能够自动扫描一组域名的WHOIS信息、DNS、IP地址、服务器等各种信息,并提供快速的结果反馈。 以下是域名批量查询工具主要的优点: 提高工作效率:…...
JimuReport - 积木报表(一款免费Web报表工具)
一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完成报表设计。…...
01-数据操作+数据预处理
1.n维数组,也称为张量(tensor):tensor和ndarray没有本质区别。tensor是有数学上的严格定义,ndarray是计算机描述的;张量表示一个由数值组成的数组,这个数组可能有多个维度; 无论使用…...
macOS本地python环境/vscode/导入python包/设置python解释器
查看macbook本地是否有python环境 输入python或者python3,退出python环境使用exit(),别忘了括号 没有的话去官网安装https://www.python.org/ 2. 安装vscode 官网https://code.visualstudio.com/ 3. 安装插件 点击左边的“插件”按钮,安装…...
【转存】Go语言设计模式
导语| 设计模式是针对软件设计中常见问题的工具箱,其中的工具就是各种经过实践验证的解决方案。即使你从未遇到过这些问题,了解模式仍然非常有用,因为它能指导你如何使用面向对象的设计原则来解决各种问题,提高开发效率࿰…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
