如何处理QML中的64位整数?我知道,无用的Javascript无法正常处理它们,因为它对所有内容都使用double。如果我尝试在信号中使用它们,则所有内容都设置为undefined。有没有解决的办法?也许我必须使用a QVariant或其他东西?
创建您自己的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)
如果您不需要 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)
| 归档时间: |
|
| 查看次数: |
2723 次 |
| 最近记录: |