[gelöst] Rausfinden ob ein Signal angeschlossen ist

Alles rund um die Programmierung mit Qt
Antworten
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

[gelöst] Rausfinden ob ein Signal angeschlossen ist

Beitrag 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?
Zuletzt geändert von BartSimpson am 7. Juli 2009 14:45, insgesamt 2-mal geändert.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Diesmal war ich selber schneller *lol*

Code: Alles auswählen

if (receivers(SIGNAL(XXXXX)) > 0)
        emit XXXXX(YYYYY);
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Das könnte sogar gehen, mal testen.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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.:(
Antworten