Possible Fix 2 by swapping the qobject

This commit is contained in:
Filippo Cucchetto 2016-02-27 18:10:07 +01:00
parent 7f1f91a71e
commit c271423009
10 changed files with 33 additions and 16 deletions

View File

@ -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 {

View File

@ -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<QVariant> &argumentsValues) = 0;
virtual bool emitSignal(QObject* emitter, const QString &name, const std::vector<QVariant> &argumentsValues) = 0;
/// Return the metaObject
virtual const QMetaObject *metaObject() const = 0;

View File

@ -25,7 +25,7 @@ public:
HeaderDataCallback headerDataCallback);
/// @see IDynamicQObject::emitSignal
bool emitSignal(const QString &name, const std::vector<QVariant> &argumentsValues) override;
bool emitSignal(QObject* emitter, const QString &name, const std::vector<QVariant> &argumentsValues) override;
/// @see QAbstractListModel::metaObject()
const QMetaObject *metaObject() const override;

View File

@ -18,7 +18,7 @@ public:
OnSlotExecuted onSlotExecuted);
/// Emit a signal
bool emitSignal(const QString &name, const std::vector<QVariant> &arguments) override;
bool emitSignal(QObject* emitter, const QString &name, const std::vector<QVariant> &arguments) override;
/// Return the metaObject
const QMetaObject *metaObject() const override;

View File

@ -27,7 +27,7 @@ public:
/// @see IDosQObject::emitSignal
bool emitSignal(const QString &name, const std::vector<QVariant> &arguments) override;
bool emitSignal(QObject* emitter, const QString &name, const std::vector<QVariant> &arguments) override;
/// @see IDosQObject::metaObject()
const QMetaObject *metaObject() const override;

View File

@ -359,7 +359,7 @@ void dos_qobject_signal_emit(void *vptr, const char *name, int parametersCount,
auto transformation = [](void *vptr)->QVariant{return *(static_cast<QVariant *>(vptr));};
const std::vector<QVariant> 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,

View File

@ -34,10 +34,10 @@ DosQAbstractListModel::DosQAbstractListModel(void *modelObject,
{
}
bool DosQAbstractListModel::emitSignal(const QString &name, const std::vector<QVariant> &argumentsValues)
bool DosQAbstractListModel::emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &argumentsValues)
{
Q_ASSERT(m_impl);
return m_impl->emitSignal(name, argumentsValues);
return m_impl->emitSignal(emitter, name, argumentsValues);
}
const QMetaObject *DosQAbstractListModel::metaObject() const

View File

@ -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<QVariant> &args)
bool DosQObject::emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &args)
{
Q_ASSERT(m_impl);
return m_impl->emitSignal(name, args);
return m_impl->emitSignal(emitter, name, args);
}
const QMetaObject *DosQObject::metaObject() const

View File

@ -17,7 +17,7 @@ DosQObjectImpl::DosQObjectImpl(QObject *parent,
{
}
bool DosQObjectImpl::emitSignal(const QString &name, const std::vector<QVariant> &args)
bool DosQObjectImpl::emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &args)
{
const QMetaMethod method = m_metaObject->signal(name);
if (!method.isValid())
@ -28,7 +28,7 @@ bool DosQObjectImpl::emitSignal(const QString &name, const std::vector<QVariant>
std::vector<void *> 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;
}

View File

@ -8,17 +8,26 @@
namespace DOS {
template<int, int>
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<QVariant> &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<N, M>::DosQObjectWrapper(QObject *parent)
, m_impl(nullptr)
{
void *impl = nullptr;
m_data.createDObject(m_id, &m_dObject, &impl);
m_impl = static_cast<DosQObject *>(impl);
m_data.createDObject(m_id, static_cast<QObject*>(this), &m_dObject, &impl);
m_impl = dynamic_cast<DosIQObjectImpl *>(static_cast<QObject*>(impl));
Q_ASSERT(m_dObject);
Q_ASSERT(m_impl);
}
@ -58,6 +67,7 @@ DosQObjectWrapper<N, M>::~DosQObjectWrapper()
{
m_data.deleteDObject(m_id, m_dObject);
m_dObject = nullptr;
delete dynamic_cast<QObject*>(m_impl);
m_impl = nullptr;
}
@ -75,6 +85,13 @@ int DosQObjectWrapper<N, M>::qt_metacall(QMetaObject::Call call, int index, void
return m_impl->qt_metacall(call, index, args);
}
template<int N, int M>
bool DosQObjectWrapper<N, M>::emitSignal(QObject* emitter, const QString &name, const std::vector<QVariant> &argumentsValues)
{
Q_ASSERT(m_impl);
return m_impl->emitSignal(this, name, argumentsValues);
}
template<int N, int M>
void DosQObjectWrapper<N, M>::setQmlRegisterType(QmlRegisterType data)
{