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?
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");
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;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With