1. 目标
我们目标是做一个在各个平台上样式高度统一的软件,所以最好的选择是自定义一个基本窗口(QWidget),去掉平台附加的平台样式(边框、按钮等),最后的成品需要具备以下特性:
-
无边框
-
窗口阴影
-
自定义标题栏
-
可拖动
2. 实现
创建一个basewidget模块,包含一个继承QWidget的BaseWidget类:
basewidget
- basewidget.pri
- basewidget.h
- basewidget.cpp
2.1 无边框
这个实现比较简单,在构造函数设置windowFlag就行
BaseWidget::BaseWidget(QWidget *parent) : QWidget{
parent} {
setWindowFlags(Qt::FramelessWindowHint);
}
2.2 窗口阴影
所有的无边框的窗口阴影实现方案都需要将最下面的widget背景透明:
setAttribute(Qt::WA_TranslucentBackground);
有些方案需要预留出绘制阴影的margin(比如预留8px):
setContentsMargins(8, 8, 8, 8);
之后绘制阴影有以下几种方法:
-
预留margin,在paintEvent中用贴图的方式绘制四周阴影(需要一张渐变png)
-
预留margin,在paintEvent或qss中用渐变色绘制阴影
-
无需预留margin,使用QGraphicsDropShadowEffect设置阴影
这里我们采用第三种方案(因为足够简单)。
首先添加一个带ui文件的QWidget类(Qt 设计器界面类),继承BaseWidget类:
#pragma once
#include <basewidget/basewidget.h>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public BaseWidget {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr
跨平台无边框窗口设计

最低0.47元/天 解锁文章
2330

被折叠的 条评论
为什么被折叠?



