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