吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 673|回复: 2
收起左侧

[求助] QT自绘圆心进度的求教

[复制链接]
隐藏英雄 发表于 2023-1-6 16:38
本帖最后由 隐藏英雄 于 2023-1-6 17:47 编辑

我的目的就是把现在用定时器控制的圆形进度条,修改为 使用qint64 bytesRead     qint64 totalBytes  2个参数控制下面的代码是自绘圆形进度条的进度更新  部分,  
//信号的处理//现在到了 传过来2个参数用于设置进度条最大值,和当前值的2个参数,怎么控制下面的进度?
qint64 bytesRead     
qint64 totalBytes
信号来源,原本用于控制第二段代码的长条进度条,现在想用这2个信号控制第三段代码的圆形进度条
[C++] 纯文本查看 复制代码
    connect(reply,SIGNAL(downloadProgress(qint64,qint64)),
            this,SLOT(progress(qint64,qint64)));


[C++] 纯文本查看 复制代码
这里是2个参数正常控制长条进度条时的代码
void MainWindow::on_downloadProgress(qint64 bytesRead,qint64 totalBytes)
{
    //设置进度条的值// 这里是原来长条进度条的更新进度代码内容

    ui->progressBar->setMaximum(totalBytes);
    ui->progressBar->setValue(bytesRead);
}


这里是绘制的圆形进度条代码进度条控制部分
[Asm] 纯文本查看 复制代码
status = 0;//初始化状态为0
void ProgressButton::paintEvent(QPaintEvent *)//paintEvent函数是QWidget类中的虚函数,用于ui的绘制,会在多种情况下被其他函数自动调用
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    if (1 == status)
    {
        //绘制当前进度
        drawProgress(&painter);
    }
    else
    {
        //绘制按钮背景
        drawBg(&painter);
    }
}
void ProgressButton::progress(qint64 bytesRead,qint64 totalBytes)//qint64 bytesRead,qint64 totalBytes 这2个参数是我从本文第一个代码传过来的 传到这里是不是传错地方了?应该传到上面void ProgressButton::paintEvent(QPaintEvent *) 这里?
{                                                                                                           //传到这里是想着这里在这里对圆形进度条进行当前值的更新
    //信号的处理//
    if (0 == status)
    {
        tempWidth -= 5;
        if (tempWidth < this->height() / 2)
        {
            tempWidth = this->height() / 2;
            status = 1;
        }
    }
    else if (1 == status)
    {
        value += 1.0;//每次增加1度
        if (value >= 360) //小于等于360度
        {
            value = 360.0;
            status = 2;
        }
    }
    else if (2 == status)
    {
        tempWidth += 5;
        if (tempWidth > this->width())
        {
            tempWidth = this->width();
            timer->stop();//定时器停止工作
            bgColor = QColor(155, 204, 81);
        }
    }
    this->update();
}



其他参考内容
[C++] 纯文本查看 复制代码
void ProgressButton::drawProgress(QPainter *painter)
{
    painter->save();

    int width = this->width();
    int height = this->height();
    int side = qMin(width, height);
    int radius = 99 - borderWidth;

    //绘制外圆
    QPen pen;
    pen.setWidth(borderWidth);
    pen.setColor(borderColor);
    painter->setPen(borderWidth > 0 ? pen : Qt::NoPen);
    painter->setBrush(bgColor);

    //平移坐标轴中心,等比例缩放
    QRect rectCircle(-radius, -radius, radius * 2, radius * 2);
    painter->translate(width / 2, height / 2);
    painter->scale(side / 200.0, side / 200.0);
    painter->drawEllipse(rectCircle);

    //绘制圆弧进度
    pen.setWidth(lineWidth);
    pen.setColor(lineColor);
    painter->setPen(pen);

    int offset = radius - lineWidth - 5;//白圈距圈边的距离
    QRectF rectArc(-offset, -offset, offset * 2, offset * 2);
    int startAngle = offset * 16;//修改后 感觉没啥用
    int spanAngle = -value * 16;//设置了 白圈转速
    painter->drawArc(rectArc, startAngle, spanAngle);

    //绘制进度文字
    QFont font;
    font.setPixelSize(offset - 5);//设置了圆圈内%数字的大小
    painter->setFont(font);
    QString strValue = QString("%1%").arg((int)value  * 100 / 360);//从1%开始走到100%,走360度,改成10/360的话就是从1%-10%走360度
    painter->drawText(rectCircle, Qt::AlignCenter, strValue);

    painter->restore();
}


[C++] 纯文本查看 复制代码
  value = 0;//初始化当前值为0
    status = 0;//初始化状态为0
    timer = new QTimer(this);//创建定时器
    timer->setInterval(10);//控制进度条速度
    connect(timer, SIGNAL(timeout()), SLOT(progress()));//连接无参的定时器timer与progress,将信号timeout传递给progress,运行progress()函数



发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

13457627838 发表于 2023-1-6 19:05
这个有点难
mine4ever001 发表于 2023-1-6 19:48
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表