如何使用 PyQT 提示跟随滑块的处理程序?
How to make a tip to follow the handler of slider with PyQT?
一个简单的问题,我在pyqt中寻找这样的效果:
Jquery UI slider how to make a box follow the handler?
但是那些代码是 JQuery,我正试图用 PyQT 实现它
import sys
from PyQt4 import QtGui, QtCore
class Window(QtGui.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.setGeometry(50, 50, 500, 500)
self.setWindowTitle("PyQT example!")
slider = QtGui.QSlider(self)
slider.setOrientation(QtCore.Qt.Horizontal)
slider.move(50, 50)
slider.valueChanged.connect(self.value_changed)
self.show()
def value_changed(self, value):
QtGui.QToolTip.showText(QtGui.QCursor.pos(), str(value), self)
app = QtGui.QApplication(sys.argv)
GUI = Window()
sys.exit(app.exec_())
此代码成功使提示气球跟随光标。
现在是否可以让提示跟随我的滑块处理程序?
你的问题没那么简单。这是我不完美的解决方案:
首先,我们需要跟踪QSlider
,因此您需要将所有slider
替换为self.slider
。
从QSlider
中,我们可以提取出包含句柄的矩形:
style=self.slider.style()
opt=QtGui.QStyleOptionSlider()
self.slider.initStyleOption(opt)
rectHandle=style.subControlRect(QtGui.QStyle.CC_Slider,opt, QtGui.QStyle.SC_SliderHandle,self)
rectHandle
是一个 QRect
,有几种方法可以获取像素位置。
您可以 int
与 QRect.bottom()
、QRect.right()
... 或 QPoint
与 QRect.center()
、QRect.bottomRight
... 所有位置都将相对于父小部件,这里是滑块。
例如,要获取矩形右下角的绝对位置,您可以这样做:
myPoint=rectHandle.bottomRight()+self.slider.pos()
改进:找到工具提示的正确位置
用一些神奇的数字来表达我的最佳尝试:
magicX = 5
magicY = 15
x = rectHandle.right() + rectHandle.width() + self.slider.pos().x() + magicX
y = rectHandle.bottom() + rectHandle.height() + self.slider.pos().y() + magicY
当然,我们需要在自定义位置显示工具提示:
QtGui.QToolTip.showText(QtCore.QPoint(x,y), str(value), self)
注意:
所有计算都在 value_changed
方法中完成。
我喜欢@tmoreau 的想法,但最好将新逻辑放入 QSlider 的子类中:
class TipSlider(QtGui.QSlider):
def __init__(self, *args, tip_offset=QPoint(0, -45)):
super(QtGui.QSlider, self).__init__(*args)
self.tip_offset = tip_offset
self.style = QtGui.QApplication.style()
self.opt = QtGui.QStyleOptionSlider()
self.valueChanged.connect(self.show_tip)
# self.enterEvent = self.show_tip
# self.mouseReleaseEvent = self.show_tip
def show_tip(self, _):
self.initStyleOption(self.opt)
rectHandle = self.style.subControlRect(self.style.CC_Slider, self.opt, self.style.SC_SliderHandle)
pos_local = rectHandle.topLeft() + self.tip_offset
pos_global = self.mapToGlobal(pos_local)
QtGui.QToolTip.showText(pos_global, str(self.value()), self)
一个简单的问题,我在pyqt中寻找这样的效果:
Jquery UI slider how to make a box follow the handler?
但是那些代码是 JQuery,我正试图用 PyQT 实现它
import sys
from PyQt4 import QtGui, QtCore
class Window(QtGui.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.setGeometry(50, 50, 500, 500)
self.setWindowTitle("PyQT example!")
slider = QtGui.QSlider(self)
slider.setOrientation(QtCore.Qt.Horizontal)
slider.move(50, 50)
slider.valueChanged.connect(self.value_changed)
self.show()
def value_changed(self, value):
QtGui.QToolTip.showText(QtGui.QCursor.pos(), str(value), self)
app = QtGui.QApplication(sys.argv)
GUI = Window()
sys.exit(app.exec_())
此代码成功使提示气球跟随光标。 现在是否可以让提示跟随我的滑块处理程序?
你的问题没那么简单。这是我不完美的解决方案:
首先,我们需要跟踪
QSlider
,因此您需要将所有slider
替换为self.slider
。从
QSlider
中,我们可以提取出包含句柄的矩形:style=self.slider.style() opt=QtGui.QStyleOptionSlider() self.slider.initStyleOption(opt) rectHandle=style.subControlRect(QtGui.QStyle.CC_Slider,opt, QtGui.QStyle.SC_SliderHandle,self)
rectHandle
是一个QRect
,有几种方法可以获取像素位置。
您可以int
与QRect.bottom()
、QRect.right()
... 或QPoint
与QRect.center()
、QRect.bottomRight
... 所有位置都将相对于父小部件,这里是滑块。
例如,要获取矩形右下角的绝对位置,您可以这样做:myPoint=rectHandle.bottomRight()+self.slider.pos()
改进:找到工具提示的正确位置
用一些神奇的数字来表达我的最佳尝试:magicX = 5 magicY = 15 x = rectHandle.right() + rectHandle.width() + self.slider.pos().x() + magicX y = rectHandle.bottom() + rectHandle.height() + self.slider.pos().y() + magicY
当然,我们需要在自定义位置显示工具提示:
QtGui.QToolTip.showText(QtCore.QPoint(x,y), str(value), self)
注意:
所有计算都在 value_changed
方法中完成。
我喜欢@tmoreau 的想法,但最好将新逻辑放入 QSlider 的子类中:
class TipSlider(QtGui.QSlider):
def __init__(self, *args, tip_offset=QPoint(0, -45)):
super(QtGui.QSlider, self).__init__(*args)
self.tip_offset = tip_offset
self.style = QtGui.QApplication.style()
self.opt = QtGui.QStyleOptionSlider()
self.valueChanged.connect(self.show_tip)
# self.enterEvent = self.show_tip
# self.mouseReleaseEvent = self.show_tip
def show_tip(self, _):
self.initStyleOption(self.opt)
rectHandle = self.style.subControlRect(self.style.CC_Slider, self.opt, self.style.SC_SliderHandle)
pos_local = rectHandle.topLeft() + self.tip_offset
pos_global = self.mapToGlobal(pos_local)
QtGui.QToolTip.showText(pos_global, str(self.value()), self)