Seite 1 von 1
empfang aller (auch vorher) gesendeten signale bei connect?
Verfasst: 19. Mai 2008 18:07
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
Verfasst: 19. Mai 2008 18:20
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.
Verfasst: 19. Mai 2008 22:18
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
Verfasst: 22. Mai 2008 16:09
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
Verfasst: 22. Mai 2008 16:19
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.
Verfasst: 22. Mai 2008 16:30
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
Verfasst: 22. Mai 2008 16:43
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.
Verfasst: 22. Mai 2008 16:57
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
Verfasst: 22. Mai 2008 17:20
von Christian81
Zeige bitte den kompletten Code und lies dir ein C++-Buch durch

Verfasst: 27. Mai 2008 17:44
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