2016-07-29 26 views
3

我有一個日記程序,用戶可以在其中創建任務然後添加中斷。每個Task對象具有Break s的QTime start_time,QTime end_timevector。每個Break都有一個QTime start_timeQTime end_time成員,就像Task一樣。我想通過使用自定義QProgressBar來顯示「時間線」來顯示當前任務的進度。它應該是一條綠色的線,用紅色的塊代表中斷,上面的三角形表示當前的進度。這是我的最高質量的圖紙:
enter image description here定製QProgressBar

要求:三角應該平穩地走到最後,每分鐘左右不跳。它也必須根據紅色塊或綠色來改變它的顏色。該行必須調整大小,但不應影響task s或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))); 
} 

回答

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

所提跳轉發生由於整數運算。投射浮動和背部修復此行爲。


另外,不要試圖將啓動和停止時間緊密地連接到圖形上的啓動和停止點。在提供的示例中,我有一箇中間步驟,它可以創建百分比值。

+0

即使這有效,它不符合所有要求。我一定會嘗試使用「時間線」和三角形着色部分,但現在我無法接受這個答案。如果我想出一個使用你的代碼的工作實現,我會在編輯中發佈它並接受你的答案。 – 7Y3RPXK3ETDCNRDD

+0

@ 7Y3RPXK3ETDCNRDD行可調整大小,着色作品,沒有跳躍。哪些要求不符合?相反,給你一個完整的解決方案,所有類都很好地解決了答案,解決了你的問題,讓你進一步進步。我不明白你的觀點。 – maxik

+0

你的代碼解決了一些問題,但不是全部。三角形表示從'task.start_time'到'task.end_time'的進度,也就是說,它應該移動恆定的次數,但是它的「step」(它通過每個進程的像素量)應該用線寬進行縮放。我還寫道,Break包含'start_time','end_time'和一個'Break'的向量。所以紅色塊可以在大小和數量上有所不同。也許我在我的文章中沒有足夠明確。如果是這種情況,那麼我很抱歉混淆。但我仍然無法接受你的回答,因爲問題還沒有完全解決。 – 7Y3RPXK3ETDCNRDD