You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:50:17