Выделите полосу прокрутки - PullRequest
2 голосов
/ 22 июня 2011

Я хочу выделить некоторые части полосы прокрутки, такие как поиск выделения в Google Chrome.

См. http://dl.dropbox.com/u/17404614/scrollbar.JPG

Возможно ли использовать Qt для достижения этой цели?1007 * Спасибо

Ответы [ 2 ]

4 голосов
/ 16 ноября 2012

Это можно сделать, создав подкласс 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])
3 голосов
/ 22 июня 2011

Вы можете создать свой собственный класс ScrollBar на основе QScrollBar и повторно реализовать метод virtual void paintEvent ( QPaintEvent * ).Не забудьте назвать оригинальный дескриптор paintEvent, если вы хотите увидеть фактическую полосу прокрутки под выделением ...

Должно выглядеть так:

void SrollBar::paintEvent(QPaintEvent * event)
{
    QScrollBar::paintEvent(event); //Qt scroll bar is rendered now
    QPainter p(this);

    //here do what ever you want like painting rectangles with alpha = 0.5 ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...