QT--创建蒙层

提示:本文为学习内容,若有错误,请联系作者


前言

只管努力,其他的交给时间。


一、蒙层的作用

1、为了其他窗口不被误操作,禁止对其他窗口操作
2、使用QProgressBar和QLabel显示进度条

二、使用步骤

1…h文件

代码如下(示例):

#ifndef QBASEMASK_H
#define QBASEMASK_H

/************************************新增蒙层********************/

#include <QWidget>

class  QBaseMask : public QWidget
{
    
    
public:
    explicit QBaseMask(QWidget* parent = nullptr);
    ~QBaseMask();

    /// @brief 显示窗体蒙板
    static void ShowBaseMaskWindow(QWidget* parent, QString text = "");
    /// @brief 关闭窗体蒙板
    static void CloseBaseMaskWindow();
    /// @brief 创建控件
    static QWidget* CreateWidget(bool _isWindow);
    static QPointer<QWidget> ptr_widget;
private:
private:
private slots:
};

#endif // QBASEMASK_H

2…cpp文件

代码如下(示例):

#include "qbasemask.h"

#include <QLabel>
#include <QProgressBar>
#include <QGridLayout>
#include <QPointer>
#include <QDesktopWidget>
#include <QApplication>

QPointer<QWidget> QBaseMask::ptr_widget = Q_NULLPTR;
QBaseMask::QBaseMask(QWidget* parent)
    : QWidget(parent)
{
    
    
}

QBaseMask::~QBaseMask()
{
    
    
}

QWidget* QBaseMask::CreateWidget(bool _isWindow)
{
    
    
    /// @brief 创建控件

    auto proBar = new QProgressBar();
    proBar->setRange(0, 0);
    proBar->setMaximumSize(300, 30);
    proBar->setTextVisible(false);
    //proBar->setStyleSheet("background-color: #19232D");

    auto label = new QLabel();
    label->setAttribute(Qt::WA_TranslucentBackground);
    label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);

    auto gridLayout = new QGridLayout();
    gridLayout->setContentsMargins(0, 0, 0, 0);
    gridLayout->addWidget(proBar, 0, 0);
    gridLayout->addWidget(label, 0, 0);

    auto widget = new QWidget();
    if (_isWindow)
    {
    
    
        widget->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
        widget->setWindowModality(Qt::ApplicationModal);
    }
    widget->setAttribute(Qt::WA_TranslucentBackground);
    //widget->setStyleSheet("background-color: rgb(128, 128, 128, 120)");
    widget->setMinimumSize(300, 30);
    widget->setLayout(gridLayout);

    return widget;
}

void QBaseMask::ShowBaseMaskWindow(QWidget* parent, QString text)
{
    
    
    /// @brief 显示蒙板窗体

    if (!ptr_widget)
    {
    
    
        ptr_widget = CreateWidget(true);
    }

    if (ptr_widget->children().size() == 3)
    {
    
    
        ((QLabel*)ptr_widget->children().at(2))->setText(text.isEmpty() ? text : text);//QBaseConfig::m_mask_hint
    }
    ptr_widget->setParent(parent, ptr_widget->windowFlags());
    ptr_widget->setGeometry(0, 0, ptr_widget->minimumSize().width(), ptr_widget->minimumSize().height());
    if (parent)
    {
    
    
        ptr_widget->move(parent->mapToGlobal(QPoint(0, 0)) + QPoint((parent->width() - ptr_widget->width()) / 2, (parent->height() - ptr_widget->height()) / 2));
    }
    else
    {
    
    
        auto pDesk = QApplication::desktop();
        ptr_widget->move((pDesk->width() - ptr_widget->width()) / 2, (pDesk->height() - ptr_widget->height()) / 2);
    }
    ptr_widget->show();

}

void QBaseMask::CloseBaseMaskWindow()
{
    
    
    /// @brief 关闭蒙板窗体

    if (ptr_widget)
    {
    
    
        ptr_widget->setParent(Q_NULLPTR, ptr_widget->windowFlags());
        ptr_widget->hide();
    }
}

3.调用

void MainWindow::on_bt_FWDI_clicked()
{
    
    
    QBaseMask M_MASK;
    M_MASK.ShowBaseMaskWindow(this, "烧录中");
    qDebug()<<"显示成功";
    m_time.start(8000);
}

利用定时器关闭窗口


 QTimer m_time; 
 connect(&m_time,&QTimer::timeout,[=]    {
    
    
          QBaseMask M_MASK;
          M_MASK.CloseBaseMaskWindow();
          qDebug()<<"关闭显示";
          m_time.stop();    });

4.效果

在这里插入图片描述


总结

善于总结,多进一步。

猜你喜欢

转载自blog.csdn.net/m0_51988927/article/details/130533254