QML中的64位整数

时间:2014-05-21 10:51:26

标签: qt qml qt-quick

如何在QML中处理64位整数?我知道无用的Javascript无法正常处理它们,因为它会对所有内容使用双打,如果我尝试在信号中使用它们,则所有内容都设置为undefined。有没有解决的办法?也许我必须使用QVariant或其他东西?

3 个答案:

答案 0 :(得分:3)

创建自己的Integer64类派生自QObject并为其提供所需的功能,例如

class Integer64 : public QObject
{
    Q_OBJECT

public:
    // ...
    Q_PROPERTY(QString value READ value WRITE setValue NOTIFY valueChanged)
    QString value() const;
    void setValue(QString value);

    Q_INVOKABLE void add(Integer64 * other);
    Q_INVOKABLE void subtract(Integer64 * other);
    Q_INVOKABLE void multiply(Integer64 * other);
    Q_INVOKABLE void divide(Integer64 * other);
    // ...

使用value()在QML中获取字符串表示,使用setValue()从字符串表示中设置值。

可以使用其他构造函数从C ++

高效地创建Integer64
public:
    explicit Integer64(QObject *parent = 0);
    explicit Integer64(qint64 value, QObject *parent);
    // ...

然后将类型注册到QML

qmlRegisterType<Integer64>("MyModules", 1, 0, "Integer64");

答案 1 :(得分:2)

如果您不需要64位对象上的方法,请使用Q_GADGET创建一个可以存储在QVariant中的类型:

struct Int64Data
{
    Q_GADGET
public:
    int64_t value;
};

使用注册:

qRegisterMetaType<Int64Data>();

您可以将此类型传递给QML:

Q_INVOKABLE QVariant getMax() {
    Int64Data idx;
    idx.value = INT64_MAX;
    return QVariant::fromValue(idx);
}

您无法在QML中直接操作它,但您可以传递到插槽:

Q_INVOKABLE void dumpIndex(const QVariant idx) const {
    if (idx.canConvert<Int64Data>()) {
        auto data = qvariant_cast<Int64Data>(idx);
        qDebug() << "Index value:" << data.value;
    }
}

答案 2 :(得分:-1)

您可以包含qglobal.h并使用qint64 / quint64或qlonglong / qulonglong,它们分别是long long int和unsigned long long int的typedef。这些都被QML引擎识别。但是,创建自己的typedef或显式使用long long似乎不起作用。