Seite 1 von 1

[gelöst] Rausfinden ob ein Signal angeschlossen ist

Verfasst: 7. Juli 2009 14:36
von BartSimpson
Hallo,
ich habe folgendes Problem:
bevor ich ein emit abfeuere muss ich wissen,
ob das signal irgenwie angeschlossen ist.
Hintergrund:
Bei dem Aufruf von Emit wird ein Objekt auf dem Heap angelegt.
Um die Aufräumaktion kümmert sich der Slot.
Nun kann es u.U. sein, das es kein Slot gibt.
Dann darf das Signal nicht abgefeuert werden.
Nur wie bekommt man raus, ob jemand an das Signal angedockt hat?

Verfasst: 7. Juli 2009 14:45
von BartSimpson
Diesmal war ich selber schneller *lol*

Code: Alles auswählen

if (receivers(SIGNAL(XXXXX)) > 0)
        emit XXXXX(YYYYY);

Verfasst: 7. Juli 2009 15:01
von franzf
Find ich aber nicht ideal und erst recht nicht schön ;)
Mach es mit QSharedPointer! Ich nehme einfach mal an, es geht um Objekte, die per Signal/Slot ausgetauscht werden sollen. Falls nicht einfach genauer erzählen was du willst :)

objects.h

Code: Alles auswählen

#include <QObject>
#include <QSharedPointer>
#include <QDebug>

struct Data
{
    int value;
    Data(int val=0)
     : value(val)
    {
        qDebug() << "Create" << value;
    }
    ~Data()
    {
        qDebug() << "Destroy" << value;
    }
};

class Sender : public QObject
{
    Q_OBJECT
    signals:
        void send(QSharedPointer<Data>);
    public:
        void calc()
        {
            for( int i=0; i<10; i++ )
                emit send( QSharedPointer<Data>(new Data(i*10)) );
        }
};

class Reciever : public QObject
{
    Q_OBJECT
    public slots:
        void recieve(QSharedPointer<Data> p)
        {
            qDebug() << "Recieved" << p->value;
        }
};

main.cpp

Code: Alles auswählen

#include <QApplication>
#include "objects.h"

int main( int argc, char** argv )
{
    QApplication app( argc, argv );
    Sender   sen;
    Reciever rec;
    QObject::connect(&sen, SIGNAL(send(QSharedPointer<Data>)), &rec, SLOT(recieve(QSharedPointer<Data>)));
    sen.calc();
    return app.exec();
}

Ausgabe:

Code: Alles auswählen

Create 0                                     
Recieved 0                                   
Destroy 0                                    
Create 10                                    
Recieved 10                                  
Destroy 10                                   
Create 20                                    
Recieved 20                                  
Destroy 20                                   
Create 30                                    
Recieved 30                                  
Destroy 30                                   
Create 40                                    
Recieved 40                                  
Destroy 40                                   
Create 50                                    
Recieved 50                                  
Destroy 50                                   
Create 60
Recieved 60
Destroy 60
Create 70
Recieved 70
Destroy 70
Create 80
Recieved 80
Destroy 80
Create 90
Recieved 90
Destroy 90

Verfasst: 14. Juli 2009 08:31
von BartSimpson
Das könnte sogar gehen, mal testen.

Verfasst: 14. Juli 2009 09:24
von BartSimpson
Leider geht es im Konkreten Fall nicht, da im Header das Objekt blind als
class XXX deklariert ist.
aber QSharedPointer die Hader Datei von XXX bräuchte. Was im diesem Fall leider nicht geht.:(