QStackedLayout 实现遮罩层

cpp 复制代码
QTabWidget 包含 QStackedWidget;
QStackedWidget 包含 QStackedLayout。

大家且看QStackedWidget的源码

cpp 复制代码
QStackedWidget::QStackedWidget(QWidget *parent)
    : QFrame(*new QStackedWidgetPrivate, parent)
{
    Q_D(QStackedWidget);
    d->layout = new QStackedLayout(this); //重点1
    connect(d->layout, SIGNAL(widgetRemoved(int)), this, SIGNAL(widgetRemoved(int)));
    connect(d->layout, SIGNAL(currentChanged(int)), this, SIGNAL(currentChanged(int)));
}

int QStackedWidget::addWidget(QWidget *widget)
{
    return d_func()->layout->addWidget(widget); //重点2
}

在构造函数里面创建一个QStackedLayout,之后addWidget直接用QStackedLayout的函数添加,其它的成员函数几乎都是这样。

看到这里时我有个疑问,既然都是直接套用的QStackedLayout了,那为啥不干脆直接用呢?难道因为是继承了QFrame想额外添加个边框么

函数部分

其它的函数自不必说了,和QStackedWidget如出一辙,但QStackedLayout还有个特殊的成员函数

setStackingMode

设置被管理的子QWidget的显示模式

cpp 复制代码
QStackedLayout::StackOne
//每次就显示一个Widget,默认值
QStackedLayout::StackAll
//全部显示出来,堆叠在一起

使用示例

用StackAll很适合来做透明遮罩或者水印这些,因为QStackLayout会自动把子控件的大小保持一致,省掉了我们重写resize相关事件的代码。上代码:

cpp 复制代码
QStackedLayout *stackLayout = new QStackedLayout;
stackLayout->setStackingMode(QStackedLayout::StackAll);

//添加遮罩
QPushButton *btn = new QPushButton("我就是个遮罩...点下就没", this);
btn->setStyleSheet("background-color: rgba(0,0,0,120); color: white");
stackLayout->addWidget(btn);
connect(btn, &QPushButton::clicked, this, [=](){
    //隐藏遮罩
    btn->hide();
});

//添加底层内容
auto label = new QLabel("我是底层正常内容,一直可见", this);
label->setStyleSheet("color: red;");
stackLayout->addWidget(label);
this->setLayout(stackLayout);

看下效果:

除了直接隐藏遮罩外,也可以修改下堆布局的当前下标,让QLabel显示最前面,像这样修改下代码

cpp 复制代码
stackLayout->setCurrentIndex(1);

但有个前提,就是QLabel的背景不能透明的,不然就露馅了。

相关推荐
mengzhi啊1 小时前
把数据存入sql数据库。qt,c++。
数据库·sql·qt
mengzhi啊7 小时前
SerialPortItem对串口再封装一层,省去一些常用的步骤,不用每次都去写类
qt
用户83344239661420 小时前
从批量操作到任务中心,再到现场工作台:DeviceForge v2.10—v2.12 完整演进
qt
宛 禾21 小时前
Qt 控件入门:QLabel 从拖拽到对象树,一篇讲透
c++·qt·学习
打工仔折腾 AI1 天前
Qt网络编程实战:UDP、TCP到HTTP的落地经验与选型
网络·人工智能·后端·python·qt·udp·ai agent 实战
Lhan.zzZ1 天前
Linux + Qt/QML:解决 QtQuick.VirtualKeyboard.Plugins 模块加载失败与环境变量配置
linux·数据库·qt
誰能久伴不乏1 天前
QT工业上位机一次「指令静默丢失」的排查
qt·docker·github
扶尔魔ocy2 天前
【qt openGL入门笔记】OSG实现飞机模型在网格图上飞行并进行态势标绘(四)
qt·opengl·osg
橙橙笔记2 天前
QT安卓软件的制作
android·git·qt·软件
芦芭荞2 天前
QT使用xml模版生成word文档
xml·qt·word