2014-12-17 11 views
1

Qt 5.3을 사용 중이며 QSlider의 스타일을 지정하려고합니다. 그러나 스타일 시트를 적용하면 눈금이 사라집니다. 아무도 눈금에 영향을주지 않고 스타일을 유지하는 방법을 알고 있습니까?스타일이 지정된 QSlider에서 눈금이 사라짐

QSlider::groove:horizontal 
{ 
    border: 1px inset #B0B0B0; 
    background-color: #EAEAEA; 
    height: 2px; 
} 

QSlider::Handle 
{ 
    border: 1px solid black; 
    background: #B0B0B0;       
    background-image: url(:/metal_background_small);  
    width: 12px; 
    margin: -8px 0; 
} 

QSlider::Handle:Hover 
{ 
    border: 1px solid black; 
    background: #707070;       
    background-image: url(:/metal_background_small);  
} 

QSlider::sub-page 
{ 
/* margin: 7px 1px 7px 0px;*/ 
    height: 2px; 
    background: #05bcfe; 
} 
+1

스타일 시트로 스타일을 지정하기 시작 했으므로 모든 것을 정의해야합니다. 그렇지 않으면 생략됩니다. 이게 의도 된 것인지 알 수 없어요, 저에게 버그 같아 보입니다. – Bowdzone

답변

1

Qt는 스타일 시트와 눈금이 함께 잘 재생되지 않습니다 : 여기에

스타일 시트입니다. 가장 간단한 해결책은 QSlider을 서브 클래스 화하고 paint_event를 다시 구현하는 것입니다.

virtual void paintEvent(QPaintEvent *ev) 
{ 

    QStylePainter p(this); 
    QStyleOptionSlider opt; 
    initStyleOption(&opt); 

    QRect handle = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); 

    // draw tick marks 
    // do this manually because they are very badly behaved with style sheets 
    int interval = tickInterval(); 
    if (interval == 0) 
    { 
     interval = pageStep(); 
    } 

    if (tickPosition() != NoTicks) 
    { 
     for (int i = minimum(); i <= maximum(); i += interval) 
     { 
      int x = round((double)((double)((double)(i - this->minimum())/(double)(this->maximum() - this->minimum())) * (double)(this->width() - handle.width()) + (double)(handle.width()/2.0))) - 1; 
      int h = 4; 
      p.setPen(QColor("#a5a294")); 
      if (tickPosition() == TicksBothSides || tickPosition() == TicksAbove) 
      { 
       int y = this->rect().top(); 
       p.drawLine(x, y, x, y + h); 
      } 
      if (tickPosition() == TicksBothSides || tickPosition() == TicksBelow) 
      { 
       int y = this->rect().bottom(); 
       p.drawLine(x, y, x, y - h); 
      } 

     } 
    } 

    // draw the slider (this is basically copy/pasted from QSlider::paintEvent) 
    opt.subControls = QStyle::SC_SliderGroove; 
    p.drawComplexControl(QStyle::CC_Slider, opt); 

    // draw the slider handle 
    opt.subControls = QStyle::SC_SliderHandle; 
    p.drawComplexControl(QStyle::CC_Slider, opt); 
}