如何在QML中创建Q_GADGET结构的新实例? [英] How to create new instance of a Q_GADGET struct in QML?

查看:128
本文介绍了如何在QML中创建Q_GADGET结构的新实例?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以从C ++到QML发出带有Q_GADGET标签的结构的信号.

I can emit signals with structs tagged with Q_GADGET from C++ to QML.

是否可以将这样的结构从QML发送到C ++插槽?我的代码第一步失败:在QML中创建实例.

Is it possible send such a struct from QML to a C++ slot? My code fails on the first step: creating an instance in QML.

此代码在第一行失败...

This code fails on the first line ...

var bs = new BatteryState()
bs.percentRemaining = 1.0
bs.chargeDate = new Date()
DataProvider.setBatteryState(bs)

...有错误:

qrc:///main.qml:34: ReferenceError: BatteryState is not defined

我可以从C ++到QML发出BatteryStatus结构,但是我想将其作为单个参数发送回插槽.

I can emit a BatteryStatus struct from C++ to QML, but I would like to send one back as a single parameter to a slot.

这是BatteryState.h&BatteryState.cpp:

Here is BatteryState.h & BatteryState.cpp:

// BatteryState.h
#pragma once

#include <QDate>
#include <QMetaType>

struct BatteryState
{
    Q_GADGET
    Q_PROPERTY(float percentRemaining  MEMBER percentRemaining)
    Q_PROPERTY(QDate date              MEMBER date)

public:
    explicit BatteryState();
    BatteryState(const BatteryState& other);
    virtual ~BatteryState();
    BatteryState& operator=(const BatteryState& other);
    bool operator!=(const BatteryState& other) const;
    bool operator==(const BatteryState& other) const;

    float percentRemaining;
    QDate date;
};
Q_DECLARE_METATYPE(BatteryState)

// BatteryState.cpp
#include "BatteryState.h"

BatteryState::BatteryState()
    : percentRemaining(), date(QDate::currentDate())
{}

BatteryState::BatteryState(const BatteryState& other)
    : percentRemaining(other.percentRemaining),
      date(other.date)
{}

BatteryState::~BatteryState() {}

BatteryState&BatteryState::operator=(const BatteryState& other)
{
    percentRemaining = other.percentRemaining;
    date = other.date;
    return *this;
}

bool BatteryState::operator!=(const BatteryState& other) const {
    return (percentRemaining != other.percentRemaining
            || date != other.date);
}

bool BatteryState::operator==(const BatteryState& other) const {
    return !(*this != other);
}

我在main.cpp中注册了这种类型:

I register this type in main.cpp:

qRegisterMetaType<BatteryState>();

建议?

推荐答案

您没有在QML中创建 Q_GADGET ,QML对象需要由 QObject 派生,并且是不是不是通过 new 创建的-仅适用于JS对象.小工具只是生成元数据,这样您就可以从QML访问其成员等,并且就此进行传递.

You don't create Q_GADGETs in QML, QML objects need to be QObject derived, and are not created via new - that's for JS objects only. Gadgets just generate meta data so that you can access their members and such from QML and pass around, that's about it.

是否可以将这样的结构从QML发送到C ++插槽?

Is it possible send such a struct from QML to a C++ slot?

可以发送,但是不能在QML中创建.它可以从C ++函数返回给QML,也可以作为某些对象的属性公开.

It is possible to send, but it would not be created in QML. It could be returned to QML from a C++ function or be exposed as a property of some object.

struct Test {
    Q_GADGET
    Q_PROPERTY(int test MEMBER test)
  public:
    Test() : test(qrand()) {}
    int test;
    Q_SLOT void foo() { qDebug() << "foo"; }
};

class F : public QObject { // factory exposed as context property F
    Q_OBJECT
  public slots:
    Test create() { return Test(); }
    void use(Test t) { qDebug() << t.test; }
};


    // from QML
    property var tt: F.create()

    Component.onCompleted: {
      F.use(F.create()) // works
      var t = F.create()
      console.log(t.test) // works
      F.use(t) // works
      console.log(tt.test) // works
      F.use(tt) // works
      tt.test = 555
      F.use(tt) // works
      t.test = 666
      F.use(t) // works
      t.foo() // works
    }

这篇关于如何在QML中创建Q_GADGET结构的新实例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆