• 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;

    只想当咸鱼的程序员
  • 相关阅读:
    迭代器和生成器
    装饰器
    函数进阶二
    函数进阶
    函数的初识
    python基础七
    python基础六
    python基础五
    python基础四
    python2与python3的区别
  • 原文地址:https://www.cnblogs.com/Pond-ZZC/p/15153653.html
Copyright © 2020-2023  润新知