使用 QDoubleValidator 限制 QLineEdit 输入并将值重置为最接近的可接受值
Using QDoubleValidator to limit QLineEdit input and reset the value to nearest acceptable
我想使用 QLineEdit 获取用户输入的值。我想将输入限制在一个范围内,所以我应该使用 QDoubleValidator。我希望它的工作方式是,如果它们超过允许值,它将文本设置为 top() 值,如果它们低于允许值,则将其设置为 bottom() 值。
我研究了使用 textChanged、returnPressed 和 inputRejected 信号。我遇到麻烦的原因是一旦我用范围设置验证器,returnPressed 将不会进入他们提到的 check_validator 函数 here。然后,我想也许我可以用输入拒绝信号捕捉到它,但出于某种原因,这似乎也不起作用。这是一些代码:
class LineEdit(QLineEdit):
def __init__(self, text, parent=None):
super(LineEdit, self).__init__(parent)
self.validator = QDouble Validator()
self.setValidator(self.validator)
self.text = text
self.textChanged.connect(self.new_text)
self.returnPressed(self.check_validator)
def new_text(self, text):
self.ntext = text
def check validator:
try:
if float(self.ntext) > self.validator.top():
self.text = str(self.validator.top()
if float(self.ntext) < self.validator.bottom():
self.text = str(self.validator.bottom()
else:self.text = self.ntext
self.setText(self.text)
except:
mssg = QMessageBox.about(self, "Error", "Input can only be a number")
mssg.exec()
self.setText(self.text)
def valRange(self, x1, x2):
self.validator.setRange(x1, x2)
当 window 确实弹出时,我也收到一个属性错误,说 'noneType' 对象没有属性 'exec'。我想我缺少有关如何正确关闭 window 的步骤。
您可以重新实现 keyPressEvent
以在 hasAcceptableInput
为 false 时捕获 return 按下。覆盖 text
属性 也有一个缺点,现在任何对 setText
的编程调用都不会更新 QLineEdit 的文本。没有理由这样做。
class LineEdit(QLineEdit):
def __init__(self, *args, **kwargs):
super(LineEdit, self).__init__(*args, **kwargs)
self.validator = QDoubleValidator(0, 10, 4, notation=QDoubleValidator.StandardNotation)
self.setValidator(self.validator)
self.textChanged.connect(self.new_text)
self.returnPressed.connect(self.check_validator)
self.ntext = None
def keyPressEvent(self, event):
super().keyPressEvent(event)
if event.key() == Qt.Key_Return and not self.hasAcceptableInput():
self.check_validator()
def new_text(self, text):
if self.hasAcceptableInput():
self.ntext = text
def check_validator(self):
try:
if float(self.text()) > self.validator.top():
self.setText(str(self.validator.top()))
elif float(self.text()) < self.validator.bottom():
self.setText(str(self.validator.bottom()))
except:
mssg = QMessageBox.about(self, "Error", "Input can only be a number")
self.setText(self.ntext)
我想使用 QLineEdit 获取用户输入的值。我想将输入限制在一个范围内,所以我应该使用 QDoubleValidator。我希望它的工作方式是,如果它们超过允许值,它将文本设置为 top() 值,如果它们低于允许值,则将其设置为 bottom() 值。
我研究了使用 textChanged、returnPressed 和 inputRejected 信号。我遇到麻烦的原因是一旦我用范围设置验证器,returnPressed 将不会进入他们提到的 check_validator 函数 here。然后,我想也许我可以用输入拒绝信号捕捉到它,但出于某种原因,这似乎也不起作用。这是一些代码:
class LineEdit(QLineEdit):
def __init__(self, text, parent=None):
super(LineEdit, self).__init__(parent)
self.validator = QDouble Validator()
self.setValidator(self.validator)
self.text = text
self.textChanged.connect(self.new_text)
self.returnPressed(self.check_validator)
def new_text(self, text):
self.ntext = text
def check validator:
try:
if float(self.ntext) > self.validator.top():
self.text = str(self.validator.top()
if float(self.ntext) < self.validator.bottom():
self.text = str(self.validator.bottom()
else:self.text = self.ntext
self.setText(self.text)
except:
mssg = QMessageBox.about(self, "Error", "Input can only be a number")
mssg.exec()
self.setText(self.text)
def valRange(self, x1, x2):
self.validator.setRange(x1, x2)
当 window 确实弹出时,我也收到一个属性错误,说 'noneType' 对象没有属性 'exec'。我想我缺少有关如何正确关闭 window 的步骤。
您可以重新实现 keyPressEvent
以在 hasAcceptableInput
为 false 时捕获 return 按下。覆盖 text
属性 也有一个缺点,现在任何对 setText
的编程调用都不会更新 QLineEdit 的文本。没有理由这样做。
class LineEdit(QLineEdit):
def __init__(self, *args, **kwargs):
super(LineEdit, self).__init__(*args, **kwargs)
self.validator = QDoubleValidator(0, 10, 4, notation=QDoubleValidator.StandardNotation)
self.setValidator(self.validator)
self.textChanged.connect(self.new_text)
self.returnPressed.connect(self.check_validator)
self.ntext = None
def keyPressEvent(self, event):
super().keyPressEvent(event)
if event.key() == Qt.Key_Return and not self.hasAcceptableInput():
self.check_validator()
def new_text(self, text):
if self.hasAcceptableInput():
self.ntext = text
def check_validator(self):
try:
if float(self.text()) > self.validator.top():
self.setText(str(self.validator.top()))
elif float(self.text()) < self.validator.bottom():
self.setText(str(self.validator.bottom()))
except:
mssg = QMessageBox.about(self, "Error", "Input can only be a number")
self.setText(self.ntext)