记不清是第几次看到有人问这个问题了:"如何限定QLineEdit只接收某一范围的整数"
方法一
不使用 QLineEdit,因为 QSpinBox 提供了我们和整数打交道需要的功能,直接使用 QSpinBox 是最简单的。
可能有人想:我不想要 QSpinBox 提供的那两个按钮,我不想让用户修改数据,...
这些都容易解决,具体看QSpinBox 的 Manual,或者看下面的例子
方法二
这个可能比上一个更容易想到,用 QIntValidator 。但说实话,这个没有前面的方法好用。
比如:有人抱怨,编辑结束时它不会自动 fixup 无效的数据(例如,范围为100~200,输入50,它就显示50,不会修正为100)
当然,这些问题都可以解决,子类化 QValidator 就行了。具体看QValidator的Manual 或下面的例子
例子
-
PyQt4 4.7.4 (注意:PySide 0.4.2 有bug)
- Python2.7 + Qt 4.7.0
分别采用上面的两种方式(QSpinBox 和 QLineEdit+Validator),实现大致类似的结果(优劣自己评判吧)
截图
代码
#!/usr/bin/env python #--*-- coding:utf-8 --*-- # (C) dbzhang800 2010 import sys try : raise ImportError from PySide import QtCore , QtGui except ImportError : import sip sip .setapi (" QString " , 2 ) from PyQt4 import QtCore , QtGui class Validator (QtGui .QIntValidator ): def __init__ (self , minimun , maximum , parent ): super (Validator , self ).__init__ (minimun , maximum , parent ) def fixup (self , input ): # not work in PySide 0.4.2 return str (self .bottom ()) class Dialog (QtGui .QDialog ): def __init__ (self , parent =None ): super (Dialog , self ).__init__ (parent ) self .lineEdit = QtGui .QLineEdit () self .validator = Validator (100 ,200 , self ) self .lineEdit .setValidator (self .validator ) self .spinBox = QtGui .QSpinBox () self .spinBox .setRange (100 , 200 ) self .spinBox .setButtonSymbols (QtGui .QAbstractSpinBox .NoButtons ) vbox = QtGui .QVBoxLayout (self ) vbox .addWidget (self .lineEdit ) vbox .addWidget (self .spinBox ) self .setWindowTitle (' Qt Validator ' ) if __name__ == ' __main__ ' : app = QtGui .QApplication (sys .argv ) dlg = Dialog () dlg .show () sys .exit (app .exec_ ()) 来源:http://hi.baidu.com/cyclone/blog/item/663709236315e95e925807d1.html