empfang aller (auch vorher) gesendeten signale bei connect?

Alles rund um die Programmierung mit Qt
Antworten
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

empfang aller (auch vorher) gesendeten signale bei connect?

Beitrag von -=Freaky=- »

hi,

ich wundere mich gerade, wie sich das mit dem senden und empfangen von signalen verhaelt.

wenn ein objekt signale (dasselbe signal mehrmals) versendet (emit ...) oder zumindest versenden sollte, aber kein slot mit diesem signal verbunden ist, und _danach_ ein slot mit diesem signal verbunden wird, wird dieser slot dann so oft ausgefuehrt, wie vorher signale versendet wurden, sprich werden alle vorher versendeten signale nachtraeglich empfangen?

// edit: gekuerzt

mfg,
julian
Zuletzt geändert von -=Freaky=- am 22. Mai 2008 15:55, insgesamt 1-mal geändert.
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Wenn ein Signal gesendet wird und es keinen verbundenen Slot gibt, dann wird das Signal einfach verworfen. Wäre sonst auch völlig unlogisch.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

danke, hab ich auch eben gelesen.
und sorry, der thread sollte gar nicht offen sein, ist, wie man sieht, auch vollkommen unfertig. das war ein versehen, habs jetzt erst bemerkt

mfg,
julian
Zuletzt geändert von -=Freaky=- am 22. Mai 2008 16:10, insgesamt 1-mal geändert.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ok nochmal zu dem thema:
ich habe jetzt eine QList< Element > m_elements und eine methode

Code: Alles auswählen

void myClass::add()
{
  m_elements.push_back( Element() );
  qSort( m_elements );
  QList< Element >::iterator it = m_elements.end() - 1;
  Element &elemRef = *it;
  connect( &elemRef, SIGNAL( changed() ), this, SLOT( elemChanged() ) );
}

void myClass::elemChanged()
{
  emit elementDataChanged();
}
nun fuehre ich zum testen das hier aus:

Code: Alles auswählen

myClass myclass;
myclass.add();
// ein paar methoden testen, alles klappt wunderbar, es sind nun 3 elemente in m_elements
QSignalSpy spyChange( &myclass, SIGNAL( elementDataChanged() ) );
QVERIFY( spyChange.count() == 0 );
myclass.add();
qDebug() << "spyChange.count() after add():" << spyChange.count();
myclass[ 0 ].setSomeValue( 1234 ); // erst hier sollte ein signal gesendet werden, und das wird es auch
qDebug() << "spyChange.count() after changing element:" << spyChange.count();
als ausgabe bekomme ich:

Code: Alles auswählen

********* Start testing of MyClassTest *********
Config: Using QTest library 4.3.4, Qt 4.3.4
PASS   : MyClassTest::initTestCase()
PASS   : MyClassTest::testElement()
QDEBUG : MyClassTest::testmyClass() spyChange.count() after add():  5 
QDEBUG : MyClassTest::testmyClass() spyChange.count() after changing element:  6 
PASS   : MyClassTest::testmyClass()
PASS   : MyClassTest::cleanupTestCase()
Totals: 4 passed, 0 failed, 0 skipped // klar, ohne QVERIFY() am ende ...
********* Finished testing of MyClassTest *********
und das verstehe ich nicht, dass da auf einmal 5 signale sein sollen, obwohl mit den elementen absolut nichts angestellt wird....

kann sich das jemand erklaeren? muss ich an anderer stelle im code suchen?

mfg,
julian
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Von welchen Typ ist 'Element' bzw. wann wird dort changed() aufgerufen?

Was mich wundert ist - Element ist ja auf alle Fälle von QObject abgeleitet - wieso geht dann QList<ELement> ? Ich glaube nicht das dein Code so kompiliert.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

doch, das ganze kompiliert 100%ig :)
(qt-4.3.4, gcc 4.1.1-r3, gentoo linux)

Element ist eine von QObject abgeleitete klasse mit lediglich ein paar double-werten als member.
fuer diese gibt es set-methoden, in welchen dann changed() emitted wird.

mfg,
julian
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Es kann nicht gehen - es wird ein Element kopiert, also auch der copy-ctor von QObject aufgerufen. Und dieser ist (aus gutem Grund) private.
Wenn es geht dann wohl nur weil der Compiler das Kopieren des Objektes wegoptimiert hat. Aber allgemein geht es nicht. Ich glaube auch das deswegen eine 5 dort auftaucht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

achso - mist.
die zeile "m_element.push_back( ... )" sieht anders aus eigentlich. sorry, hatte ich im affekt nicht dran gedacht.

Code: Alles auswählen

void myClass::add( const double &a, const double &b )
{
  Element elem( a, b );
  m_elements.push_back( elem );
  qSort( m_elements );
  QList< Element >::iterator it = m_elements.end() - 1;
  Element &elemRef = *it;
  connect( &elemRef, SIGNAL( changed() ), this, SLOT( elemChanged() ) );
}
so ist es im originalcode ... tut mir leid

// edit: ich hab es gerade mal probiert, m_elements.push_back( Element() ) kompiliert genauso ...

mfg,
julian
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Zeige bitte den kompletten Code und lies dir ein C++-Buch durch :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

danke fuer den vorschlag, ich hab davon aber schon mehrere gelesen ...

der fehler lag btw. _ganz_ woanders und ist nun geloest, danke fuer die hilfsversuche!

mfg,
julian
Antworten