Python 有没有办法更改spinbox';s组分隔符符号?

Python 有没有办法更改spinbox';s组分隔符符号?,python,python-3.x,pyqt,pyqt5,qdoublespinbox,Python,Python 3.x,Pyqt,Pyqt5,Qdoublespinbox,我正在寻找一种方法来强制使用doublespinbox的groupSeparator符号 在上下文中,我的一个程序使用数字输入(doublespinbox)+单位选项(单选按钮)来形成一个数字。大致如下: voltage [ 5 ] o V o mV o µV 我使用组分隔符使阅读更容易。在法国的机器上,我得到了令人满意的显示,例如1000和1看起来是这样的:1000或1000。在一台英国机器上,我得到的1000和1.000很容易混淆。如

我正在寻找一种方法来强制使用doublespinbox的
groupSeparator
符号

在上下文中,我的一个程序使用数字输入(doublespinbox)+单位选项(单选按钮)来形成一个数字。大致如下:

voltage [ 5 ] o V
              o mV
              o µV
我使用组分隔符使阅读更容易。在法国的机器上,我得到了令人满意的显示,例如1000和1看起来是这样的:
1000
1000
。在一台英国机器上,我得到的
1000
1.000
很容易混淆。如何强制组分隔符始终为空格

或者,我认为一个解决方案可以是强制程序按答案运行,但我总是想看看定制解决方案是否可行。否则,我会坚持下去

self.setLocale(QtCore.QLocale(QtCore.QLocale.French))

另一种可能是为spinbox重新实现您自己的子类并重写函数:

class SpaceSeparatorSpin(QtWidgets.QDoubleSpinBox):
    def textFromValue(self, value):
        text = self.locale().toString(float(value), 'f', self.decimals())
        return text.replace(self.locale().groupSeparator(), ' ')
通过这种方式,我们使用当前(默认)语言环境将值转换为字符串,然后返回字符串,并用空格替换分隔符

不过,这两种方法都存在一些问题

在使用复制和粘贴功能时,为单个小部件类使用自定义区域设置可能会导致意外行为:如果用户居住的国家使用小数点,则不会粘贴可能从其他来源获取的简单“50.2”值,因为验证器不会识别该字符串为有效字符串(对于法语地区,它应该是“50,2”)

如果用户想要从一个子类spinbox复制到另一个子类spinbox,则使用textFromValue覆盖会产生相反的问题,因为当spinbox调用
valueFromText()
时,空格分隔符会使验证器忽略该字符串

为了避免这一切,您可以重写该函数:如果基本实现返回有效值或中间值,则返回该值,否则请自行验证该值,注意当前区域设置和“双输入可能性”(带或不带空格、倒过来的点/逗号表示小数和组分隔符);请注意,在使用“空格分隔”值的区域设置上粘贴该值时,QAbstractSpinBox在键入时不接受空格


除此之外,请记住使用“去本地化”小数点和分隔符不是一件好事。虽然它对您来说似乎很好,但使用其他类型标点符号的用户可能会觉得它非常烦人,尤其是对于习惯数字键盘的用户:通常,键盘的小数点键配置为系统语言环境的小数点键,因此具有使用poi的语言环境的用户nt for decimals将无法从键盘输入小数,迫使他们将手从键盘移开以键入逗号。

另一种可能是为spinbox重新实现您自己的子类并覆盖该函数:

class SpaceSeparatorSpin(QtWidgets.QDoubleSpinBox):
    def textFromValue(self, value):
        text = self.locale().toString(float(value), 'f', self.decimals())
        return text.replace(self.locale().groupSeparator(), ' ')
通过这种方式,我们使用当前(默认)语言环境将值转换为字符串,然后返回字符串,并用空格替换分隔符

不过,这两种方法都存在一些问题

在使用复制和粘贴功能时,为单个小部件类使用自定义区域设置可能会导致意外行为:如果用户居住的国家使用小数点,则不会粘贴可能从其他来源获取的简单“50.2”值,因为验证器不会识别该字符串为有效字符串(对于法语地区,它应该是“50,2”)

如果用户想要从一个子类spinbox复制到另一个子类spinbox,则使用textFromValue覆盖会产生相反的问题,因为当spinbox调用
valueFromText()
时,空格分隔符会使验证器忽略该字符串

为了避免这一切,您可以重写该函数:如果基本实现返回有效值或中间值,则返回该值,否则请自行验证该值,注意当前区域设置和“双输入可能性”(带或不带空格、倒过来的点/逗号表示小数和组分隔符);请注意,在使用“空格分隔”值的区域设置上粘贴该值时,QAbstractSpinBox在键入时不接受空格


除此之外,请记住使用“去本地化”小数点和分隔符不是一件好事。虽然它对您来说似乎很好,但使用其他类型标点符号的用户可能会觉得它非常烦人,尤其是对于习惯数字键盘的用户:通常,键盘的小数点键配置为系统语言环境的小数点键,因此具有使用poi的语言环境的用户nt for decimals将无法从键盘上键入小数,这将迫使他们将手从键盘上移开以键入逗号。

感谢您提供的所有信息。这听起来需要做大量工作,只需替换一个字符就可以覆盖。我听到您的观点,即通过强制用户使用点或逗号约定来烦扰用户,而不考虑按键董事会类型。我想理想的情况应该是花时间深入研究这个问题,并使用您所讨论的所有内容创建一个自定义类+支持的多语言环境+我想要的其他详细信息(例如doublespinbox中的“0.000”应该==int(0),而不是因为浮点不精确),等等。此外,还可以覆盖spinbox lineEdit的paintEvent(在需要时添加“空格边距”或更改要绘制的显示文本),但这将是一个巨大的过度:QLineEdit的自定义绘制非常难以实现,如果不非常小心地完成,很容易出现错误,还因为您必须考虑分隔符和鼠标交互/键盘导航的不同字体大小。啊哈,太好了,考虑到我自动根据屏幕分辨率调整我的所有小部件及其字体大小!我将通过:)谢谢大家