700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【Qt】仿360安全卫士界面(自定义阴影边框类)

【Qt】仿360安全卫士界面(自定义阴影边框类)

时间:2022-06-22 12:14:03

相关推荐

【Qt】仿360安全卫士界面(自定义阴影边框类)

00. 目录

文章目录

00. 目录01. 概述02. 开发环境03. 自定义阴影边框类设计与实现04. 测试代码05. 示例下载06. 附录

01. 概述

Qt默认的QDialog和QWidget都带有边框和标题栏。如何实现一个不带有标题栏的边框,并且边框带有阴影效果。其实很简单,我们只需要自定义QDialog类,然后实现重绘事件即可。

效果图如下所示(四周有阴影效果):

02. 开发环境

Windows系统:Windows10

Qt版本:Qt5.15或者Qt6

03. 自定义阴影边框类设计与实现

shadowborderwidget.h

#ifndef SHADOWBORDERWIDGET_H#define SHADOWBORDERWIDGET_H#include <QDialog>#include <QWidget>#include <QMouseEvent>#include <QPaintEvent>#include <QPainterPath>#include <QPainter>#include <QtMath>// 阴影边框class ShadowBorderWidget : public QDialog{Q_OBJECTpublic://构造函数explicit ShadowBorderWidget(QWidget *parent = 0);//析构函数~ShadowBorderWidget();// QWidget interfaceprotected:virtual void mousePressEvent(QMouseEvent *event);virtual void mouseReleaseEvent(QMouseEvent *event);virtual void mouseMoveEvent(QMouseEvent *event);virtual void paintEvent(QPaintEvent *event);private:QPoint movePoint; //移动的点bool isMousePressed; //鼠标左键是否按下};#endif // SHADOWBORDERWIDGET_H

shadowborderwidget.cpp

#include "shadowborderwidget.h"/*可以查看帮助文档:void setWindowFlags ( Qt::WindowFlags type )可以查看demo/example:Window Flags Example.this->setWindowFlags(Qt::Dialog | Qt::WindowMinimizeButtonHint);setWindowFlags ( Qt::WindowFlags type )Qt::FrameWindowHint:没有边框的窗口Qt::WindowStaysOnTopHint://总在最上面的窗口Qt::CustomizeWindowHint://自定义窗口标题栏,以下标志必须与这个标志一起使用才有效,否则窗口将有默认的标题栏Qt::WindowTitleHint:显示窗口标题栏Qt::WindowSystemMenuHint://显示系统菜单Qt::WindowMinimizeButtonHint://显示最小化按钮Qt::WindowMaximizeButtonHint://显示最大化按钮Qt::WindowMinMaxButtonsHint://显示最小化按钮和最大化按钮Qt::WindowCloseButtonHint://显示关闭按钮Qt::Drawer://去掉窗口左上角的图标,右上角的最大化最小化按钮------解决方案--------------------setWindowFlags(Qt::FramelessWindowHint);直接隐藏掉。。。*///构造函数ShadowBorderWidget::ShadowBorderWidget(QWidget *parent):QDialog(parent){//设置无边框setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);//设置半透明背景setAttribute(Qt::WA_TranslucentBackground);//默认鼠标左键没有按下isMousePressed = false;}//析构函数ShadowBorderWidget::~ShadowBorderWidget(){}//鼠标按下事件void ShadowBorderWidget::mousePressEvent(QMouseEvent *event){//鼠标左键移动和改变大小if (event->button() == Qt::LeftButton){isMousePressed = true;}//窗口移动的距离movePoint = event->globalPos() - pos();}//鼠标释放事件void ShadowBorderWidget::mouseReleaseEvent(QMouseEvent *){isMousePressed = false;}//鼠标移动事件void ShadowBorderWidget::mouseMoveEvent(QMouseEvent *event){//鼠标是否按下if (isMousePressed){QPoint movePos = event->globalPos();move(movePos - movePoint);}}//重绘事件 设置阴影效果void ShadowBorderWidget::paintEvent(QPaintEvent *){QPainterPath path;path.setFillRule(Qt::WindingFill);path.addRect(10, 10, this->width() - 20, this->height() - 20);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);painter.fillPath(path, QBrush(Qt::white));QColor color(0, 0, 0, 50);for (int i = 0; i < 10; i++){QPainterPath path;path.setFillRule(Qt::WindingFill);path.addRect(10 - i, 10 - i, width() - (10 - i) * 2, height() - (10 - i) * 2);color.setAlpha(150 - qSqrt(i) * 50);painter.setPen(color);painter.drawPath(path);}}

04. 测试代码

main.cpp

#include "widget.h"#include "shadowborderwidget.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);ShadowBorderWidget *w1 = new ShadowBorderWidget;w1->show();return a.exec();}

05. 示例下载

下载:【Qt】仿360安全卫士界面(自定义阴影边框类).rar

06. 附录

6.1 Qt教程汇总

网址:https://dengjin./article/details/115174639

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。