我正在寻找一种强制使用doublespinbox的groupSeparator
符号的方法。
对于上下文,我的程序之一使用数字输入(doublespinbox)+单位选择(单选按钮)来形成数字。大致如下:
voltage [ 5 ] o V
o mV
o µV
我使用组分隔符使阅读更加容易。在法语机器上,我得到令人满意的显示,例如,一千零一看起来像:1 000
或1,000
。在英语机器上,我得到1,000
和1.000
,它们很容易混淆。我该如何强制组分隔符始终为空格?
或者,我认为解决方案可能是将程序的locale强制为已回答here,但是我一直对看看是否有可能定制解决方案很感兴趣。否则,我会坚持下去
self.setLocale(QtCore.QLocale(QtCore.QLocale.French))
答案 0 :(得分:2)
另一种可能性是为Spinbox重新实现自己的子类并覆盖textFromValue()
函数:
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复制到另一个Spinpinbox,则使用textFromValue重写会遇到相反的问题,因为空格分隔符将使Spinner调用valueFromText()
时验证程序忽略字符串。
为避免所有这些情况,您可以覆盖validate()
函数:如果基本实现返回有效或中间值,则返回它,否则请自己验证当前区域设置以及是否可能使用该值,以进行验证。 “双重输入的可能性”(带或不带空格,小数点和逗号和小数点和组分隔符);请注意,虽然在使用它们的语言环境中粘贴“以空格分隔”的值有效,但QAbstractSpinBox在键入时不接受空格。
除此之外,请记住,使用“ de-localized”小数点和分隔符不是一件好事。虽然对您来说看起来不错,但使用其他标点符号的用户可能会发现它非常讨厌,特别是对于那些习惯于数字小键盘的用户:通常,配置小数点的小数点键与系统语言环境中的语言环境相同,因此具有使用小数点的语言环境的用户将无法从键盘上输入小数,从而迫使他们将手移开小键盘以键入逗号。