Qt QWidget Loading界面并覆盖在其他控件上面

目录

一、效果图

界面中有一个Label,一个Button

点击Buttion,显示Loading的界面,并覆盖到Label和Button上面

二、Loading

loadingwidget.h

cpp 复制代码
#ifndef LOADINGWIDGET_H
#define LOADINGWIDGET_H

#include <QTimer>
#include <QWidget>

class LoadingWidget : public QWidget
{
Q_OBJECT
public:
explicit LoadingWidget(QWidget *parent = nullptr);

signals:

// QWidget interface
protected:
void paintEvent(QPaintEvent *event) override;
void timerEvent(QTimerEvent *event) override;
void showEvent(QShowEvent *event) override;
void hideEvent(QHideEvent *event) override;

private slots:
void startUpdateTimer();
void stopUpdateTimer();


private:
QTimer *timer;
int m_timerID = -1;
const int UPDATE_INTERVAL_TIME = 60; //ms

int m_angle = 0;  // 旋转的角度

};

#endif // LOADINGWIDGET_H

loadingwidget.cpp

cpp 复制代码
#include "loadingwidget.h"

#include <QPainter>
#include <QDebug>

LoadingWidget::LoadingWidget(QWidget *parent)
    : QWidget{parent}
{
    setAttribute(Qt::WA_StyledBackground);
    setStyleSheet("QWidget{background-color: rgba(0, 0, 0, 127);}");
}


void LoadingWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 定义旋转中心和旋转角度
    painter.translate(width() / 2, height() / 2);
    painter.rotate(m_angle);

    // 设置笔的宽度和颜色,并画圆
    int radius = width() / 20;    // 圆的半径
    QPen pen;
    pen.setWidth(radius / 5);
    pen.setColor(QColor(0, 0, 0, 127));
    painter.setPen(pen);
    painter.drawEllipse(-radius, -radius, 2*radius, 2*radius);

    // 在圆上画一个定义好颜色的扇形外边框
    pen.setColor(QColor(0, 160, 230));
    painter.setPen(pen);
    painter.drawArc(-radius, -radius, 2*radius, 2*radius, 0 * 16, 90 * 16);

}


void LoadingWidget::timerEvent(QTimerEvent *event)
{
    m_angle = (m_angle + 10) % 360; // 每次旋转10度
    update();
    qDebug() << "update " << m_angle;
}


void LoadingWidget::showEvent(QShowEvent *event)
{
    QMetaObject::invokeMethod(this, "startUpdateTimer");
}

void LoadingWidget::hideEvent(QHideEvent *event)
{
    QMetaObject::invokeMethod(this, "stopUpdateTimer");
}

void LoadingWidget::startUpdateTimer()
{
    if(m_timerID == -1){
        // 每 UPDATE_INTERVAL_TIME 毫秒触发定时器,执行timerEvent,更新UI
        m_timerID = startTimer(UPDATE_INTERVAL_TIME);
    }
}

void LoadingWidget::stopUpdateTimer()
{
    if (m_timerID != -1) {
        killTimer(m_timerID);
        m_timerID = -1;
    }
}

三、使用

mainwindow.h

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "loadingwidget.h"

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;

    LoadingWidget* loadingWidget;

    // QWidget interface
protected:
    void resizeEvent(QResizeEvent *event) override;

};
#endif // MAINWINDOW_H

mainwindow.cpp

cpp 复制代码
#include "loadingwidget.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    loadingWidget = new LoadingWidget(this);
    loadingWidget->setFixedSize(width(), height());  // 设置窗口大小
    loadingWidget->hide();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    loadingWidget->show();

    // 点击按钮显示Loading界面后,10秒结束显示
    QTimer::singleShot(10000, [this](){
        loadingWidget->hide();
    });
}

// Loading界面的大小随父窗口的大小而改变
void MainWindow::resizeEvent(QResizeEvent *event)
{
    loadingWidget->setFixedSize(width(), height());  // 设置窗口大小
}
相关推荐
艾莉丝努力练剑9 分钟前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_0224 分钟前
【Java基础面试题】Java基础概念
java·开发语言
杜子不疼.2 小时前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习
落霞的思绪2 小时前
Java设计模式详细解读
java·开发语言·设计模式
阿巴~阿巴~2 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list
java1234_小锋3 小时前
一周学会Matplotlib3 Python 数据可视化-绘制自相关图
开发语言·python·信息可视化·matplotlib·matplotlib3
甄超锋3 小时前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven
凢en4 小时前
Perl——qw()函数
开发语言·perl
郝学胜-神的一滴4 小时前
基于C++的词法分析器:使用正则表达式的实现
开发语言·c++·程序人生·正则表达式·stl
前端市界4 小时前
前端视角: PyQt6+Vue3 跨界开发实战
前端·qt·pyqt