首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在QML微调框中使用float

如何在QML微调框中使用float
EN

Stack Overflow用户
提问于 2017-04-14 15:06:01
回答 3查看 7.2K关注 0票数 3

我使用的是QML Spinbox,但我在其中使用浮点数时遇到了问题。如果我编写类似value: 5.0的代码,它将显示为5,因此将显示为整型而不是浮点型。

你知道该怎么做吗?

非常感谢,祝你有一个愉快的一天!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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
}

票数 8
EN

Stack Overflow用户

发布于 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");
}
票数 2
EN

Stack Overflow用户

发布于 2021-01-12 19:44:53

我在上面的代码中看到了两个问题。

如果显示一个类似1.299(句点)的数字,

  1. 你就会出错。DoubleSpinBox会显示1.2,而不是1.3,你应该这样写

值= Math.round(preview.value *因子)

在DoubleSpinBox.qml function setValue中(预览)

  1. 在这一行中,我们有覆盖绑定

doublespinbox.value =Number.fromLocaleString(区域设置,文本)

因为我们有“属性别名值: valuePreview.value”,可能'value‘会在代码中绑定一些值,所以你不能这样做,完全可以写成这样:

function(text, locale) {
        return Number.fromLocaleString(locale, text) * factor
}

  1. 我想我们也可以删除这一行

preview.value =值/因子

在函数setValue中(预览)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43406830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档