user7429071
user7429071

Reputation:

How to get value by clicking on the qslider?

So i am using Pyqt for creating GUI program using Python programming language. And i am trying to get the value of Qslider when clicking it, but i don't understand how...

self.slide.mouseDoubleClickEvent= lambda event: self.slideclicked()

This is how i declare the method when the slide is clicked, and this is the method :

    def slideclicked(self):
      print(self.slide.value())

I am hoping to get the value where the mouse clicked, but instead i am just getting current value of the Qslider.

Upvotes: 0

Views: 1277

Answers (1)

eyllanesc
eyllanesc

Reputation: 243897

A possible solution is to overwrite the mouseDoubleClickEvent method and create a signal that sends that information:

class Slider(QSlider):
    pointClicked = pyqtSignal(QPoint)
    def mouseDoubleClickEvent(self, event):
        self.pointClicked.emit(event.pos())

class Widget(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        self.setLayout(QVBoxLayout())
        self.slider = Slider()
        self.layout().addWidget(self.slider)
        self.slider.pointClicked.connect(lambda p: print(p.x(), p.y()))

If you can not overwrite that method you could use eventFilter:

class ClickedHelper(QObject):
    pointClicked = pyqtSignal(QPoint)
    def __init__(self, widget, *args, **kwargs):
        QObject.__init__(self, parent=widget)
        self.obj = widget
        self.obj.installEventFilter(self)

    def eventFilter(self, obj, event):
        if obj == self.obj and event.type() == QEvent.MouseButtonDblClick:
                self.pointClicked.emit(event.pos())
        return QObject.eventFilter(self, obj, event)

class Widget(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        self.setLayout(QVBoxLayout())
        self.slider = QSlider()
        self.layout().addWidget(self.slider)
        helper = ClickedHelper(self.slider)
        helper.pointClicked.connect(lambda p: print(p.x(), p.y()))

Upvotes: 2

Related Questions