我想要突出显示滚动条的某些部分,例如在Google Chrome中突出显示搜索。
请参阅http://dl.dropbox.com/u/17404614/scrollbar.JPG
是否可以使用Qt实现这一目标?
由于
答案 0 :(得分:4)
您可以通过继承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])
答案 1 :(得分:3)
您可以根据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 ...
}