Bonjour,
Dans votre fonction, call, le device est détruit à la fin de la fonction,
Le signal signalWithoutPointer ne peut pas marcher car cela demanderai un copy de l'objet Device mais il s'agit d'un QObject ou le constructeur par copy est désactivé.
Le passage d'un pointeur vers Device, ben, la moment juste après le pointeur est null.
Le passage avec signal sur pointeur "pointer", lui il marche mais c'est la responsabilité de la classe connection de détruire pointer (et donc de garder une variable dessus).
Le plus simple c'est de faire un retour de fonction si vous voulez vous simplifiez la vie.
// in Connection.cpp
Device* Connection::call()
{
return new Device("Pointeur");
}
//main.qml (à la place de la Connections)
property Device device: Connection.call()
Dans ce cadre cas là, par passage par pointer via un retour de fonction, l'objet appartiendra au QML et sera détruit par le QML Engine.
Cependant, je recommande plutot de passer par une propriété.
// in connection.h
// je suggère de renommer cette classe en ConnectionController (pour éviter la confusion avec le type qml Connections
class Connection : public QObject
{
Q_OBJECT
Q_PROPERTY(Device* device READ device CONSTANT)
public:
explicit Connection(QObject *parent = nullptr);
Device* device() const;
private:
std::unique_ptr<Device> m_device;
};
// in connection.cpp
Connection::Connection(QObject *parent) : QObject(parent), m_device(new Device("Pointeur"){}
Device* Device::device() const
{
return m_device.get();
}
// main.qml
property Device device: Connection.device
Ici le device reste la responsabilité de la classe Connection, mais c'est géré par le uinique_ptr.
Si le device peut changer, il conviendra d'ajouter un signal deviceChanged et de supprimer le CONSTANT de la Q_PROPERTY pour y mettre un "NOTIFY deviceChanged".