我使用的是QML Spinbox,但我在其中使用浮点数时遇到了问题。如果我编写类似value: 5.0
的代码,它将显示为5
,因此将显示为整型而不是浮点型。
你知道该怎么做吗?
非常感谢,祝你有一个愉快的一天!
发布于 2017-04-14 16:08:20
您可以创建自定义文本的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);
}
}
}
示例:
DoubleSpinBox{
realValue: 5.0
realStepSize: 0.01
}
发布于 2017-12-06 08:35:50
这是@eyllanesc的修复版本。所有其他缺少的属性都必须具有别名。请报告我的错误,如果你发现。
DoubleSpinBox.qml
import QtQuick 2.0
import QtQuick.Controls 2.2
import QmlUtils 1.0
Item
{
id: doublespinbox
width: 140
height: 40
property int decimals: 1
property alias value: valuePreview.value
property real from: 0
property real to: 99
property real stepSize: 1
property alias editable: spinbox.editable
property alias font: spinbox.font
SpinBox
{
id: spinbox
property bool init: false
property real factor: Math.pow(10, decimals)
function setValue(preview)
{
init = true
value = preview.value * factor
init = false
preview.value = value / factor
}
DoubleValuePreview
{
id: valuePreview
onValuePreview: spinbox.setValue(preview)
}
anchors.fill: parent
editable: true
stepSize: doublespinbox.stepSize * factor
to : doublespinbox.to * factor
from : doublespinbox.from * factor
onValueChanged:
{
if (init)
return
valuePreview.setValueDirect(value / factor)
}
validator: DoubleValidator
{
bottom: Math.min(spinbox.from, spinbox.to)
top: Math.max(spinbox.from, spinbox.to)
}
textFromValue: function(value, locale)
{
return Number(value / factor).toLocaleString(locale, 'f', doublespinbox.decimals)
}
valueFromText: function(text, locale)
{
doublespinbox.value = Number.fromLocaleString(locale, text)
return doublespinbox.value * factor
}
}
}
QmlValuePreview.h
#pragma once
#include <qobject.h>
#include <qqmlengine.h>
class QDoubleValueArg : public QObject
{
Q_OBJECT
public:
QDoubleValueArg(double value) : Value(value)
{
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
}
public:
Q_PROPERTY(double value MEMBER Value)
public:
double Value;
};
class QmlDoubleValuePreview : public QObject
{
Q_OBJECT
public:
using QObject::QObject;
public:
Q_PROPERTY(double value READ getValue WRITE setValue NOTIFY valueChanged)
public:
Q_INVOKABLE void setValueDirect(double value)
{
if (m_value == value)
return;
m_value = value;
emit valueChanged();
}
public:
inline double getValue() const { return m_value; }
inline void setValue(double value)
{
if (m_value == value)
return;
QDoubleValueArg arg(value);
emit valuePreview(&arg);
if (m_value == arg.Value)
return;
m_value = arg.Value;
emit valueChanged();
}
signals:
void valueChanged();
void valuePreview(QDoubleValueArg *preview);
private:
double m_value = 0;
};
注册地址:
#define URI "QmlUtils"
#define VERSION_MAJOR 1
#define VERSION_MINOR 0
void registerTypes()
{
qRegisterMetaType<QDoubleValueArg *>("QDoubleValueArg *");
qmlRegisterType<QmlDoubleValuePreview>(URI, VERSION_MAJOR, VERSION_MINOR, "DoubleValuePreview");
}
发布于 2021-01-12 19:44:53
我在上面的代码中看到了两个问题。
如果显示一个类似1.299(句点)的数字,
值= Math.round(preview.value *因子)
在DoubleSpinBox.qml function setValue中(预览)
doublespinbox.value =Number.fromLocaleString(区域设置,文本)
因为我们有“属性别名值: valuePreview.value”,可能'value‘会在代码中绑定一些值,所以你不能这样做,完全可以写成这样:
function(text, locale) {
return Number.fromLocaleString(locale, text) * factor
}
preview.value =值/因子
在函数setValue中(预览)
https://stackoverflow.com/questions/43406830
复制相似问题