如何使用QIntValidator在QLineEdit中阻止输入逗号?
解决QIntValidator允许输入逗号导致int转换失败的问题
原始代码
#!/usr/bin/env python3 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLineEdit from PyQt5.QtWidgets import QPushButton, QVBoxLayout from PyQt5.QtGui import QIntValidator class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Simple Main Window") button = QPushButton("Press Me!") self.cw = QWidget() self.setCentralWidget(self.cw) layout = QVBoxLayout() self.cw.setLayout(layout) only_int = QIntValidator() self.num_le = QLineEdit() layout.addWidget(self.num_le) self.num_le.setValidator(only_int) self.button = QPushButton("Press Me!") layout.addWidget(self.button) self.button.clicked.connect(self.calc) self.show() def calc(self): print(int(self.num_le.text())) app = QApplication(sys.argv) window = MainWindow() app.exec()
问题描述
使用QIntValidator限制QLineEdit输入整数时,控件仍允许输入逗号。输入1,111这类内容后,执行int()转换会抛出ValueError: invalid literal for int() with base 10: '1,111';输入多个逗号后离开控件,内容会被转为111,111,需要解决该问题。
解决方案
方法1:自定义严格整数验证器
QIntValidator默认会根据系统区域设置允许千位分隔符(如英文区的逗号),可以自定义验证器只允许数字和正负号:
from PyQt5.QtGui import QValidator class StrictIntValidator(QValidator): def validate(self, input_str, pos): # 允许空输入 if not input_str: return (QValidator.Acceptable, input_str, pos) # 允许单独的正负号(中间状态,需后续输入数字) if input_str[0] in '+-' and len(input_str) == 1: return (QValidator.Intermediate, input_str, pos) # 验证所有字符是否为数字(含正负号前缀) check_str = input_str[1:] if input_str[0] in '+-' else input_str if check_str.isdigit(): return (QValidator.Acceptable, input_str, pos) else: return (QValidator.Invalid, input_str, pos)
替换原验证器:
# only_int = QIntValidator() only_int = StrictIntValidator() self.num_le.setValidator(only_int)
方法2:使用输入掩码限制输入
直接给QLineEdit设置输入掩码,强制只允许数字输入(支持负数可调整掩码格式):
# 允许最多10位正整数 self.num_le.setInputMask('9999999999') # 支持正负整数的掩码格式 # self.num_le.setInputMask('+-9999999999')
方法3:重写QLineEdit拦截逗号输入
通过拦截按键事件,直接禁止逗号输入:
class IntLineEdit(QLineEdit): def keyPressEvent(self, event): if event.text() == ',': event.ignore() else: super().keyPressEvent(event)
替换原QLineEdit:
# self.num_le = QLineEdit() self.num_le = IntLineEdit()
兜底方案:清理逗号后再转换
在calc方法中先去除文本中的逗号,再执行转换,避免报错:
def calc(self): cleaned_text = self.num_le.text().replace(',', '') if cleaned_text.isdigit() or (cleaned_text.startswith(('+', '-')) and cleaned_text[1:].isdigit()): print(int(cleaned_text)) else: print("输入不是有效的整数")
内容的提问来源于stack exchange,提问作者jthornton
相关产品推荐
相关产品推荐

