我正在尝试制作一个 QDoubleSpinbox,允许输入带单位的自定义公制距离,例如“3.123 毫米”、“2.1 微米”、“10.567 m”。
有什么办法说服QDoubleSpinbox使后缀可编辑吗?
我想通了。不能用
suffix()
,但是还有另一种方法。给你:
from PySide.QtGui import QApplication, QDoubleSpinBox, QValidator, QAbstractSpinBox
class DistanceSpinBox(QDoubleSpinBox):
def __init__(self, unit='mm', parent=None):
self.unit = unit
super().__init__(parent)
self.setStepType(QAbstractSpinBox.AdaptiveDecimalStepType)
#self.setKeyboardTracking(False)
def textFromValue(self, value):
decimals = self.decimals()
fmt = f"{{:.{decimals}f}} {self.unit}"
return fmt.format(value)
def valueFromText(self, text):
parts = text.split()
if not parts:
return 0.0
try:
value = float(parts[0])
except ValueError:
value = 0.0
if len(parts) > 1:
unit = parts[1]
if unit: # (Here I check whether the unit is actually valid)
self.unit = unit
self.valueChanged.emit(value)
return value
def fixup(self, text):
value = self.valueFromText(text)
return self.textFromValue(value)
def validate(self, text, pos):
return QValidator.Acceptable, text, pos
if __name__ == '__main__':
app = QApplication(sys.argv)
spin_box = DistanceSpinBox()
spin_box.show()
sys.exit(app.exec_())