【QT入门】 无边框窗口设计之实现窗口阴影

往期回顾:

【QT入门】 设计实现无边框窗口拉伸的公用类-CSDN博客

【QT入门】对无边框窗口自定义标题栏并实现拖动和拉伸效果-CSDN博客

【QT入门】 自定义标题栏界面qss美化+按钮功能实现-CSDN博客

【QT入门】 无边框窗口设计之实现窗口阴影 

一共用了两个类,一个类放底层实现透明效果,一个类放顶层写控件实现整体布局,主要是添加一些基本属性来实现,同时注意区分,鼠标拖拽事件是在底层类实现,而不是在控件布局类。

一、最终效果

 这里的阴影颜色是可以随意调换,用绿色单纯是因为比较显眼

二、顶层类界面设计 

 纯写布局,用了一个栅格布局来实现登录窗口,整体布局很简单,依旧是用无边框窗口。

1、需要注意的方法 

1.1setPlaceholderText()

这里用到一个方法setPlaceholderText,是用于设置控件的占位文本,在用户输入前提供一些提示性文字,告诉用户该输入框的预期内容或用途。当用户开始输入内容时,占位文本会自动消失。 

 //用户名QLineEdit* pUserNameLineEdit = new QLineEdit(this);pUserNameLineEdit->setFixedSize(300, 50);pUserNameLineEdit->setPlaceholderText(QStringLiteral("QQ号码/手机/邮箱"));
1.2 QStringLiteral

后面又用了一个QStringLiteral,这是Qt中的一个宏,用于创建一个编译时的不可变的QString对象。相比于普通的字符串字面值,使用QStringLiteral可以提高字符串的效率和性能,因为它会在编译时将字符串转换为不可变的QString对象,而不是在运行时进行转换。 

2、代码实现

#include "CLoginRealWidget.h"
#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
#include <QPushButton>
#include <QHBoxLayout>
#include <QGridLayout>CLoginRealWidget::CLoginRealWidget(QWidget* p):QWidget(p)
{//禁止父窗口影响子窗口样式setAttribute(Qt::WA_StyledBackground);setWindowFlags(Qt::FramelessWindowHint);//头像QLabel* pImageLabel = new QLabel(this);QPixmap pixmap(":/CLoginDig/resource/user_image.png");pImageLabel->setFixedSize(150, 150);pImageLabel->setPixmap(pixmap);pImageLabel->setScaledContents(true);//用户名QLineEdit* pUserNameLineEdit = new QLineEdit(this);pUserNameLineEdit->setFixedSize(300, 50);pUserNameLineEdit->setPlaceholderText(QStringLiteral("QQ号码/手机/邮箱"));//密码QLineEdit* pPasswordLineEdit = new QLineEdit(this);pPasswordLineEdit->setFixedSize(300, 50);pPasswordLineEdit->setPlaceholderText(QStringLiteral("密码"));pPasswordLineEdit->setEchoMode(QLineEdit::Password);//输入设置成密码输入,这样会自动不显示QPushButton* pForgotButton = new QPushButton(this);pForgotButton->setText(QStringLiteral("找回密码"));pForgotButton->setFixedWidth(80);QCheckBox* pRememberCheckBox = new QCheckBox(this);pRememberCheckBox->setText(QStringLiteral("记住密码"));QCheckBox* pAutoLoginCheckBox = new QCheckBox(this);pAutoLoginCheckBox->setText(QStringLiteral("自动登录"));QPushButton* pLoginButton = new QPushButton(this);pLoginButton->setFixedHeight(48);pLoginButton->setText(QStringLiteral("登录"));QPushButton* pRegisterButton = new QPushButton(this);pRegisterButton->setFixedHeight(48);pRegisterButton->setText(QStringLiteral("注册账号"));QHBoxLayout* pMainLay = new QHBoxLayout(this);QSpacerItem* pHSpacer = new QSpacerItem(25, 20, QSizePolicy::Fixed, QSizePolicy::Fixed);pMainLay->addSpacerItem(pHSpacer);QGridLayout* pGridLayout = new QGridLayout(this);// 头像 第0行,第0列开始,占3行1列pGridLayout->addWidget(pImageLabel, 0, 0, 3, 1);// 用户名输入框 第0行,第1列开始,占1行2列pGridLayout->addWidget(pUserNameLineEdit, 0, 1, 1, 2);// 密码输入框 第1行,第1列开始,占1行2列pGridLayout->addWidget(pPasswordLineEdit, 1, 1, 1, 2);// 忘记密码 第2行,第1列开始,占1行1列pGridLayout->addWidget(pForgotButton, 2, 1, 1, 1);// 记住密码 第2行,第2列开始,占1行1列 水平居中 垂直居中pGridLayout->addWidget(pRememberCheckBox, 2, 2, 1, 1, Qt::AlignLeft | Qt::AlignVCenter);// 自动登录 第2行,第2列开始,占1行1列 水平居右 垂直居中pGridLayout->addWidget(pAutoLoginCheckBox, 2, 2, 1, 1, Qt::AlignRight | Qt::AlignVCenter);// 登录按钮 第3行,第1列开始,占1行2列pGridLayout->addWidget(pLoginButton, 3, 1, 1, 2);// 注册按钮 第4行,第1列开始,占1行2列pGridLayout->addWidget(pRegisterButton, 4, 1, 1, 2);// 设置水平间距pGridLayout->setHorizontalSpacing(10);// 设置垂直间距pGridLayout->setVerticalSpacing(10);pMainLay->addLayout(pGridLayout);pMainLay->addSpacerItem(pHSpacer);pMainLay->setContentsMargins(5, 5, 5, 5);setLayout(pMainLay);
}CLoginRealWidget::~CLoginRealWidget()
{
}

三、底层类阴影实现

1、顺序梳理

逻辑不难,按照顺序来做就ok:

1、设置窗口透明
2、设置无边框
3、给顶层widget设置背景颜色
4、设置阴影距离
5、设置阴影颜色
6、设置阴影区域
7、给顶层QWidget设置阴影

2、代码实现

#include "CLoginDig.h"
#include "CLoginRealWidget.h"
#include <QGraphicsDropShadowEffect>
#include <QVboxLayout>
#include <QMouseEvent>CLoginDig::CLoginDig(QWidget *parent): QDialog(parent)
{//设置窗体透明this->setAttribute(Qt::WA_TranslucentBackground, true);//设置无边框this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);QVBoxLayout* pMainLay = new QVBoxLayout(this);CLoginRealWidget* pRealWidget = new CLoginRealWidget(this);pMainLay->addWidget(pRealWidget);pMainLay->setContentsMargins(30, 30, 30, 30);setLayout(pMainLay);//给顶层widget设置背景颜色,不然看不见,因为底层widget已经透明了pRealWidget->setStyleSheet("background-color:rgb(255, 254, 253)");QGraphicsDropShadowEffect* shadow = new QGraphicsDropShadowEffect(this);//设置阴影距离shadow->setOffset(0, 0);//设置阴影颜色  686868shadow->setColor(QColor("#00FF00"));//设置阴影区域shadow->setBlurRadius(30);//给顶层QWidget设置阴影pRealWidget->setGraphicsEffect(shadow);
}CLoginDig::~CLoginDig()
{}

注意设置窗口透明的

 this->setAttribute(Qt::WA_TranslucentBackground, true);

 阴影部分专门用了一个宏

QGraphicsDropShadowEffect* shadow = new QGraphicsDropShadowEffect(this);

四、鼠标拖拽事件

底层类负责鼠标拖拽事件,区分之前的写一个函数实现鼠标拖拽标题栏,只用一个函数写在标题栏类里面,就是只有拖拽标题栏才行,这样写是整体随便哪个区域都可以拖拽。

void CLoginDig::mousePressEvent(QMouseEvent* event)
{this->windowPos = this->pos();       // 获得部件当前位置this->mousePos = event->globalPos(); // 获得鼠标位置this->dPos = mousePos - windowPos;   // 移动后部件所在的位置
}void CLoginDig::mouseMoveEvent(QMouseEvent* event)
{this->move(event->globalPos() - this->dPos);
}

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 回调函数的两种使用方法

对回调&#xff08;callback&#xff09;函数的一点粗陋理解&#xff0c;在我小时候&#xff0c;隔壁村有家月饼小作坊&#xff08;只在中秋那段时间手工制作一些月饼出售&#xff0c;后来好像不做了&#xff09;&#xff0c;做出的月饼是那种很传统很经典的款式&#xff0c;里…

C语言要点细细梳理(上)

1.类型转换 1.1 隐式类型转换 在两个不同类型数据进行运算时&#xff0c;会把低精度类型的数据转为与高精度类型一致的数据类型然后计算&#xff0c;然后再根据赋值的需要把计算结果转回去 1.2 强制类型转换 可以将某种类型的数据转换为想要的精度&#xff0c;一般int、dou…

Swin_transformer模型解析

目录 •1、网络整体框架 •2 、Patch Merging •3 、W-MSA MSA模块计算量 W-MSA模块计算量 •4、 SW-MSA •5 、Relative Position Bias •1、网络整体框架 •2 、Patch Merging 这里看着挺复杂&#xff0c;其实就相当于先对特征图进行LayerNorm&#xff0c;然后再进行一…

webapi 允许跨域

1.在Nuget安装webapi.cors 添加完会有这个包 然后在项目App_Start 目录下的WebApiConfig.cs里面添加 // Web API 配置和服务// 添加跨域设置config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

CSS基础选择器 小案例复习(画三个小盒子)

&#xff08;大家好&#xff0c;前面我们学习了基础的选择器&#xff0c;俗话说&#xff1a;温故而知新。所以今天我们将通过小案例来复习前面学过的小知识点。另&#xff0c;十分感谢大家对我文章的支持❤️&#xff09; 通过这个案例复习两个地方&#xff1a; 类选择器的使用…

GICv3学习

中断分组 GICD_CTLR&#xff1a;配置是否支持group0、安全group1、非安全group1中断&#xff1b; 怎么配置中断在哪个组&#xff1b; 怎么知道中断是安全的还是非安全的&#xff1b; GICD_IGROUPR&#xff1a; 配置中断分组、中断是安全还是非安全&#xff1b; 4.4 软件产生中…

北方经贸经济类知网收录月刊投稿发表论文

《北方经贸》期刊是由国家新闻出版总署批准&#xff0c;黑龙江省教育厅主管&#xff0c;黑龙江省经济管理干部学院主办的经济类综合期刊。期刊融理论性、知识性、实践性于一体&#xff0c;立足龙江&#xff0c;辐射全国&#xff0c;面向世界&#xff0c;注重研究解决重大现实理…

探索智慧物流园区系统的发展蓝图

在当今数字化时代&#xff0c;智慧物流园区系统正经历着深刻的变革和快速的发展。那么&#xff0c;智慧物流园区系统的发展趋势究竟是什么呢&#xff1f;让我们一同深入探讨。 &#xff08;1&#xff09;智能化是智慧物流园区系统的重要发展趋势之一。通过人工智能、大数据等先…

双机 Cartogtapher 建图文件配置

双机cartogtapher建图 最近在做硕士毕设的最后一个实验&#xff0c;其中涉及到多机建图&#xff0c;经过调研最终采用cartographer建图算法&#xff0c;其中配置多机建图的文件有些麻烦&#xff0c;特此博客以记录 非常感谢我的同门 ”叶少“ 山上的稻草人-CSDN博客的帮助&am…

文心一言指令词宝典之旅行篇

作者&#xff1a;哈哥撩编程&#xff08;视频号、抖音、公众号同名&#xff09; 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5;…

【C++】理解vector的底层原理并模拟实现(手撕vector)

目录 01.成员变量 02.构造与析构 03.管理内存 1.reserve函数 2.reszie函数 04.访问元素 05.修改元素 之前的一篇博客讲到了vector的介绍及其运用&#xff1a;vector的介绍及使用说明 但是我们不仅要会用&#xff0c;还要理解它的底层原理&#xff0c;今天我们通过手撕一个…

wireshark解析grpc/protobuf的方法

1&#xff0c;wireshark需要安装3.20以上 下载地址&#xff1a;https://www.wireshark.org/ 2&#xff0c;如果版本不对&#xff0c;需要卸载&#xff0c;卸载方法&#xff1a; sudo rm -rf /Applications/Wireshark.app sudo rm -rf $HOME/.config/wireshark sudo rm -rf /…