【Qt实用技巧】实现圆角窗口的两种方法

2,121 阅读2分钟

📒博客首页:何名取 的个人主页 - 文章 - 掘金 (juejin.cn)
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❤️期待一起交流!
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!


圆角窗口

image.png

前言

Qt中默认打开的窗口一般是跟随系统的。比如在Windows10系统上是这种棱角分明的样式,而且自带关闭,最大化,最小化按钮的,如下图所示的这样。本节则对默认的窗口样式进行圆角处理,下面来介绍两种我常用的处理方式。

image.png

方法一:遮罩

方法一使用的是遮罩的形式,在窗口上设置所需形状的遮罩层挡住不想看到的区域即可。下图是ui界面的布局:

image.png

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainterPath>
#include <QRegion>
#include <QTimer>
#include <QGraphicsDropShadowEffect>

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

    setWindowFlag(Qt::FramelessWindowHint);         //无边框
    setAttribute(Qt::WA_TranslucentBackground);     //窗口透明

    //直接初始化不起作用,需要定时器延时初始化
    QTimer *t = new QTimer(this);
    connect(t, &QTimer::timeout, this, [=](){Init();});
    t->setSingleShot(true);
    t->start(10);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_closeBtn_clicked()
{
    close();
}

void MainWindow::Init()
{
    const int cornerRadius = 20;                    //窗口倒角弧度
    QColor mainBackGround = QColor(251, 251, 251);  //背景色,默认白色
    //绘制遮罩
    QPainterPath path;
    path.addRoundedRect(ui->mainWidget->rect(),cornerRadius-1,cornerRadius-1);
    QRegion mask(path.toFillPolygon().toPolygon());
    ui->mainWidget->setMask(mask);
    //设置主界面样式
    QString mainStyle("QWidget#mainWidget{background-color:"
                      + mainBackGround.name()
                      + QString::asprintf(";border-radius:%dpx", cornerRadius)
                      + "}");
    ui->mainWidget->setStyleSheet(mainStyle);
    //设置投影效果
    QGraphicsDropShadowEffect *windowShadow;        //阴影效果
    windowShadow = new QGraphicsDropShadowEffect(this);
    windowShadow->setBlurRadius(30);
    windowShadow->setColor(QColor(0, 0, 0));
    windowShadow->setOffset(0, 0);
    ui->mainWidget->setGraphicsEffect(windowShadow);
}

方法二:样式表

方式二相较方式一更为简单,只需要将QFrame作为背景板,修改样式表即可。 image.png

background-color: rgb(255, 255, 255);
border-radius:20px
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsDropShadowEffect>

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

    setWindowFlag(Qt::FramelessWindowHint);         //无边框
    setAttribute(Qt::WA_TranslucentBackground);     //窗口透明

    //设置投影效果
    QGraphicsDropShadowEffect *windowShadow;        //阴影效果
    windowShadow = new QGraphicsDropShadowEffect(this);
    windowShadow->setBlurRadius(30);
    windowShadow->setColor(QColor(0, 0, 0));
    windowShadow->setOffset(0, 0);
    ui->frame->setGraphicsEffect(windowShadow);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_closeBtn_2_clicked()
{
    close();
}