【问题标题】:How to constrain a QSpinBox to valid values如何将 QSpinBox 约束为有效值
【发布时间】:2017-01-26 12:10:43
【问题描述】:

假设我希望 QSpinBox 具有从 0 到 10 的有效值,步长为 2(即 0、2、4、6、8、10)。 我可以将QSpinBox 设置为最小值为 0,最大值为 10,单步为 2。如果用户单击向上/向下箭头,则效果很好。但是,如果用户输入一个奇数(比如 3),旋转框仍然认为它是有效的并接受它。 在这种情况下,我应该怎么做才能让我的 QSpinBox 不允许奇数?

【问题讨论】:

    标签: python pyqt pyqt4


    【解决方案1】:

    要纠正这个问题,你可以实现 valueChanged 信号,验证值是否正确,如果不是 modicas nothing,相反如果不是,则放置之前的值。

    示例:

    import sys
    
    from PyQt4.QtCore import pyqtSignal
    from PyQt4.QtGui import QApplication, QSpinBox
    
    
    class SpinBox(QSpinBox):
        # Replaces the valueChanged signal
        newValueChanged = pyqtSignal(int)
    
        def __init__(self, parent=None):
            super(SpinBox, self).__init__(parent=parent)
    
            self.valueChanged.connect(self.onValueChanged)
            self.before_value = self.value()
            self.newValueChanged.connect(self.slot)
    
        def onValueChanged(self, i):
            if not self.isValid(i):
                self.setValue(self.before_value)
            else:
                self.newValueChanged.emit(i)
                self.before_value = i
    
        def isValid(self, value):
            if (self.minimum() - value % self.singleStep()) == 0:
                return True
            return False
    
        def slot(self, value):
            print(value)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = SpinBox()
        w.setMinimum(0)
        w.setMaximum(10)
        w.setSingleStep(2)
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 像魅力一样工作。只需稍加修改,我现在可以将值设置为最接近的有效值,而不是保留以前的值。谢谢。
    • 经过仔细测试,我发现当前实现中存在一些遗留问题。假设用户输入了一个无效值 3。在当前的实现中,SpinBox.valueChanged 信号仍然发出一个无效值 3。我该如何解决这个问题?
    • @Hongzheng 当然发出了信号,但是代码更正了值。
    • 我希望 SpinBox 小部件发出具有有效值的信号,因为我的程序的其他部分会对此做出响应,并且如果发出无效值会导致问题。
    • @Hongzheng 你应该做的是创建一个新信号,然后你会连接到那个信号,你喜欢吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多