C#语言实例源码系列-仿360安全卫士界面

Posted 芝麻粒儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#语言实例源码系列-仿360安全卫士界面相关的知识,希望对你有一定的参考价值。

专栏分享

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

00. 目录

文章目录

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_OBJECT
public:
    //构造函数
    explicit ShadowBorderWidget(QWidget *parent = 0);
    //析构函数
    ~ShadowBorderWidget();

    // QWidget interface
protected:
    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.blog.csdn.net/article/details/115174639

以上是关于C#语言实例源码系列-仿360安全卫士界面的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

Android 类似360悬浮窗口实现源码

android 类似360悬浮窗口实现源码

WPF 在一个窗口里 通过点击不同的按钮,实现不同界面切换,类似Tabs控件,就像360安全卫士主界面那样