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());  // 设置窗口大小
}
相关推荐
哞哞不熬夜1 分钟前
JavaEE--SpringIoC
java·开发语言·spring boot·spring·java-ee·maven
newxtc5 分钟前
【猿辅导-注册安全分析报告-无验证方式导致安全隐患】
开发语言·selenium·安全·yolo·安全爆破
张人玉8 分钟前
c#WPF基础知识
开发语言·c#·wpf
std787943 分钟前
Rust 与 Go – 比较以及每个如何满足您的需求
开发语言·golang·rust
报错小能手1 小时前
python(入门)map内置函数及import模块导入,as别名
开发语言·人工智能·python
梵得儿SHI1 小时前
Java 反射机制实战:对象属性复制与私有方法调用全解析
java·开发语言·java反射机制的实际应用·对象属性复制·反射调用私有方法·私有字段·类型兼容性和敏感字段忽略
sulikey1 小时前
C++的STL:深入理解 C++ 的 std::initializer_list
开发语言·c++·stl·list·initializerlist·c++标准库
liu****1 小时前
19.map和set的封装
开发语言·数据结构·c++·算法
孤廖1 小时前
C++ 模板再升级:非类型参数、特化技巧(含全特化与偏特化)、分离编译破解
linux·服务器·开发语言·c++·人工智能·后端·深度学习
润 下1 小时前
C语言——回调函数的典型示例(分析详解)
c语言·开发语言·人工智能·经验分享·笔记·程序人生