【问题标题】:Disable QDial mouse clicks and change the needle禁用 QDial 鼠标点击并更改指针
【发布时间】:2019-07-27 20:01:55
【问题描述】:

我有一个QDial 小部件,我想知道是否有办法禁用鼠标在表盘上的点击。我只希望能够使用setValue() 设置QDial 的值。当用户点击表盘时,我不希望发生任何事情,而不是移动到用户点击的位置。我查看了mousePressEvent 处理程序,但它仍然将指针移动到新位置。如何禁止鼠标点击影响 QDial 的值?另外:有没有办法通过样式表将当前值指示符(圆形对象)更改为针?

from PyQt4 import QtGui, QtCore

class DisabledDial(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.dial = QtGui.QDial()
        self.dial.setMaximum(360)
        self.dial.setNotchesVisible(True)
        self.dial.setWrapping(True)

        self.layout = QtGui.QVBoxLayout()
        self.layout.addWidget(self.dial)
        self.setLayout(self.layout)

        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.tick_update)
        self.timer.start(1000)

    def tick_update(self):
        self.dial.setValue(self.dial.value() + 10)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    dial = DisabledDial()
    dial.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyqt4 mouseevent qdial


    【解决方案1】:

    默认情况下,用户可以使用鼠标单击、鼠标滚轮或键盘快捷键来控制QDial。为了防止所有这些,一个简单的解决方案是使用event-filter,如下所示:

    class DisabledDial(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
            self.dial = QtGui.QDial()
            self.dial.installEventFilter(self)
            ...
    
        def eventFilter(self, source, event):
            if (source is self.dial and isinstance(event, (
                QtGui.QMouseEvent, QtGui.QWheelEvent, QtGui.QKeyEvent))):
                return True
            return QtGui.QWidget.eventFilter(self, source, event)
    

    至于您的另一个问题:目前,使用样式表改变QDial 的外观几乎没有什么办法。默认情况下,指针的形状由widget-style决定:

    在我的系统上,PyQt4 中的默认外观看起来像左边的那个。但是如果我使用 Qt Designer 中的预览功能切换到“plastique”样式,它看起来就像右边的那个。但是,没有办法更改单个小部件的样式 - 这是全部或全部的情况。因此,更改单个表盘的唯一真正解决方案是重新实现其paintEvent 并使用自定义绘图来获得不同的指针形状。但这并不是一件简单的事情,因此如果您需要帮助,您需要提出一个新问题。

    【讨论】:

      【解决方案2】:

      您必须禁用mousePressEvent()mouseReleaseEvent()mouseMoveEvent() 方法:

      from PyQt4 import QtCore, QtGui
      
      
      class Dial(QtGui.QDial):
          def mousePressEvent(self, event):
              pass
      
          def mouseReleaseEvent(self, event):
              pass
      
          def mouseMoveEvent(self, event):
              pass
      
      
      class DisabledDial(QtGui.QWidget):
          def __init__(self, parent=None):
              super(DisabledDial, self).__init__(parent)
      
              self.dial = Dial(
                  maximum=360,
                  notchesVisible=True,
                  wrapping=True,
              )
              lay = QtGui.QVBoxLayout(self)
              lay.addWidget(self.dial)
      
              timer = QtCore.QTimer(
                  self,
                  timeout=self.tick_update,
                  interval=1000,
              )
              timer.start()
      
          @QtCore.pyqtSlot()
          def tick_update(self):
              self.dial.setValue(self.dial.value() + 10)
      
      
      if __name__ == "__main__":
          import sys
      
          app = QtGui.QApplication(sys.argv)
          dial = DisabledDial()
          dial.show()
          sys.exit(app.exec_())
      

      【讨论】:

        【解决方案3】:

        使用setEnabled(False) 可能更容易,这应该会阻止用户输入。但是,这也会在视觉上禁用表盘,这可能看起来不太好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多