提示:本文为学习内容,若有错误,请联系作者
前言
只管努力,其他的交给时间。
一、蒙层的作用
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.效果
总结
善于总结,多进一步。