QT 环形等待

CRingWait.h

#pragma once
#ifndef RINGWAIT1_H
#define RINGWAIT1_H
#include <qdialog.h>
#include <QtMath>
#include <QDialog>
#include <QPainter>
#include <QTimerEvent>

class CRingWait : public QDialog
{
Q_OBJECT

private:
int offset;

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

protected:
void paintEvent(QPaintEvent*);
void timerEvent(QTimerEvent*);
};
#endif

 

CRingWait.cpp

#include "CRingWait.h"
#include <QApplication>
CRingWait::CRingWait(QWidget *parent)
: QDialog(parent)
{
offset = 0;
//启动定时器
startTimer(50);
//设置控件大小
setFixedSize(75, 75);
//去掉标题栏 设置置顶 去掉任务栏图标
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint);

//设置窗口背景透明
setAttribute(Qt::WA_TranslucentBackground, true);
}

CRingWait::~CRingWait()
{
}

void CRingWait::timerEvent(QTimerEvent*)
{
++offset;
if (offset > 11)
offset = 0;
update();
}


void CRingWait::paintEvent(QPaintEvent*)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true); // 反锯齿

int width = this->width();
int height = this->height();

//画笔移动到中间
painter.translate(width >> 1, height >> 1);

//计算偏移坐标
int offsetDest = (width - 30) / 2;

painter.setPen(Qt::NoPen);

//计算小圆坐标
for (int i = 0; i < 12; ++i)
{
QPoint point(0, 0);
painter.setBrush(QColor(73, 124, 255, 255 - i * 30));
point.setX(offsetDest*qSin((-offset + i)*M_PI / 6));
point.setY(offsetDest*qCos((-offset + i)*M_PI / 6));
painter.drawEllipse(point.x() - 5, point.y() - 5, 10, 10);
}
}

 

测试:

由于需要处理大量数据,而导致界面卡死,则需要用异步来做处理

CRingWait *p_wait = new CRingWait(this);
p_wait->show();
QFuture<int> fut_syllable = QtConcurrent::run([&]()->int
{
return  (dealfunction;其他操作的函数,比如处理数据等) }); //异步处理

while (!fut_syllable.isFinished())
{
QApplication::processEvents(QEventLoop::AllEvents, 100);//唤醒主界面
}
bool ret = fut_syllable.result();
p_wait->close();
if (p_wait != nullptr)
delete p_wait;

posted @ 2021-08-17 18:33  久龄  阅读(346)  评论(0编辑  收藏  举报