QML中的64位整数

Tim*_*mmm 5 qt qml qt-quick

如何处理QML中的64位整数?我知道,无用的Javascript无法正常处理它们,因为它对所有内容都使用double。如果我尝试在信号中使用它们,则所有内容都设置为undefined。有没有解决的办法?也许我必须使用a QVariant或其他东西?

Sim*_*rta 5

创建您自己的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);
    // ...
Run Code Online (Sandbox Code Playgroud)

其中使用 value() 获取 QML 中的字符串表示形式,并使用 setValue() 从字符串表示形式设置值。

可以使用附加构造函数Integer64从 C++高效创建

public:
    explicit Integer64(QObject *parent = 0);
    explicit Integer64(qint64 value, QObject *parent);
    // ...
Run Code Online (Sandbox Code Playgroud)

然后将类型注册到QML

qmlRegisterType<Integer64>("MyModules", 1, 0, "Integer64");
Run Code Online (Sandbox Code Playgroud)


pix*_*ase 5

如果您不需要 64 位对象上的方法,请使用Q_GADGET创建可以存储在 QVariant 中的类型:

struct Int64Data
{
    Q_GADGET
public:
    int64_t value;
};
Run Code Online (Sandbox Code Playgroud)

注册使用:

qRegisterMetaType<Int64Data>();
Run Code Online (Sandbox Code Playgroud)

您可以将此类型传递给 QML:

Q_INVOKABLE QVariant getMax() {
    Int64Data idx;
    idx.value = INT64_MAX;
    return QVariant::fromValue(idx);
}
Run Code Online (Sandbox Code Playgroud)

你不能直接在 QML 中操作它,但你可以传递给插槽:

Q_INVOKABLE void dumpIndex(const QVariant idx) const {
    if (idx.canConvert<Int64Data>()) {
        auto data = qvariant_cast<Int64Data>(idx);
        qDebug() << "Index value:" << data.value;
    }
}
Run Code Online (Sandbox Code Playgroud)