當后臺需要大量處理資料,前臺要顯示等待界面時,這個就很有用,
完全擋住界面上的內容,后面有半透明遮擋層,不能點擊操作后面界面,用戶不能自己取消等待界面,防止誤操作,
并且視窗大小變化時,自動適應界面變化,不阻塞視窗移動和放大縮小,非模態的,
不是C#里面那種視窗截圖的爛效果,真遮罩,真背景半透明,
需要配合多執行緒使用,前臺顯示等待界面,后臺執行緒處理資料,當處理完畢,通過信號槽發訊息通知前臺取消等待狀態,
補充:
有朋友問這個東西的原始碼怎么做出來的,下面貼出來:
1、新建一個Qt widget,類名為LoadingForm,帶有ui界面的,在界面上放一個QLabel,調整到影片尺寸大小即可,用網格布局,居中顯示,

2、LoadingForm的代碼如下:
頭檔案LoadingForm.h:
#ifndef LOADINGFORM_H
#define LOADINGFORM_H
#include <QWidget>
namespace Ui {
class LoadingForm;
}
class LoadingForm : public QWidget
{
Q_OBJECT
public:
explicit LoadingForm(QWidget *parent = nullptr);
~LoadingForm();
private:
Ui::LoadingForm *ui;
};
#endif // LOADINGFORM_H
實作檔案LoadingForm.cpp:
#include "loadingform.h"
#include "ui_loadingform.h"
#include <QMovie>
LoadingForm::LoadingForm(QWidget *parent) :
QWidget(parent),
ui(new Ui::LoadingForm)
{
ui->setupUi(this);
this->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
QMovie *movie;
movie = new QMovie(":/icon/res/loading.gif");
ui->label->setMovie(movie);
movie->start();
ui->label->setStyleSheet("background-color: transparent;");
}
LoadingForm::~LoadingForm()
{
delete ui;
}
3、在MainWindow上添加顯示代碼:
頭檔案內:
private:
QWidget* m_pMaskLayer = nullptr;
protected:
virtual void resizeEvent(QResizeEvent *event) override;
實作檔案:
MainWindow6::MainWindow6(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow6)
{
ui->setupUi(this);
m_pMaskLayer = new LoadingForm(this);
m_pMaskLayer->setFixedSize(this->size());//設定視窗大小
m_pMaskLayer->setVisible(false);//初始狀態下隱藏,待需要顯示時使用
this->stackUnder(m_pMaskLayer);//其中pWrapper為當前視窗的QWidget
}
void MainWindow6::resizeEvent(QResizeEvent *event)
{
if(event){}//消除警告提示
if(m_pMaskLayer != nullptr)
{
m_pMaskLayer->setAutoFillBackground(true); //這個很重要,否則不會顯示遮罩層
QPalette pal = m_pMaskLayer->palette();
pal.setColor(QPalette::Background, QColor(0x00,0x00,0x00,0x20));
m_pMaskLayer->setPalette(pal);
m_pMaskLayer->setFixedSize(this->size());
}
}
//顯示
void MainWindow6::showLoadingForm()
{
if(m_pMaskLayer != nullptr)
{
m_pMaskLayer->setVisible(true);
}
}
//隱藏
void MainWindow6::hideLoadingForm()
{
if(m_pMaskLayer != nullptr)
{
m_pMaskLayer->setVisible(false);
}
}
配合多執行緒,使用的時候直接showLoadingForm()和hideLoadingForm(),也可以自己添加全域信號槽實作,
注意:不能跟耗時操作混在UI執行緒,不然卡到沒法用的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198809.html
標籤:其他
上一篇:Godot Engine:使用影片回呼生成以及釋放沖擊波
下一篇:約瑟夫環
