QML スピンボックスを使用していますが、フロートを使用するのに問題があります。のように書くvalue: 5.0
と と表示される5
ので、float ではなく int として表示されます。
続行する方法について何か考えはありますか?
どうもありがとうございました。良い一日を!
これは @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");
}