c – 如何在QML中创建Q_GADGET结构的新实例?

weixin_38058939 2019-09-12 11:09:02
我可以发出带有Q_GADGET标记结构的信号,从C到QML. 是否有可能将这样的结构从QML发送到C槽?我的代码在第一步失败:在QML中创建实例. 这段代码在第一行失败了…… 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结构,但我想将一个参数作为单个参数发送回一个插槽. 这是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中注册了这个类型: qRegisterMetaType<BatteryState>(); 建议?
...全文
96 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38064085 2019-09-12
  • 打赏
  • 举报
回复
您不在QML中创建Q_GADGET,QML对象需要是QObject派生的,并且不是通过new创建的 – 仅适用于JS对象.小工具只是生成元数据,以便您可以从QML访问其成员并传递,这就是它. Is it possible send such a struct from QML to a C++ slot? 可以发送,但不会在QML中创建.它可以从C函数返回到QML,或者作为某个对象的属性公开. 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 }

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧