我想更改一些
QLineEdit
的文本显示。
文本应显示为欧元金额。
QLineEdits 似乎不是这种显示的合适选择。因此,我将代码改编为 QDoubleSpinBox。
简短地说明上下文:
我有几个 QTableWidget,其中使用自定义委托,例如:
class EuroDelegate(QStyledItemDelegate):
def displayText(self, value, locale):
if value is not None:
value = float(value)
return locale.toCurrencyString(value, '€', 2)
else:
return super().displayText(value, locale)
将文本显示为欧元金额。
一些 QLineEdit 还包含欧元金额,我希望它们“感觉”尽可能相似。因此,我将那些 QLineEdits 更改为 QDoubleSpinBoxes。
因此,一些所需的特性很快就实现了。
列表中的被击中的项目已在下面的代码片段中实现:
LineEdit.text()
的一部分。可以使用的代码片段:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QDoubleSpinBox, QLineEdit, QPushButton
from PyQt5.QtCore import QTimer
class EuroDoubleSpinBox(QDoubleSpinBox):
def __init__(self, parent=None):
super().__init__(parent)
self.setButtonSymbols(QDoubleSpinBox.NoButtons)
self.normalSuffix = ''
self.currencySuffix = ' €'
self.setSuffix(self.currencySuffix)
def focusInEvent(self, event):
self.setSuffix(self.normalSuffix)
QTimer.singleShot(0, self.selectAll)
super().focusInEvent(event)
def focusOutEvent(self, event):
self.setSuffix(self.currencySuffix)
super().focusOutEvent(event)
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
layout = QVBoxLayout()
self.pushbutton = QPushButton('Print DoubleSpinBox Value')
self.lineedit = QLineEdit() # added for focus toggling
self.doubleSpinBox = EuroDoubleSpinBox()
self.doubleSpinBox.setRange(-99.99, 99.99)
self.doubleSpinBox.setSingleStep(0.01)
layout.addWidget(self.lineedit)
layout.addWidget(self.doubleSpinBox)
layout.addWidget(self.pushbutton)
self.setLayout(layout)
self.pushbutton.clicked.connect(lambda: print(self.doubleSpinBox.cleanText()))
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.setGeometry(100, 100, 200, 100)
window.setWindowTitle('Euro DoubleSpinBox')
window.show()
sys.exit(app.exec_())
我正在使用 python 3.10.13 和 PyQt5 5.15.9
validate()
函数来调用内部验证器,类似于 QValidator 的 validate()
的功能。
解决方案是根据您的需要覆盖该函数。
对于这样一个简单的要求(在输入第三位数字时添加小数点),以下内容可能就足够了:
class EuroDoubleSpinBox(QDoubleSpinBox):
...
def validate(self, text, pos):
if 2 < len(text.lstrip('-')) < 5:
if text.isdecimal():
p = 2
elif text.startswith('-') and text[1:].isdecimal() and len(text) > 3:
p = 3
else:
return super().validate(text, pos)
value = float('{}.{}'.format(text[:p], text[p:]))
if self.minimum() <= value <= self.maximum():
return (
QValidator.Acceptable,
text[:p] + QLocale().decimalPoint() + text[p:],
pos + 1
)
return super().validate(text, pos)
程序如下:
0-9
范围内的字符,类似于正则表达式的 \d?
),则假设小数点位于第二位数字之后;QValidator.Acceptable
,即带有区域设置定义的小数点的文本,并将光标位置增加 1;上述内容几乎适用于任何情况,包括从键盘粘贴。如果您还想支持使用点作为小数点粘贴浮点值,而系统使用不同的符号(如您的情况),则可能需要进行更多微调。