隐藏英雄 发表于 2023-1-6 16:38

QT自绘圆心进度的求教

本帖最后由 隐藏英雄 于 2023-1-6 17:47 编辑

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


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

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

这里是绘制的圆形进度条代码进度条控制部分

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();
}


其他参考内容
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();
}

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

搞建筑的用上了
页: [1]
查看完整版本: QT自绘圆心进度的求教