您可以使用自定义文本创建一个 Spinbox
DoubleSpinBox.qml
import QtQuick 2.0
import QtQuick.Controls 2.1
Item {
property int decimals: 2
property real realValue: 0.0
property real realFrom: 0.0
property real realTo: 100.0
property real realStepSize: 1.0
SpinBox{
property real factor: Math.pow(10, decimals)
id: spinbox
stepSize: realStepSize*factor
value: realValue*factor
to : realTo*factor
from : realFrom*factor
validator: DoubleValidator {
bottom: Math.min(spinbox.from, spinbox.to)*spinbox.factor
top: Math.max(spinbox.from, spinbox.to)*spinbox.factor
}
textFromValue: function(value, locale) {
return parseFloat(value*1.0/factor).toFixed(decimals);
}
}
}
Run Code Online (Sandbox Code Playgroud)
例子:
DoubleSpinBox{
realValue: 5.0
realStepSize: 0.01
}
Run Code Online (Sandbox Code Playgroud)
当前的 SpinBox(控件 2.0 - 2.4)有一个限制,因为它只接受一个to/from范围的 +/- 0x7FFF FFFF(它甚至不能处理无符号整数,顺便说一句)。对于reals 这有(可能是严重的)暗示,对于小数点后需要的每个数字,小数点前都会丢失一个数字。例如,如果您需要 6 位十进制精度,则最大可能值为2147.483647. 到目前为止,这会影响此答案中提出的两个解决方案。
如果您尝试设置to或from超出这些int限制(例如,通过乘以此处建议中的系数),您将获得非常“奇怪”的行为,这可能会令人困惑。如果您尝试直接超出这些限制(例如to: 0xFFFFFFFF),则会出现错误。
请参阅(并投票给 :))QTBUG-67349
我意识到这不是问题的答案,但希望它可以像我一样节省几个小时的挫败感。
到目前为止我能想出的唯一解决方法是简单地使用带有 DoubleValidator 的文本编辑字段。我将尝试用一个简化的例子回到这里。
编辑:
这是我的 DoubleSpinBox 版本(文档)。代码太长,无法粘贴在这里(恕我直言),我宁愿不维护多个版本。
简而言之,我们的想法是value完全绕过 SpinBox ,只使用基本的 Controls.2 SpinBox 作为按钮和整体外观/感觉。这意味着不需要为每个主题(Fusion/Material/等)进行定制。
不幸的是,这涉及重新实现所有事件处理程序(按钮按下/重复、滚轮滚动、文本编辑)和一些其他诡计。但是(到目前为止)我认为在尝试匹配所有不同主题的同时,使用自定义按钮/等从头开始重新实现整个事情。
它还添加了一些在标准 SpinBox 中不可用的选项......因为,为什么不呢?:)