深入Qt–背景半透明窗体
背景半透明在实际工程项目应用比较广泛,特别是嵌入式设备中,当一个窗体置在另外一个窗体的上方时下方窗口被一层半透明窗体覆盖,处于上方的窗体显示出来。下面将代码与用法提供出来。
头文件:
#ifndef MASKFROM_H
#define MASKFROM_H
#include <QWidget>
class MaskForm : public QWidget
{
Q_OBJECT
public:
explicit MaskForm(QWidget *parent = nullptr);
~MaskForm();
/**
* @brief 注册要显示在遮罩中的窗口
* @param widget 要显示的窗口
*/
void installWidget(QWidget *widget);
/**
* @brief 设置遮罩的颜色,透明度
* @param color 遮罩颜色
* @param opacity 透明度
*/
void setMaskColor(const QColor &color, float opacity);
/**
* @brief 设置顶层窗口(覆盖窗口)
* @param widget 顶层窗口
*/
void setTopWidget(QWidget *widget);
private:
void init();
void showEvent(QShowEvent *event);
bool eventFilter(QObject *watched, QEvent *event);
private:
//顶层窗口,设置遮罩大小
QWidget *m_topWidget;
//遮罩中显示的窗口
QWidget *m_widget;
};
#endif // MASKFROM_H
源文件:
#include <QDebug>
#include <QGridLayout>
#include <QEvent>
#include <QApplication>
#include "maskform.h"
MaskForm::MaskForm(QWidget *parent)
: QWidget(parent),m_topWidget(nullptr),m_widget(nullptr)
{
init();
}
MaskForm::~MaskForm()
{
}
void MaskForm::installWidget(QWidget *widget)
{
if (widget == nullptr) {
return;
}
widget->installEventFilter(this);
m_widget = widget;
connect(m_widget, &QWidget::destroyed, this, [=](){
m_widget = nullptr;
});
}
void MaskForm::setMaskColor(const QColor &color, float opacity)
{
if (!color.isValid()) {
return;
}
QPalette palette = this->palette();
palette.setColor(QPalette::Window, color);
this->setPalette(palette);
setWindowOpacity(opacity);
}
void MaskForm::setTopWidget(QWidget *widget)
{
if (widget == nullptr) {
return;
}
m_topWidget = widget;
}
void MaskForm::init()
{
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
setMaskColor(QColor(60, 60, 60), 0.8f);
m_topWidget = QApplication::activeWindow();
}
void MaskForm::showEvent(QShowEvent *event)
{
Q_UNUSED(event);
this->setGeometry(m_topWidget->geometry());
}
bool MaskForm::eventFilter(QObject *watched, QEvent *event)
{
if (watched == m_widget) {
if (event->type() == QEvent::Show) {
this->show();
}
if (event->type() == QEvent::Hide) {
this->hide();
}
}
return QObject::eventFilter(watched, event);
}
用法:
MaskForm maskForm;
XSerialDialog *dlg = new XSerialDialog(XSerialDialog::OTHER, &maskForm, Qt::Dialog | Qt::Popup);
dlg->setMinimumSize(200, 100);
maskForm.installWidget(dlg);
dlg->exec();
if(dlg)delete dlg;