修复在PyQt中输入双打平箱的值

时间:2012-03-11 05:08:35

标签: python qt pyqt pyqt4

我想创建一个双面拼图框,以0.2为步长更改值。但是当用户根据步骤输入不正确的值时。我将其标准化为最接近的正确值。 我尝试了类似下面显示的代码,但我不知道如何停止输入0.5之类的值。请帮帮我。


    from PyQt4.QtCore import *
    from PyQt4.QtGui import *

    class SigSlot(QWidget):
        def __init__(self, parent=None):
            QWidget.__init__(self, parent)
            self.setWindowTitle('spinbox value')
            self.resize(250,150)
            self.lcd1 = QLCDNumber(self)
            self.spinbox1 = QDoubleSpinBox(self)
            self.spinbox1.setSingleStep(0.2)
            self.spinbox1.setCorrectionMode(1)
             # create a Grid Layout
            grid = QGridLayout()
            grid.addWidget(self.lcd1, 0, 0)
            grid.addWidget(self.spinbox1, 1, 0)
            self.setLayout(grid)
             # allows access to the spinbox value as it changes
            self.connect(self.spinbox1, SIGNAL('valueChanged(double)'), self.change_value1)

        def change_value1(self, event):
            val = self.spinbox1.value()
            self.lcd1.display(val)

    app = QApplication([])
    qb = SigSlot()
    qb.show()
    app.exec_()

2 个答案:

答案 0 :(得分:5)

您有两种选择:

  • 您可以继承QSpinBox,覆盖validate方法并在其中使用适当的Q*Validator(例如QRegExpValidator)。
  • 您可以在使用之前检查连接到valueChanged的插槽中的值,并在必要时进行更正。

由于您已经在使用valueChanged信号,因此第二个选项应该相当容易实现。只需像这样更改change_value方法:

def change_value1(self, val): # new value is passed as an argument
    # so no need for this
    # val = self.spinbox1.value()

    new_val = round(val*5)/5 # one way to fix
    if val != new_val:       # if value is changed, put it in the spinbox
        self.spinbox1.setValue(new_val)

    self.lcd1.display(new_val)

顺便说一下,由于您只使用一个小数精度,因此使用:

也是合乎逻辑的
self.spinbox1.setDecimals(1)

__init__中。并尝试使用new style signals and slots。即:

self.connect(self.spinbox1, SIGNAL('valueChanged(double)'), self.change_value1)

可以写成:

self.spinbox1.valueChanged[float].connect(self.change_value1)

修改

子类:

class MySpinBox(QDoubleSpinBox):
    def __init__(self, parent=None):
        super(MySpinBox, self).__init__(parent)
        # any RegExp that matches the allowed input
        self.validator = QRegExpValidator(QRegExp("\\d+[\\.]{0,1}[02468]{0,1}"), self)

    def validate(self, text, pos):
        # this decides if the entered value should be accepted
        return self.validator.validate(text, pos)

然后使用QDoubleSpinBox代替使用MySpinBox,并将输入检查留给此类。

答案 1 :(得分:0)

在您的更改值方法中,您可以执行类似这样的操作

val = round(self.spinbox1.value(), 1)
if val/2*10 - int(val/2*10):
    val = round(val, 1) + .1

这可能不是最好的方式,但它有效。