我该如何在QML中处理64位整数?我知道无用的JavaScript不能正常处理它们,因为它对所有内容都使用双精度浮点数,如果我试图在信号中使用它们,一切都会被设置为undefined
。有没有什么解决办法?也许我需要使用QVariant
或其他东西?
创建你自己的继承自 QObject
的 Integer64
类,并添加所需函数,例如:
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);
// ...
在QML中,您可以使用value()获取字符串表示形式,使用setValue()从字符串表示形式设置值。
还可以使用额外的构造函数从C ++高效地创建Integer64
。
public:
explicit Integer64(QObject *parent = 0);
explicit Integer64(qint64 value, QObject *parent);
// ...
然后将该类型注册到QML
qmlRegisterType<Integer64>("MyModules", 1, 0, "Integer64");
如果您的64位对象不需要方法,请使用 Q_GADGET
创建一种类型,以便可以将其存储在QVariant中:
struct Int64Data
{
Q_GADGET
public:
int64_t value;
};
使用以下方式进行注册:
qRegisterMetaType<Int64Data>();
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;
}
}