如何使用 PyQT 提示跟随滑块的处理程序?

Posted

技术标签:

【中文标题】如何使用 PyQT 提示跟随滑块的处理程序?【英文标题】:How to make a tip to follow the handler of slider with PyQT? 【发布时间】:2015-07-27 12:53:37 【问题描述】:

一个简单的问题,我在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_())

此代码成功地使提示气球跟随光标。 现在是否可以让提示跟随我的滑块处理程序?

【问题讨论】:

【参考方案1】:

我喜欢@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)

【讨论】:

【参考方案2】:

你的问题没那么简单。这是我不完美的解决方案:

    首先,我们需要跟踪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,并且有几种方法可以获取像素位置。 您可以使用intQRect.bottom()QRect.right()... 或QPointQRect.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方法中完成的。

【讨论】:

以上是关于如何使用 PyQT 提示跟随滑块的处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使范围滑块的左侧与滑块右侧的颜色不同?

如何使 CAGradientLayer 遵循 CGPath

如何使 CAGradientLayer 中的渐变跟随滑块上的某个值?

如何使用样式表更改 QSlider 句柄宽度

如何限制 jQuery UI 滑块的范围?

如何更新滑块的最大值?