【问题标题】:Make QSpinBox.valueChanged() only respond to Mouse Wheel使 QSpinBox.valueChanged() 只响应鼠标滚轮
【发布时间】:2015-12-04 01:29:28
【问题描述】:

我将 QSpinBox 的 Signal valueChanged 连接到 QWidget 的函数,例如:

class MyWidget(QtGui.QWidget):
    def __init__(self, *args):
        QtGui.QWidget.__init__(self, *args)
        #just an example
        mySpinBox = QtGui.QSpinBox()
        mySpinBox.valueChanged.connect(self.foo)

   def foo(self):
       if value was changed by Mouse Wheel:
            #do this
       else:
            #do nothing 

【问题讨论】:

    标签: qt pyqt4


    【解决方案1】:

    派生QSpinBox并覆盖wheelevent

    http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#wheelEvent

    您可以定义自己的信号,该信号将由 wheelevent 发出,以获得您想要的行为。

    有关示例/教程,请参阅: http://pythoncentral.io/pysidepyqt-tutorial-creating-your-own-signals-and-slots/

    【讨论】:

    • 感谢您的回答。你能举例说明如何创建 Qt 信号吗?因为到目前为止我只使用了默认的信号/插槽。
    • 我在答案中附加了一个教程链接。
    • 派生是一种方式,另一种方式是安装事件过滤器。 Qt 的事件过滤系统经过专门设计,因此无需子类即可更轻松地更改类行为。
    • 实际上我两者都做了。我会提供答案
    【解决方案2】:

    基于Gombat's 答案和this 问题(因为它在提供的教程中是如何解释的,它会引发错误)我在小部件中这样做了

    class MyWidget(QtGui.QWidget):
        mySignal1 = QtCore.pyqtSignal() #these have to be here or... 
        mySignal2 = QtCore.pyqtSignal() #...there will be an attribute error
    
        def __init__(self, *args):
            QtGui.QWidget.__init__(self, *args)
            #just an example
            self.mySpinBox1 = QtGui.QSpinBox()
            self.mySpinBox2 = QtGui.QSpinBox()
            self.mySpinBox1.installEventFilter(self)
            self.mySpinBox2.installEventFilter(self)
            self.mySignal1.connect(self.foo)
            self.mySignal2.connect(self.bar)
    
       def eventFilter(self, source, event):
           if source is self.spinBox1:
               if event.type() == QtCore.QEvent.Wheel:
                    self.spinBox1.wheelEvent(event)
                    self.mySignal1.emit()
               return True
           else:
               return False
        elif source is self.spinBox2:
            if event.type() == QtCore.QEvent.Wheel:
                self.spinBox2.wheelEvent(event)
                self.mySignal2.emit()
                return True
            else:
                return False
        else:
            return QtGui.QWidget.eventFilter(self, source, event)
    
        def foo(self):
            #right here, when a mouse wheel event occured in spinbox1
    
        def bar(self):
            #right here, when a mouse wheel event occured in spinbox2
    

    希望这会有所帮助。谢谢(未经测试,因为它只是一个例子,可能会有错误)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多