自定义QProgressBar

时间:2016-07-29 14:23:53

标签: c++ qt qprogressbar

我有一个日记程序,用户可以在其中创建任务,然后为它们添加中断。每个QTime start_time对象都有QTime end_timevectorBreak Break个。每个QTime start_time都有QTime end_timeTask个成员,就像QProgressBar一样。我想通过使用自定义task来显示当前任务的进度,以显示"时间线"。它应该是由红色块分隔的绿线,红色块表示断点,并在其上方有一个三角形以指示当前进度。这是我最高质量的图纸:
enter image description here

要求:三角形应该每分钟左右平稳地移动到末端而不是跳跃。它还必须根据红色块或绿色来改变颜色。该行必须可调整大小,但不应影响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);

1 个答案:

答案 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)));
    }
}

由于整数算术而发生了上述跳转。转换为浮动和返回可以修复此行为。

另外,请勿尝试将开始和停止时间紧密连接到图表上的开始和停止点。在提供的示例中,我有一个中间步骤,它产生百分比值。