深入Qt--背景半透明窗体

该博客介绍了如何在Qt中创建一个背景半透明的窗体,适用于嵌入式设备。通过`MaskForm`类,可以设置遮罩颜色、透明度,并注册显示在遮罩中的窗口,提供了一种优雅的方式在上方窗口覆盖下方窗口时保持视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深入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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值