gpt4 book ai didi

c++ - 自定义 QProgressBar

转载 作者:太空狗 更新时间:2023-10-29 21:37:00 25 4
gpt4 key购买 nike

我有一个日记程序,用户可以在其中创建任务,然后为其添加休息时间。每个 Task 对象都有一个 QTime start_timeQTime end_timeBreakvector .每个 Break 都有一个 QTime start_timeQTime end_time 成员,就像一个 Task 一样。我想通过使用自定义 QProgressBar 显示“时间线”来可视化当前任务的进度。它应该是一条由红色 block 分隔的绿线,表示中断,上面的三角形表示当前进度。这是我的最高画质:
enter image description here

要求:三角形应该每隔一分钟左右平稳地向终点移动,而不是跳动。它还必须根据它是红色 block 还是绿色 block 来改变颜色。该行必须可以调整大小,但这不应影响 taskbreak 的时间变量。用户不能添加多个休息时间。
现在我的问题是,这可能吗?如果是,那又如何?
我试图不间断地完成一项任务,只画一条绿线和一个没有红色 block 的三角形,但我立即遇到了调整大小的问题。如果线宽增加,那么三角形的每分钟“步长”也应该增加。我尝试实现它,但没有取得多大成功。
这是代码:

//class CustomProgressBar: public QProgressBar
void CustomProgressBar::paintEvent(QPaintEvent* event)
{
setMaximum(this->width());
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);

QPoint start_point;
start_point.setX(0);
start_point.setY(13);
QPoint end_point;
end_point.setY(13);
end_point.setX(this->width()); //has to be resizable

//"TimeLine"
painter.setPen(QPen(Qt::green, 2, Qt::SolidLine, Qt::RoundCap));
painter.drawLine(start_point, end_point);

//Triangle
int progress = this->value();
QPoint triangle_start_point;
triangle_start_point.setX(this->value() + this->width() / 15 + 1);
triangle_start_point.setY(0);
QPoint triangle_bot_point;
triangle_bot_point.setX(this->value() + this->width() / 15 + 6);
triangle_bot_point.setY(10);
QPoint triangle_top_point;
triangle_top_point.setX(this->value() + this->width() / 15 + 11);
triangle_top_point.setY(0);
QPainterPath path;
path.moveTo(triangle_start_point);
path.lineTo(triangle_bot_point);
path.lineTo(triangle_top_point);
path.lineTo(triangle_start_point);
painter.setPen (Qt :: NoPen);
painter.fillPath(path, QBrush(QColor (Qt::green)));
}

最佳答案

我调整了你的绘画事件并扩展了一些简单的格式来显示休息和运行,看看它。

QList<QPoint> CustomProgessBar::breaks()
{
QList<QPoint> times;
times.append(QPoint(0, 20));
times.append(QPoint(20, 50));
times.append(QPoint(50, 80));
times.append(QPoint(80, 100));
return times;
}

void CustomProgessBar::paintEvent(QPaintEvent *e)
{
Q_UNUSED(e)
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);

QPoint start_point;
start_point.setX(0);
start_point.setY(13);
QPoint end_point;
end_point.setY(13);
end_point.setX(this->width());

//"TimeLine"
for (int i = 0; i < breaks().length(); ++i) {
start_point.setX((int)((float)this->width() / 100 * breaks().at(i).x()));
end_point.setX((int)((float)this->width() / 100 * breaks().at(i).y()));
if (i % 2 == 0) {
painter.setPen(QPen(Qt::red, 2, Qt::SolidLine, Qt::RoundCap));
} else {
painter.setPen(QPen(Qt::green, 2, Qt::SolidLine, Qt::RoundCap));
}
painter.drawLine(start_point, end_point);
}

//Triangle
QPoint triangle_start_point;
triangle_start_point.setX((int)((float)this->width() / this->maximum() * this->value()) - 5);
triangle_start_point.setY(0);
QPoint triangle_bot_point;
triangle_bot_point.setX((int)((float)this->width() / this->maximum() * this->value()) + 0);
triangle_bot_point.setY(10);
QPoint triangle_top_point;
triangle_top_point.setX((int)((float)this->width() / this->maximum() * this->value()) + 5);
triangle_top_point.setY(0);
QPainterPath path;
path.moveTo(triangle_start_point);
path.lineTo(triangle_bot_point);
path.lineTo(triangle_top_point);
path.lineTo(triangle_start_point);
painter.setPen (Qt :: NoPen);

for (int i = 0; i < breaks().length(); ++i) {
int x = (int)((float)triangle_bot_point.x() * 100 / this->width());
if (x >= breaks().at(i).x() && x <= breaks().at(i).y() && i % 2 == 0)
painter.fillPath(path, QBrush(QColor (Qt::red)));
if (x >= breaks().at(i).x() && x <= breaks().at(i).y() && i % 2 == 1)
painter.fillPath(path, QBrush(QColor (Qt::green)));
}
}

提到的跳跃是由于整数运算而发生的。转换为 float 和返回修复了此行为。


也不要尝试将开始和停止时间与图表上的开始和停止点紧密联系起来。在提供的示例中,我有一个生成百分比值的中间步骤。

关于c++ - 自定义 QProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38661229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com