📒博客首页:何名取 的个人主页 - 文章 - 掘金 (juejin.cn)
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❤️期待一起交流!
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!
圆角窗口
前言
Qt中默认打开的窗口一般是跟随系统的。比如在Windows10系统上是这种棱角分明的样式,而且自带关闭,最大化,最小化按钮的,如下图所示的这样。本节则对默认的窗口样式进行圆角处理,下面来介绍两种我常用的处理方式。
方法一:遮罩
方法一使用的是遮罩的形式,在窗口上设置所需形状的遮罩层挡住不想看到的区域即可。下图是ui界面的布局:
#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作为背景板,修改样式表即可。
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();
}