禁用 QDial 鼠标点击和换针
Disable QDial mouse clicks and change the needle
我有一个 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_())
您必须禁用 mousePressEvent()
, mouseReleaseEvent()
and 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_())
使用 setEnabled(False)
可能更简单,它应该会阻止用户输入。但是,这也会在视觉上禁用表盘,看起来可能不太好看。
默认情况下,用户可以通过单击鼠标、鼠标滚轮或键盘快捷键来控制 QDial
。为了防止 all 这些,一个简单的解决方案是使用 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"样式,它看起来像右边的那个。但是,无法更改 单个小部件 的样式 - 这是所有或 none 的情况。因此,改变单个表盘的唯一真正解决方案是重新实现其 paintEvent
并使用自定义绘图来获得不同的指针形状。但这不是一件简单的事情,所以如果你需要帮助,你需要问一个新问题。
我有一个 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_())
您必须禁用 mousePressEvent()
, mouseReleaseEvent()
and 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_())
使用 setEnabled(False)
可能更简单,它应该会阻止用户输入。但是,这也会在视觉上禁用表盘,看起来可能不太好看。
默认情况下,用户可以通过单击鼠标、鼠标滚轮或键盘快捷键来控制 QDial
。为了防止 all 这些,一个简单的解决方案是使用 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"样式,它看起来像右边的那个。但是,无法更改 单个小部件 的样式 - 这是所有或 none 的情况。因此,改变单个表盘的唯一真正解决方案是重新实现其 paintEvent
并使用自定义绘图来获得不同的指针形状。但这不是一件简单的事情,所以如果你需要帮助,你需要问一个新问题。