2016-09-30 3 views
0

마우스가 막대의 채워진 부분 위에있는 경우 QProgressBar의 색 및/또는 텍스트 (형식)를 어떻게 변경 할 수 있습니까?채워진 막대 위의 마우스에서 QProgressBar의 색/텍스트 변경

내가 여러 서로 상단에 QProgressBar의 이전에 비해 각각 보여주는 더 많은 콘텐츠 쌓여있다.

나는 마우스를 가져다 대면 마우스에서 여전히 가장 큰 줄을 선택하고 어떤 바 - 특정 텍스트를 보여주고 싶어요. 그러나 막대는 같은 크기이므로 막대의 채워진 영역을 인식하고 싶습니다. 마우스가 세 번째 줄에 걸쳐있는 경우

image

예컨대, 나는 세 번째 줄의 왼쪽 부분을 강조하고, 세 번째 줄에 특정 텍스트를 보여주고 싶어요.

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

내가 스택 ProgressBar를 사용하는 코드입니다 2.1) 당신이 할 수있는 progressbar에 텍스트를 지정하십시오. 은 귀하의 코멘트 문자열과 같습니다.

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

2.2) QProgressBar::text() 함수를 호출하여이 텍스트를 가져올 수 있습니다.

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

참고 : 가능하게하는 것을 잊지 마세요 특정 ProgressBar를 강조 표시하려면

3) 당신은 당신이 채워진 영역의 여백을 계산할 수있는

QWidget::mouseMoveEvent(QMouseEvent *event); 

구현할 수 있습니다 진행률 표시 줄 및 마우스 MultiProgressBar 위젯 추적 :

bar->setMouseTracking(true); 

4) 아래 함수는 마우스의 위치를 ​​매개 변수로 가져옵니다. 그것은 포괄적으로 지적 ProgressBar의 왼쪽에서 영역을 강조하고 당신이 위의 코드를 변경해야 진행 막대 하나를 선택하려면 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); 
     } 

    } 
} 

을 통해 강조 ProgressBar를 할당 콘솔 텍스트로 보여줍니다

if(leftMargin < point.x()) { 

대상 :

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

매력처럼 작동합니다. 나는 특히 detailled 고장과 의견을 좋아한다! – Trevir