本帖最后由 隐藏英雄 于 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()函数
|