我有一个日记程序,用户可以在其中创建任务,然后为它们添加中断。每个QTime start_time
对象都有QTime end_time
,vector
和Break
Break
个。每个QTime start_time
都有QTime end_time
和Task
个成员,就像QProgressBar
一样。我想通过使用自定义task
来显示当前任务的进度,以显示"时间线"。它应该是由红色块分隔的绿线,红色块表示断点,并在其上方有一个三角形以指示当前进度。这是我最高质量的图纸:
要求:三角形应该每分钟左右平稳地移动到末端而不是跳跃。它还必须根据红色块或绿色来改变颜色。该行必须可调整大小,但不应影响break
或//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)));
}
时间变量。用户无法在随后的时间内添加多个休息时间
现在我的问题是,这甚至可能吗?如果是,那怎么样?
我试图做一个没有休息的任务来画一条绿线和一个没有红色块的三角形,但是我立即面临着调整大小的问题。如果线宽增加,那么三角形" s" step"按分钟也应该增加。我试图实现这一点,但没有取得多大成功
这是代码:
String assetPath = "file:///android_asset/flags/FR.jpg";
Glide.with(getContext())
.load(Uri.parse(assetPath))
.placeholder(missingFlagDrawable)
.centerCrop()
.crossFade()
.into(flag);
答案 0 :(得分:2)
我调整了你的绘画事件并扩展了一些简单的格式来显示中断和运行,看看它。
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)));
}
}
由于整数算术而发生了上述跳转。转换为浮动和返回可以修复此行为。
另外,请勿尝试将开始和停止时间紧密连接到图表上的开始和停止点。在提供的示例中,我有一个中间步骤,它产生百分比值。