PyQt4——自制带提示的滑动槽

在写那个引擎配置器的过程中,发现 PyQt4 的滑动槽并没有那么好用

对比下 Windows 的滑动槽,我们可以很容易的发现一个问题

比如调节音量的音量柄,我们在拖动的时候,它会在旁边伴随着一个气泡提示

可是我们在 PyQt4 的滑动柄上并没有发现这个功能,拖着完全就是瞎拖,完全没有一个量的概念

通过谷歌搜索了国内外的各大论坛,好像都没有一个解决方案,自己弄弄了半天也弄不出来

于是上 StackOverflow 发了个贴问了问:

http://stackoverflow.com/questions/31653647/how-to-make-a-tip-to-follow-the-handler-of-slider-with-pyqt

还真的是有大牛出来帮解决了,好评!国外的学术气氛就是不一样。

好了,下面说一下总体的方法。

一开始,我只是参考了一下网上的一些解决方案,弄来弄去,发现顶多只能做到气泡跟随鼠标来移动

也就是这个做法

1
QtGui.QToolTip.showText(QtGui.QCursor.pos(), str(value), self)

接着就完全不知道怎么做了,顶多只能获取到鼠标指针的坐标,无法获取到滑动柄的下标

查遍了 PyQt 官方文档的方法,还是没有结果

看了 StackOverflow 人家给的回答之后,才知道,这个必须把 QSlider 的封装给拆开才能弄

拆开封装获取到里面的长方形滑块

1
2
3
4
style=self.slider.style()
opt=QtGui.QStyleOptionSlider()
self.slider.initStyleOption(opt)
rectHandle=style.subControlRect(QtGui.QStyle.CC_Slider,opt, QtGui.QStyle.SC_SliderHandle,self)

这个长方形滑块是属于 QRect 类的一个对象

可以通过以下方法获取到这个滑块的右下角位置的绝对坐标

1
myPoint=rectHandle.bottomRight()+self.slider.pos()

也可以分别获取其中的 x,y 坐标,这个牛人还总结出了一个 magic number。。。这个其实可以看成是个固定偏移吧

1
2
3
4
5
magicX=5
magicY=15

x=rectHandle.right()+rectHandle.width()+self.slider.pos().x()+magicX
y=rectHandle.bottom()+rectHandle.height()+self.slider.pos().y()+magicY

最后,再把获得的 x, y 坐标给重新构成个 QPoint,并根据这个坐标把气泡显示出来

1
QtGui.QToolTip.showText(QtCore.QPoint(x,y), str(value), self)