2012-03-11 31 views
1

我想要創建一個雙步移動框,以0.2爲步長更改值。但是當用戶根據步驟輸入一個不正確的值時。我將其歸一化到最接近的正確值。 我嘗試了類似下面顯示的代碼,但我不知道如何停止輸入0.5等值。請幫助我。修復在PyQt中輸入雙擊針的值


    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_() 

回答

4

有兩個選擇:

  • 可以子類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,離開輸入檢查這個分類秒。

+0

非常感謝,能否詳細介紹一下創建子類,然後重寫驗證器方法的第一種方法。因爲這只是我創建的示例程序來演示問題。 – Kakashi 2012-03-11 06:39:15

+0

@Kakashi:看我的編輯。 – Avaris 2012-03-11 06:49:11

+0

@卡卡西:哎呀,我的正則表達式技能是生鏽的:)。用正確的更新。 – Avaris 2012-03-11 07:14:13

0

在你的變化值的方法,你可以做這樣的事情

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

這可能不是最好的方式,但它的工作原理。