Skip to main content
 首页 » 编程设计

python之禁用 QDial 鼠标点击和换针

2025年05月04日20mfrbuaa

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

请您参考如下方法:

默认情况下,用户可以使用鼠标点击、鼠标滚轮或键盘快捷键来控制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 并使用自定义绘图来获得不同的指针形状。但这不是一件简单的事情,因此如果您需要这方面的帮助,您将需要提出一个新问题。