Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

64 bit integers in QML

Tags:

qt

qt-quick

qml

How do I deal with 64 bit integers in QML? I know that useless Javascript can't handle them normally as it uses doubles for everything, and if I try to use them in a signal, everything gets set to undefined. Is there a way around this? Perhaps I have to use a QVariant or something?

like image 680
Timmmm Avatar asked May 21 '14 10:05

Timmmm


2 Answers

Create your own Integer64 class derived from QObject and give it the functions you need, like

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);
    // ...

where you use value() to get a string representation in QML and setValue() to set a value from a string representation.

An additional constructor can be used to efficiently create Integer64 from C++

public:
    explicit Integer64(QObject *parent = 0);
    explicit Integer64(qint64 value, QObject *parent);
    // ...

Then register the type to QML

qmlRegisterType<Integer64>("MyModules", 1, 0, "Integer64");
like image 77
Simon Warta Avatar answered Nov 18 '22 12:11

Simon Warta


If you do not need methods on your 64-bit object, use Q_GADGET to create a type that you can store in a QVariant:

struct Int64Data
{
    Q_GADGET
public:
    int64_t value;
};

Register using:

qRegisterMetaType<Int64Data>();

You can pass this type to QML:

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

You cannot manipulate it directly in QML, but you can pass to slots:

Q_INVOKABLE void dumpIndex(const QVariant idx) const {
    if (idx.canConvert<Int64Data>()) {
        auto data = qvariant_cast<Int64Data>(idx);
        qDebug() << "Index value:" << data.value;
    }
}
like image 41
pixelgrease Avatar answered Nov 18 '22 12:11

pixelgrease