Настройка цвета канавки PyQt4 QSlider - PullRequest
0 голосов
/ 29 января 2019

В настоящее время я делаю графический интерфейс с использованием PyQt4.Мой вопрос: как мне настроить разные цвета фона для QSlider::groove:horizontal в определенном диапазоне значений ползунка индекса?Вот минимальный рабочий пример:

from PyQt4 import QtCore, QtGui
#%%
data_range = [0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0]
color_range =['black','black','black','black','white','white',\
              'white','black','black','white','white','black']

class MyWidget(QtGui.QWidget):
    def __init__(self):
        super(MyWidget, self).__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(600,300,500,100)

        # Definition of the slider
        self.slider = QtGui.QSlider(minimum=0,\
        maximum= len(data_range)-1,\ 
        orientation=QtCore.Qt.Horizontal,\
        tickInterval=1)

        # Trying to customize it
        self.slider.setStyleSheet(\
        "QSlider::groove:horizontal {\
        border: 1px solid #999999;\
        height: 8px; \
        background: white;\
        margin: -4px 0;\
        }QSlider::handle:horizontal {\
        background-color: red;\
        border: 1px solid #5c5c5c;\
        border-radius: 0px;\
        border-color: black;\
        height: 8px;\
        width: 6px;\
        margin: -8px 2; \
        }")
       grid = QtGui.QGridLayout(self)
       hbox = QtGui.QHBoxLayout()
       hbox.addWidget(self.slider)
       grid.addLayout(hbox, 3, 0, 1, 3)


def main():
    import sys
    app = QtGui.QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

В этом случае канавка Qslider должна быть черной от 0: 4, белой от 4: 7, черной от 7: 9 и т. Д.

Я пытался использовать self.slider.setStyleSheet(), следуя документации qt , но напрасно ...

Любая помощь или альтернативные идеи по украшению слайдера были бы очень благодарны.

1 Ответ

0 голосов
/ 06 февраля 2019

Я нашел ответ на мою проблему.Используя следующую функцию:

def get_groove_color(color_range):

    groove_color_range = 'stop:0 ' + color_range[0]
    current_color = color_range[0]
    for i in range(0,len(color_range),1):
        if color_range[i] == current_color :
            continue
        else:
            current_color = color_range[i]
            groove_color_range += ', stop:'+ str((2*i-1)/2/len(color_range)) + ' ' + color_range[i-1] + ', stop:'+ str((2*i)/2/len(color_range)) + ' ' + color_range[i] 

    groove_color_range += ', stop:1 ' + color_range[-1]        
    return groove_color_range

Я получаю желаемый диапазон цветов для интерполяции qlineargradient:

groove_color = get_groove_color(color_range)

И, наконец, просто нужно изменить цвет канавки в self.slider.setStyleSheet()поле background-color:

self.slider.setStyleSheet(\
    "QSlider::groove:horizontal {\
    border: 1px solid #999999;\
    height: 8px; \
    background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, "+self.groove_color+");\
    margin: -4px 0;\
    }QSlider::handle:horizontal {\
    background-color: red;\
    border: 1px solid #5c5c5c;\
    border-radius: 0px;\
    border-color: black;\
    height: 8px;\
    width: 6px;\
    margin: -8px 2; \
    }")
...