有没有办法更改旋转框的 groupSeparator 符号?
Is there a way to change a spinbox's groupSeparator symbol?
我正在寻找一种方法来强制使用双旋转框的 groupSeparator
符号。
对于上下文,我的一个程序使用数字输入 (doublespinbox) + 单位选择(单选按钮)来形成一个数字。它看起来大致是这样的:
voltage [ 5 ] o V
o mV
o µV
我使用组分隔符使阅读更容易。在法国机器上,我得到了令人满意的显示,例如 1000 和 1 看起来像这样:1 000
或 1,000
。在英文机器上,我得到 1,000
和 1.000
,这很容易混淆。我如何强制组分隔符始终为 space?
或者,我认为一个解决方案可能是强制 locale of the program as answered here,但我一直很想知道自定义解决方案是否可行。否则,我会坚持
self.setLocale(QtCore.QLocale(QtCore.QLocale.French))
另一种可能性是为旋转框重新实现您自己的子class并覆盖textFromValue()
函数:
class SpaceSeparatorSpin(QtWidgets.QDoubleSpinBox):
def textFromValue(self, value):
text = self.locale().toString(float(value), 'f', self.decimals())
return text.replace(self.locale().groupSeparator(), ' ')
通过这种方式,我们使用当前(默认)语言环境将值转换为字符串,然后 return 将分隔符替换为 space 的字符串。
不过,这两种方法都存在一些问题。
为单个小部件使用自定义区域设置 class 在使用复制和粘贴功能时可能会导致意外行为:如果用户居住在使用点作为小数点的国家/地区,则一个简单的“50.2”值可能取自另一个来源将不会被粘贴,因为验证器不会将该字符串识别为有效(对于法语语言环境,它应该是“50,2”)。
如果用户想从子classed 旋转框复制到另一个,使用 textFromValue 覆盖会产生相反的问题,因为 space 分隔符将使验证器在旋转框时忽略字符串调用 valueFromText()
.
为了避免这一切,您可以覆盖 validate()
函数:如果基础实现 return 是一个有效或中间值,return 它,否则请自行验证注意当前的语言环境和 "double input possibilities" 的可能性(有或没有 spaces,小数和组分隔符倒置 points/commas);请注意,在使用它们的区域设置上粘贴 "space-separated" 值时,QAbstractSpinBox 在键入时不接受 spaces。
除此之外,请记住使用 "de-localized" 小数点和分隔符不是一件好事。虽然这对您来说似乎很好,但使用其他类型标点符号的用户可能会发现它 非常 令人讨厌,特别是对于习惯数字键盘的人:通常,小数点键pad 配置了系统区域设置,因此具有使用小数点的区域设置的用户将无法从 pad 键入小数,迫使他们将手从它移开以键入逗号。
我正在寻找一种方法来强制使用双旋转框的 groupSeparator
符号。
对于上下文,我的一个程序使用数字输入 (doublespinbox) + 单位选择(单选按钮)来形成一个数字。它看起来大致是这样的:
voltage [ 5 ] o V
o mV
o µV
我使用组分隔符使阅读更容易。在法国机器上,我得到了令人满意的显示,例如 1000 和 1 看起来像这样:1 000
或 1,000
。在英文机器上,我得到 1,000
和 1.000
,这很容易混淆。我如何强制组分隔符始终为 space?
或者,我认为一个解决方案可能是强制 locale of the program as answered here,但我一直很想知道自定义解决方案是否可行。否则,我会坚持
self.setLocale(QtCore.QLocale(QtCore.QLocale.French))
另一种可能性是为旋转框重新实现您自己的子class并覆盖textFromValue()
函数:
class SpaceSeparatorSpin(QtWidgets.QDoubleSpinBox):
def textFromValue(self, value):
text = self.locale().toString(float(value), 'f', self.decimals())
return text.replace(self.locale().groupSeparator(), ' ')
通过这种方式,我们使用当前(默认)语言环境将值转换为字符串,然后 return 将分隔符替换为 space 的字符串。
不过,这两种方法都存在一些问题。
为单个小部件使用自定义区域设置 class 在使用复制和粘贴功能时可能会导致意外行为:如果用户居住在使用点作为小数点的国家/地区,则一个简单的“50.2”值可能取自另一个来源将不会被粘贴,因为验证器不会将该字符串识别为有效(对于法语语言环境,它应该是“50,2”)。
如果用户想从子classed 旋转框复制到另一个,使用 textFromValue 覆盖会产生相反的问题,因为 space 分隔符将使验证器在旋转框时忽略字符串调用 valueFromText()
.
为了避免这一切,您可以覆盖 validate()
函数:如果基础实现 return 是一个有效或中间值,return 它,否则请自行验证注意当前的语言环境和 "double input possibilities" 的可能性(有或没有 spaces,小数和组分隔符倒置 points/commas);请注意,在使用它们的区域设置上粘贴 "space-separated" 值时,QAbstractSpinBox 在键入时不接受 spaces。
除此之外,请记住使用 "de-localized" 小数点和分隔符不是一件好事。虽然这对您来说似乎很好,但使用其他类型标点符号的用户可能会发现它 非常 令人讨厌,特别是对于习惯数字键盘的人:通常,小数点键pad 配置了系统区域设置,因此具有使用小数点的区域设置的用户将无法从 pad 键入小数,迫使他们将手从它移开以键入逗号。