QML中的64位整数

6

我该如何在QML中处理64位整数?我知道无用的JavaScript不能正常处理它们,因为它对所有内容都使用双精度浮点数,如果我试图在信号中使用它们,一切都会被设置为undefined。有没有什么解决办法?也许我需要使用QVariant或其他东西?

2个回答

5

创建你自己的继承自 QObjectInteger64 类,并添加所需函数,例如:

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");

Integer64 是 QObject 派生的,然而您在函数中将 Integer64 作为值传递。 - dtech
1
QObject的设计是不可复制的。尝试按值传递一个QObject会导致编译时错误。由于它无法被复制,所有子类都受到相同的限制。 - dtech
谢谢。有什么想法如何解决这个问题吗?我刚发现“请注意,所有在QML类型系统中注册的C++类型必须派生自QObject,即使它们是不可实例化的。” - Simon Warta
1
只需使用指针,QML对象的引用在C++端被视为指针。 - dtech
1
此外,当您将一个对象“return”到QML时,它也会以指针的形式返回。 - dtech

5

如果您的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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接