Qt 突出显示滚动条

Qt 突出显示滚动条,qt,qt4,Qt,Qt4,我想突出显示滚动条的某些部分,比如谷歌chrome中的突出显示搜索 看 有可能使用Qt来实现这一点吗 谢谢您可以基于QScrollBar创建自己的滚动条类,并重新实现虚拟void paintEvent(QPaintEvent*)方法。如果要查看高亮显示下的实际滚动条,请不要忘记调用原始的paintEvent句柄 应该是这样的: void SrollBar::paintEvent(QPaintEvent * event) { QScrollBar::paintEvent(event); /

我想突出显示滚动条的某些部分,比如谷歌chrome中的突出显示搜索

有可能使用Qt来实现这一点吗


谢谢

您可以基于
QScrollBar
创建自己的
滚动条
类,并重新实现
虚拟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 ...
}

您可以通过子类化
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])