首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用QDial鼠标单击并更改针

禁用QDial鼠标单击并更改针
EN

Stack Overflow用户
提问于 2019-07-27 03:39:37
回答 3查看 811关注 0票数 1

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

代码语言:javascript
复制
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_())
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-27 11:58:14

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

代码语言:javascript
复制
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的外观所能做的事情很少。默认情况下,指针的形状由小部件样式决定。

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

票数 2
EN

Stack Overflow用户

发布于 2019-07-27 04:07:52

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

代码语言:javascript
复制
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_())
票数 2
EN

Stack Overflow用户

发布于 2019-07-27 09:27:07

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57228942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档