本文章使用QWidget来使窗口置灰,使用按钮控制置灰功能的开启和关闭,同时被置灰的控件自动禁用交互功能。
connect(ui.pushButton_open, &QPushButton::clicked, this, [=]() {
//创建无边框窗口,大小是父的大小
QWidget* parentWidget = new QWidget(this, Qt::FramelessWindowHint);
parentWidget->resize(this->size());
parentWidget->setObjectName("widget");
//设置蒙版背景色,其中140为蒙版透明度
parentWidget->setStyleSheet("#widget {background-color:rgba(192, 192, 192, 140);}");
//将groupBox添加到layout中。这样,groupBox就会被布局管理器管理,自动调整大小和位置
QGroupBox* groupBox = ui.groupBox;
QVBoxLayout* layout = new QVBoxLayout(parentWidget);
layout->addWidget(groupBox);
//设置groupBox背景色,跟蒙版颜色区分
groupBox->setStyleSheet("QGroupBox { background-color: rgb(255, 255, 255); }");
groupBox->setParent(this); //将groupBox设置为父窗口
groupBox->raise(); //将groupBox设置为顶层
parentWidget->stackUnder(groupBox); //将parentWidget设置为groupBox的下层
parentWidget->show(); //显示parentWidget
groupBox->show(); //显示groupBox
ui.textEdit->append("已置灰,自动禁用交互功能!");
});
以下功能是关闭置灰,不会删除parentWidget对象
connect(ui.pushButton__close, &QPushButton::clicked, this, [=]() {
parentWidget->close();
ui.textEdit->append("关闭置灰!");
});
头文件如下:包含<QGroupBox>, <QVBoxLayout>头文件,定义parentWidget、groupBox、layout对象
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication1.h"
#include <QGroupBox>
#include <QVBoxLayout>
class QtWidgetsApplication1 : public QMainWindow
{
Q_OBJECT
public:
QtWidgetsApplication1(QWidget *parent = nullptr);
~QtWidgetsApplication1();
QWidget* parentWidget;
QGroupBox* groupBox;
QVBoxLayout* layout;
private:
Ui::QtWidgetsApplication1Class ui;
};
UI界面如下:
效果如下:
开启置灰
关闭置灰