PySide6 QDoubleValidator小数位数限制功能异常求助
问题:QDoubleValidator无法设置超过2位的小数输入限制
我编写了PySide6程序,试图用QDoubleValidator限制输入框的小数位数,但无论构造函数第三个参数设为多少,都只能输入最多2位小数。
代码如下:
import sys from PySide6 import QtWidgets from PySide6.QtCore import QSize, QLocale from PySide6.QtGui import QDoubleValidator from PySide6.QtWidgets import QMainWindow, QLineEdit, QPushButton, QFormLayout, QWidget class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.setMinimumSize(QSize(420, 100)) self.line_edit_2 = QLineEdit() self.line_edit_4 = QLineEdit() self.validator_2 = QDoubleValidator(0, 10, 2) self.validator_2.setNotation(QDoubleValidator.StandardNotation) self.line_edit_2.setValidator(self.validator_2) self.validator_4 = QDoubleValidator(0, 10, 4) self.validator_4.setNotation(QDoubleValidator.StandardNotation) self.line_edit_4.setValidator(self.validator_4) self.form_layout = QFormLayout() self.form_layout.addRow("Double 2", self.line_edit_2) self.form_layout.addRow("Double 4", self.line_edit_4) self.button = QPushButton('Validate') self.form_layout.addRow("", self.button) self.button.clicked.connect( lambda: {print(self.line_edit_2.hasAcceptableInput(), self.line_edit_4.hasAcceptableInput())}) self.main_widget = QWidget() self.main_widget.setLayout(self.form_layout) self.setCentralWidget(self.main_widget) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_())
运行时的问题截图:
解决方案
问题根源在于QDoubleValidator默认会使用系统的区域设置(QLocale),而很多系统默认的区域设置会将小数位数限制为2位,导致你设置的更高位数不生效。
要解决这个问题,需要为每个QDoubleValidator显式设置一个支持任意小数位数的区域设置(比如美式英语),修改后的代码如下:
import sys from PySide6 import QtWidgets from PySide6.QtCore import QSize, QLocale from PySide6.QtGui import QDoubleValidator from PySide6.QtWidgets import QMainWindow, QLineEdit, QPushButton, QFormLayout, QWidget class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.setMinimumSize(QSize(420, 100)) self.line_edit_2 = QLineEdit() self.line_edit_4 = QLineEdit() # 为验证器设置美式英语区域,避免系统locale限制小数位数 us_locale = QLocale(QLocale.English, QLocale.UnitedStates) self.validator_2 = QDoubleValidator(0, 10, 2) self.validator_2.setLocale(us_locale) self.validator_2.setNotation(QDoubleValidator.StandardNotation) self.line_edit_2.setValidator(self.validator_2) self.validator_4 = QDoubleValidator(0, 10, 4) self.validator_4.setLocale(us_locale) self.validator_4.setNotation(QDoubleValidator.StandardNotation) self.line_edit_4.setValidator(self.validator_4) self.form_layout = QFormLayout() self.form_layout.addRow("Double 2", self.line_edit_2) self.form_layout.addRow("Double 4", self.line_edit_4) self.button = QPushButton('Validate') self.form_layout.addRow("", self.button) self.button.clicked.connect( lambda: {print(self.line_edit_2.hasAcceptableInput(), self.line_edit_4.hasAcceptableInput())}) self.main_widget = QWidget() self.main_widget.setLayout(self.form_layout) self.setCentralWidget(self.main_widget) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_())
说明
- 创建
us_locale指定美式英语区域,该区域对小数位数没有强制限制,完全遵循你在QDoubleValidator构造函数中设置的位数。 - 通过
setLocale()方法将验证器与该区域绑定,这样输入时就可以输入最多4位小数了,同时保留另一个输入框的2位限制。
内容的提问来源于stack exchange,提问作者sebwr
相关产品推荐
相关产品推荐

