2016-09-30 86 views
0

如果鼠標位於欄的填充部分上,如何更改QProgressBar的顏色和/或文本(格式)?將鼠標移動到QProgressBar上的顏色/文字

我已經堆疊了多個QProgressBar s在彼此之上,每個顯示比以前更多的內容。

我想突出鼠標懸停在鼠標懸停下的最大的酒吧,並顯示一些酒吧特定的文本。但是,酒吧是相同的大小,因此我想識別酒吧的填充區域。

image

例如,如果鼠標在第三棒,我想強調的部分從左側第三條,並顯示具體到第三欄文本。

這是我使用的堆疊ProgressBars代碼:

class MultiProgressBar : public QWidget 
{ 
    Q_OBJECT 
public: 
    MultiProgressBar(QWidget* parent = Q_NULLPTR) : QWidget(parent), layout(new QStackedLayout(this)) 
    { 
     layout->setMargin(0); 
     layout->setStackingMode(QStackedLayout::StackAll); 
    } 

    void insertBar(QColor const& color) 
    { 
     auto bar = new QProgressBar(); 
     bar->setTextVisible(false); 
     bar->setRange(0, 10000); 

     QPalette palette = this->palette(); 
     palette.setColor(QPalette::Highlight, QColor(color.red(), color.green(), color.blue(), 100)); 
     palette.setColor(QPalette::Base, QColor(color.red(), color.green(), color.blue(), 0)); 
     bar->setPalette(palette); 

     layout->addWidget(bar); 
     progress_bars.push_back(bar); 
    } 

public slots: 
    void setValues(const std::vector<int>& values, const std::vector<std::string>& names) 
    { 
     if (values.size() < progress_bars.size()) 
     { 
      for (auto* widget : progress_bars) 
      { 
       layout->removeWidget(widget); 
      } 
      progress_bars.clear(); 
     } 
     while (progress_bars.size() < values.size()) 
     { 
      insertBar(QColor(0x46, 0xA1, 0xD9, 255)); 
     } 

     for (auto i = 0; i < progress_bars.size(); ++i) 
     { 
      progress_bars[ i ]->setValue(values[ i ]); 
      // progress_bars[ i ]->setFormat(QString::fromStdString(names[ i ])); 
     } 
    } 

private: 
    std::vector< QProgressBar* > progress_bars; 
    QStackedLayout* layout; 
}; 

回答

2

1)要改變填充區域的顏色,您可以設置新的色彩進度的這樣的調色板:

QPalette newPalette = bar.palette(); 
newPalette.setColor(QPalette::Highlight, "red"); // setting color to red 
bar.setPalette(newPalette); 

2.1)將文字分配給進度條,你可以用void setFormat(const QString &format);函數就像在你的註釋字符串中一樣

progress_bars[ i ]->setFormat(QString::fromStdString(names[ i ])); 

2.2)通過調用QProgressBar::text()函數獲取此文本;

3)如果你想突顯特定progressbars你可以重新實現

QWidget::mouseMoveEvent(QMouseEvent *event); 

中,你可以計算填充區域的邊緣:

void mouseMoveEvent(QMouseEvent *e){ 
    highlightProgressBars(e->pos()); // passing position of mouse cursor 
} 

注意:不要忘記啓用鼠標跟蹤進度條和您的MultiProgressBar小工具:

bar->setMouseTracking(true); 

4)下面的函數在參數中獲取鼠標的位置。它強調由左尖進度包括性區域,並顯示在如果你想只突出一個進度條,你應該在代碼改變上述這種通過format財產

void highlightProgressBars(QPoint point){ 
    int widthOfBar = ((QProgressBar*)progress_bars.at(0))->width(); 
    int valueForPoint = 10000/widthOfBar; // value of progressbar for width==1 
    for (auto pb = this->progress_bars.begin(); pb != this->progress_bars.end(); ++pb) { // iterating vector to paint progressbars 
     int leftMargin = 0; // "left margin" of current progressbar is in fact right margin of filled area of previous progressbar 
     if(pb != this->progress_bars.begin()){ // except first progressbar in vector which doesn't have previous progressbar 
      --pb; // get previous progressbar 
      leftMargin = ((QProgressBar*)*pb)->value()/valueForPoint; // get width of filled area 
      ++pb; // return to current progressbar 
     } 

     if(leftMargin < point.x()) { // if position of cursor is to the right of "left margin" of current progressbar we highlight it 
      QPalette newPal = ((QProgressBar*)*pb)->palette(); //getting palette 
      newPal.setColor(QPalette::Highlight,"red"); // and setting color of filled area 
      ((QProgressBar*)*pb)->setPalette(newPal); // finally setting palette to widget 
      qDebug() << ((QProgressBar*)*pb)->text(); // show text of highlighted progressbar in console 
     } 
     else{ // if not we highlight it another way 
      QPalette newPal = ((QProgressBar*)*pb)->palette(); 
      newPal.setColor(QPalette::Highlight,"lightblue"); 
      ((QProgressBar*)*pb)->setPalette(newPal); 
     } 

    } 
} 

分配給高亮progressbars控制檯文本:

if(leftMargin < point.x()) { 

到:

int rightMargin = ((QProgressBar*)*pb)->value()/valueForPoint; 
if(leftMargin < point.x() && point.x() < rightMargin) { 
+0

工程就像一個魅力。我特別喜歡詳細的故障和評論! – Trevir