如何在QDoubleSpinBox中输入负浮点数?附实现代码与解决方案
解决QDoubleSpinBox输入负浮点数的问题
问题背景
需要在QDoubleSpinBox组件中输入负浮点数,最初查阅文档未找到直接方法,于是编写了自定义的CustomDoubleSpinbox类及ComboBoxDelegate委托类来实现功能,后续发现通过内置方法即可轻松解决。
最初的自定义实现代码
from PyQt5.QtWidgets import QStyledItemDelegate, QLineEdit, QComboBox, QDoubleSpinBox, QModelIndex from PyQt5.QtCore import Qt class ComboBoxDelegate(QStyledItemDelegate): """A delegate that allows the user to change integer values from the model using a spin box widget. """ def __init__(self, parent=None): super().__init__(parent) def createEditor(self, parent, option, index : QModelIndex): if index.column() == 0 : editor = QLineEdit(parent) return editor if index.column() == 1 : combo = QComboBox(parent) combo.addItems(["len","diam","conc"]) editor = combo return editor if index.column() > 1 : editor = CustomDoubleSpinbox(parent) editor.setDecimals(3) return editor def setEditorData(self, editor , index): value = index.model().data(index, Qt.EditRole) if type(editor) == QComboBox : editor.setCurrentText(str(value)) if type(editor) == CustomDoubleSpinbox : editor.setValue(value) if type(editor) == QLineEdit : editor.setText(value) def setModelData(self, editor , model, index : QModelIndex): if type(editor) == QComboBox : value = editor.currentText() if type(editor) == CustomDoubleSpinbox : editor.interpretText() value = editor.value() if type(editor) == QLineEdit : value = editor.text() model.setData(index, value, Qt.EditRole) def updateEditorGeometry(self, editor, option, index): editor.setGeometry(option.rect) class CustomDoubleSpinbox(QDoubleSpinBox): def validate(self, text: str, pos: int) -> object: text = text.replace(".", ",") return QDoubleSpinBox.validate(self, text, pos) def valueFromText(self, text: str) -> float: text = text.replace(",", ".") return float(text)
更简洁的官方解决方案
无需编写自定义类,直接调用QDoubleSpinBox的setMinimum()方法,将最小值设置为负数即可支持输入负浮点数。示例代码:
# 假设spin_box是你的QDoubleSpinBox实例 spin_box.setMinimum(-float('inf')) # 允许输入任意负数 # 也可设置具体最小值,例如 # spin_box.setMinimum(-100.0)
内容的提问来源于stack exchange,提问作者Thomas.C
相关产品推荐
相关产品推荐

