Это можно сделать, создав подкласс QScrollBar
и заменив полосу прокрутки виджета своей собственной, а затем переопределив paintEvent
, чтобы вызвать суперкласс paintEvent
, а затем нарисовать блики сверху.
Важным в переопределении paintEvent
является ограничение и масштабирование чертежа в канавке полосы прокрутки, избегая при этом рисования в верхней части ползунка. Это можно сделать, обрезав прямоугольник с канавкой за вычетом прямоугольника ползунка, рассчитанного по initStyleOption(QStyleOptionSlider *)
.
Этот код написан на Python, но его легко перевести на C ++:
_ANNOTATION_SCROLLBAR_COLOUR = "gold"
document_height = 100
annotations = [(10, 20), (50, 51), (82, 85)]
class AnnotatedScrollBar(QtGui.QScrollBar):
def paintEvent(self, event):
super(AnnotatedScrollBar, self).paintEvent(event)
p = QtGui.QPainter(self)
opt = QtGui.QStyleOptionSlider()
self.initStyleOption(opt)
gr = self.style().subControlRect(QtGui.QStyle.CC_ScrollBar, opt,
QtGui.QStyle.SC_ScrollBarGroove, self)
sr = self.style().subControlRect(QtGui.QStyle.CC_ScrollBar, opt,
QtGui.QStyle.SC_ScrollBarSlider, self)
p.setClipRegion(QtGui.QRegion(gr) - QtGui.QRegion(sr),
QtCore.Qt.IntersectClip)
x, y, w, h = gr.getRect()
c = QtGui.QColor(_ANNOTATION_SCROLLBAR_COLOUR)
p.setBrush(c)
c.setAlphaF(0.3)
p.setPen(QtGui.QPen(c, 2.0))
yscale = 1.0 / document_height
p.drawRects([QtCore.QRect(x, y + h * start * yscale - 0.5,
w, h * (end - start) * yscale + 1)
for start, end in annotations])