diff --git a/lib/include/DOtherSide/DOtherSideTypes.h b/lib/include/DOtherSide/DOtherSideTypes.h index 3cd00df..b413bd5 100644 --- a/lib/include/DOtherSide/DOtherSideTypes.h +++ b/lib/include/DOtherSide/DOtherSideTypes.h @@ -25,7 +25,7 @@ typedef void(*SetDataCallback) (void *model, const void *index, const void *valu typedef void(*RoleNamesCallback)(void *model, QHashIntQByteArrayVoidPtr result); typedef void(*FlagsCallback) (void *model, const void *index, int *result); typedef void(*HeaderDataCallback) (void *model, int section, int orientation, int role, QVariantVoidPtr result); -typedef void(*CreateDObject)(int, void **, void **); +typedef void(*CreateDObject)(int, void*, void **, void **); typedef void(*DeleteDObject)(int, void *); struct QmlRegisterType { diff --git a/lib/include/DOtherSide/DosIQObjectImpl.h b/lib/include/DOtherSide/DosIQObjectImpl.h index 5e1f2a6..d90a9c5 100644 --- a/lib/include/DOtherSide/DosIQObjectImpl.h +++ b/lib/include/DOtherSide/DosIQObjectImpl.h @@ -11,7 +11,7 @@ public: virtual ~DosIQObjectImpl() = default; /// Emit the signal with the given name and arguments - virtual bool emitSignal(const QString &name, const std::vector &argumentsValues) = 0; + virtual bool emitSignal(QObject* emitter, const QString &name, const std::vector &argumentsValues) = 0; /// Return the metaObject virtual const QMetaObject *metaObject() const = 0; diff --git a/lib/include/DOtherSide/DosQAbstractListModel.h b/lib/include/DOtherSide/DosQAbstractListModel.h index 2f03d0d..07c19d0 100644 --- a/lib/include/DOtherSide/DosQAbstractListModel.h +++ b/lib/include/DOtherSide/DosQAbstractListModel.h @@ -25,7 +25,7 @@ public: HeaderDataCallback headerDataCallback); /// @see IDynamicQObject::emitSignal - bool emitSignal(const QString &name, const std::vector &argumentsValues) override; + bool emitSignal(QObject* emitter, const QString &name, const std::vector &argumentsValues) override; /// @see QAbstractListModel::metaObject() const QMetaObject *metaObject() const override; diff --git a/lib/include/DOtherSide/DosQObject.h b/lib/include/DOtherSide/DosQObject.h index eca6caa..9943982 100644 --- a/lib/include/DOtherSide/DosQObject.h +++ b/lib/include/DOtherSide/DosQObject.h @@ -18,7 +18,7 @@ public: OnSlotExecuted onSlotExecuted); /// Emit a signal - bool emitSignal(const QString &name, const std::vector &arguments) override; + bool emitSignal(QObject* emitter, const QString &name, const std::vector &arguments) override; /// Return the metaObject const QMetaObject *metaObject() const override; diff --git a/lib/include/DOtherSide/DosQObjectImpl.h b/lib/include/DOtherSide/DosQObjectImpl.h index 064e959..8c000a3 100644 --- a/lib/include/DOtherSide/DosQObjectImpl.h +++ b/lib/include/DOtherSide/DosQObjectImpl.h @@ -27,7 +27,7 @@ public: /// @see IDosQObject::emitSignal - bool emitSignal(const QString &name, const std::vector &arguments) override; + bool emitSignal(QObject* emitter, const QString &name, const std::vector &arguments) override; /// @see IDosQObject::metaObject() const QMetaObject *metaObject() const override; diff --git a/lib/src/DOtherSide.cpp b/lib/src/DOtherSide.cpp index 5ceba3b..aec46a5 100644 --- a/lib/src/DOtherSide.cpp +++ b/lib/src/DOtherSide.cpp @@ -359,7 +359,7 @@ void dos_qobject_signal_emit(void *vptr, const char *name, int parametersCount, auto transformation = [](void *vptr)->QVariant{return *(static_cast(vptr));}; const std::vector variants = toVector(parameters, parametersCount, transformation); - dynamicQObject->emitSignal(QString::fromStdString(name), variants); + dynamicQObject->emitSignal(qobject, QString::fromStdString(name), variants); } void dos_qobject_signal_connect(void *senderVPtr, diff --git a/lib/src/DosQAbstractListModel.cpp b/lib/src/DosQAbstractListModel.cpp index 9a81929..da03db2 100644 --- a/lib/src/DosQAbstractListModel.cpp +++ b/lib/src/DosQAbstractListModel.cpp @@ -34,10 +34,10 @@ DosQAbstractListModel::DosQAbstractListModel(void *modelObject, { } -bool DosQAbstractListModel::emitSignal(const QString &name, const std::vector &argumentsValues) +bool DosQAbstractListModel::emitSignal(QObject *emitter, const QString &name, const std::vector &argumentsValues) { Q_ASSERT(m_impl); - return m_impl->emitSignal(name, argumentsValues); + return m_impl->emitSignal(emitter, name, argumentsValues); } const QMetaObject *DosQAbstractListModel::metaObject() const diff --git a/lib/src/DosQObject.cpp b/lib/src/DosQObject.cpp index de719f9..6ca2180 100644 --- a/lib/src/DosQObject.cpp +++ b/lib/src/DosQObject.cpp @@ -17,10 +17,10 @@ DosQObject::DosQObject(DosIQMetaObjectPtr metaObject, OnSlotExecuted onSlotExecu : m_impl(new DosQObjectImpl(this, ::createParentMetaCall(this), std::move(metaObject), std::move(onSlotExecuted))) {} -bool DosQObject::emitSignal(const QString &name, const std::vector &args) +bool DosQObject::emitSignal(QObject *emitter, const QString &name, const std::vector &args) { Q_ASSERT(m_impl); - return m_impl->emitSignal(name, args); + return m_impl->emitSignal(emitter, name, args); } const QMetaObject *DosQObject::metaObject() const diff --git a/lib/src/DosQObjectImpl.cpp b/lib/src/DosQObjectImpl.cpp index 4462a1f..f8217df 100644 --- a/lib/src/DosQObjectImpl.cpp +++ b/lib/src/DosQObjectImpl.cpp @@ -17,7 +17,7 @@ DosQObjectImpl::DosQObjectImpl(QObject *parent, { } -bool DosQObjectImpl::emitSignal(const QString &name, const std::vector &args) +bool DosQObjectImpl::emitSignal(QObject *emitter, const QString &name, const std::vector &args) { const QMetaMethod method = m_metaObject->signal(name); if (!method.isValid()) @@ -28,7 +28,7 @@ bool DosQObjectImpl::emitSignal(const QString &name, const std::vector std::vector arguments(args.size(), nullptr); auto func = [](const QVariant & arg) -> void * { return (void *)(&arg); }; std::transform(args.begin(), args.end(), arguments.begin(), func); - QMetaObject::activate(m_parent, method.methodIndex(), arguments.data()); + QMetaObject::activate(emitter, method.methodIndex(), arguments.data()); return true; } diff --git a/lib/src/DosQObjectWrapper.cpp b/lib/src/DosQObjectWrapper.cpp index 3842792..73567c9 100644 --- a/lib/src/DosQObjectWrapper.cpp +++ b/lib/src/DosQObjectWrapper.cpp @@ -8,17 +8,26 @@ namespace DOS { template -class DosQObjectWrapper : public QObject +class DosQObjectWrapper : public QObject, public DosIQObjectImpl { public: static const QMetaObject staticMetaObject; + /// Constructor DosQObjectWrapper(QObject *parent = nullptr); + + /// Destructor ~DosQObjectWrapper(); + /// @see DosIQObjectImpl::metaObject const QMetaObject *metaObject() const override; + + /// @see DosIQObjectImpl::qt_metacall int qt_metacall(QMetaObject::Call, int, void **) override; + /// @see DosIQObjectImpl::emitSignal + bool emitSignal(QObject* emitter, const QString &name, const std::vector &argumentsValues); + static const QmlRegisterType &qmlRegisterType(); static void setQmlRegisterType(QmlRegisterType data); static void setStaticMetaObject(const QMetaObject &metaObject); @@ -26,7 +35,7 @@ public: private: void *m_dObject; - DosQObject *m_impl; + DosIQObjectImpl *m_impl; static int m_id; static QmlRegisterType m_data; }; @@ -47,8 +56,8 @@ DosQObjectWrapper::DosQObjectWrapper(QObject *parent) , m_impl(nullptr) { void *impl = nullptr; - m_data.createDObject(m_id, &m_dObject, &impl); - m_impl = static_cast(impl); + m_data.createDObject(m_id, static_cast(this), &m_dObject, &impl); + m_impl = dynamic_cast(static_cast(impl)); Q_ASSERT(m_dObject); Q_ASSERT(m_impl); } @@ -58,6 +67,7 @@ DosQObjectWrapper::~DosQObjectWrapper() { m_data.deleteDObject(m_id, m_dObject); m_dObject = nullptr; + delete dynamic_cast(m_impl); m_impl = nullptr; } @@ -75,6 +85,13 @@ int DosQObjectWrapper::qt_metacall(QMetaObject::Call call, int index, void return m_impl->qt_metacall(call, index, args); } +template +bool DosQObjectWrapper::emitSignal(QObject* emitter, const QString &name, const std::vector &argumentsValues) +{ + Q_ASSERT(m_impl); + return m_impl->emitSignal(this, name, argumentsValues); +} + template void DosQObjectWrapper::setQmlRegisterType(QmlRegisterType data) {