Hallo, sehe ich es richtig dass ich in Qt von einer als const deklarierten Memberfunktion kein Signal mit "emit" senden kann? Wenn ich das Signal als nicht-const deklariere kommt sowas: src/smartcard/memorycard.cpp:423: error: passing `const MemoryCard' as `this' argument of `void MemoryCard::progressed(int, int)' discards qualifiers src/smartcard/memorycard.cpp:462: error: passing `const MemoryCard' as `this' argument of `void MemoryCard::progressed(int, int)' discards qualifiers Wenn ich es als const deklariere kompiliert diese Klasse durch aber die _moc-Klasse nicht, da anscheinend die Implementierung nicht als const deklariert wurde: out/moc_memorycard.cpp:88: error: prototype for `void MemoryCard::progressed(int, int)' does not match any in class `MemoryCard' src/smartcard/memorycard.h:228: error: candidate is: void MemoryCard::progressed(int, int) const Hat dies einen logischen Hintergrund oder ist es einfach nur so weil es bis jetzt keiner implementiert hat? Gruß, Bernhard -- "Wenn es morgens um sechs Uhr an meiner Tür läutet und ich kann sicher sein, daß es der Milchmann ist, dann weiß ich, dass ich in einer Demokratie lebe." -- Winston Churchill
On Monday 08 December 2003 17:10, Bernhard Walle wrote:
sehe ich es richtig dass ich in Qt von einer als const deklarierten Memberfunktion kein Signal mit "emit" senden kann?
Das kann gut sein. Ich habe mich zunächst über diese vermeintliche Einschränkung gewundert. Aber bei näherer Betrachtung kommt man sehr schnell darauf, daß es eigentlich nur im extremsten Sonderfall passiert, daß eine Methode, die mit "emit" ein Signal aussendet, const sein kann: Ein Qt-Signal zeigt ja von der Idee her an, daß sich der Status eines Widgets geändert hat (damit verbunden sind in der Regel Änderungen an Membervariablen des Objekts), also eben genau das Gegenteil von const. Ich habe mal meine Qt-Programme (z.B. YaST2-Qt, KDirStat) durchgesehen und tatsächlich nicht einen einzigen Fall gefunden, wo eine Methode, die "emit" aufruft, sinnvollerweise const sein sollte oder auch nur könnte. Fazit: Überleg' Dir gut, ob Du das wirklich willst, was Du da vorhast. ;-)
Hat dies einen logischen Hintergrund oder ist es einfach nur so weil es bis jetzt keiner implementiert hat?
Das kommt wohl von der Art, wie Signals und Slots als Aufsatz auf C++
implementiert sind. Schau' Dir mal eines der von "moc" generierten Files an;
da wirst Du für jedes Deiner Q_OBJECTS eine qt_emit() -Methode finden, über
die alle "emit"-Aufrufe dieser Klasse abgewickelt werden. Und dieses
qt_emit() ist eben nicht const - wohl aus internen Gründen.
CU
--
Stefan Hundhammer
Bernhard Walle schrieb:
Hallo,
sehe ich es richtig dass ich in Qt von einer als const deklarierten Memberfunktion kein Signal mit "emit" senden kann? [...] Hat dies einen logischen Hintergrund oder ist es einfach nur so weil es bis jetzt keiner implementiert hat?
Hi, wenn man mal einen Blick in die Implementierung der Signalmethoden riskiert, dann tauchen dort immer wieder folgende Methoden von QObject auf: qobject.h: 162 protected: ... 166 void activate_signal( int signal ); 167 void activate_signal( int signal, int ); 168 void activate_signal( int signal, double ); 169 void activate_signal( int signal, QString ); 170 void activate_signal_bool( int signal, bool ); 171 void activate_signal( QConnectionList *clist, QUObject *o ); Da die alle non-const sind, kann folglich keine Signalmethode const sein. Ciao Sebastian
participants (3)
-
Bernhard Walle
-
Sebastian Huber
-
Stefan Hundhammer