我正在寻找一种强制使用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))
另一种可能性是为旋转框重新实现自己的子类并覆盖textFromValue()
函数:
textFromValue()
这样,我们使用当前(默认)语言环境将值转换为字符串,然后返回字符串,并用空格替换分隔符。
尽管两种方法都存在一些问题。
为单个小部件类使用自定义语言环境会在使用复制粘贴功能时导致意外行为:如果用户居住在使用小数点表示的国家/地区,则可能会从其他来源获取简单的“ 50.2”值请勿粘贴,因为验证程序不会将该字符串识别为有效的字符串(对于法语语言环境,应为“ 50,2”)。
如果用户要从子类化的Spinbox复制到另一个子类,则使用textFromValue重写会遇到相反的问题,因为当Spinbox调用class SpaceSeparatorSpin(QtWidgets.QDoubleSpinBox):
def textFromValue(self, value):
text = self.locale().toString(float(value), 'f', self.decimals())
return text.replace(self.locale().groupSeparator(), ' ')
时,空格分隔符会使验证程序忽略字符串。
为避免所有这些,您可以覆盖valueFromText()
函数:如果基本实现返回一个有效或中间值,则将其返回,否则请自己验证当前区域设置以及是否可能使用“双重输入”可能性”(带或不带空格,小数点和组分隔符的颠倒点/逗号);请注意,虽然在使用它们的语言环境中粘贴“以空格分隔”的值有效,但QAbstractSpinBox在键入时不接受空格。
除了所有这些之外,请记住,使用“ de-localized”小数点和分隔符不是一件好事。虽然对您来说似乎不错,但使用其他类型标点符号的用户可能会发现它很烦人,特别是对于那些习惯于数字小键盘的用户:通常,小键盘的小数点键配置有系统区域设置,因此具有使用小数点的区域设置的用户将无法从小键盘上键入小数,从而迫使他们将手移开小键盘以键入逗号。