禁用QDial鼠标单击并更换针头

时间:2019-07-27 03:39:37

标签: python pyqt pyqt4 mouseevent qdial

我有一个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_())

3 个答案:

答案 0 :(得分:1)

您必须禁用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_())

答案 1 :(得分: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确定:

enter image description here enter image description here

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

答案 2 :(得分:0)

可能更容易使用setEnabled(False),这将阻止用户输入。但是,这也从视觉上禁用了转盘,看起来可能不太好。