Frage

Kann mir jemand erklären, die Grundidee von Qt Signale & Slots Mechanismus UMSETZUNG? Ich will wissen, was all diese Q_OBJECT Makros tun „einfach in C ++“. Diese Frage ist nicht über Signale & Slots Nutzung.

hinzugefügt: Ich weiß, dass Qt moc-Compiler verwendet Qt-C ++ einfach in C ++ zu transformieren. Aber was macht moc? Ich habe versucht, „moc_filename.cpp“ Dateien zu lesen, aber ich habe keine Ahnung, was so etwas wie dies bedeuten kann,

void *Widget::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_Widget))
    return static_cast<void*>(const_cast< Widget*>(this));
return QDialog::qt_metacast(_clname);
}
War es hilfreich?

Lösung

In Bezug auf die Signale und Slots, fügt der Q_OBJECT Makro eine virtuelle Funktion qt_metacall() Erklärung in der Erklärung der Klasse, die später durch die der moc definiert werden soll. (Es fügt auch einige Erklärungen für die Konvertierung, aber das ist nicht so wichtig hier.)

Die moc liest dann die Header-Datei und wenn es das Makro sieht, erzeugt er eine andere .cpp Datei mit den Definitionen namens moc_headerfilename.cpp auf die virtuellen Funktionen und - Sie selbst haben gefragt, vielleicht, warum Sie sich mit Erwähnung des signals: in Ihrem Header bekommen Datei ohne eine richtige Definition -. der Signale

Also, wenn ein Signal genannt wird, wird die Definition aus dem mocfile ausgeführt und QMetaObject::activate() wird mit dem Signal den Namen und das Signal der Argumente genannt. Die activate() Funktion dann herausfindet, welche Verbindungen hergestellt wurden, und holt die Namen für die entsprechenden Slots.

Dann ruft es qt_metacall mit den Schlitznamen und die Argumente auf das Signal und die metacall Funktion delegiert dies mit Hilfe einer großen switch-case Anweisung an die realen Slots gegeben.

Da es keine wirklichen Laufzeitinformationen möglich in C ++ über die tatsächlichen Namen für die Signale und Slots, wie bereits bemerkt worden ist, wird diese durch die SIGNAL und SLOT Makros auf einfachen const char*s codiert werden (entweder mit „1“ oder " 2" hinzugefügt, um den Namen zu unterscheiden Signale von Slots).

Wie in qobjectdefs.h definiert:

#define SLOT(a)     "1"#a
#define SIGNAL(a)   "2"#a

-

Die andere Sache, der Q_OBJECT Makro tut, ist die tr() Funktionen in Ihrem Objekt definiert, die verwendet werden können, Ihre Anwendung zu übersetzen.

Bearbeiten Wie Sie gefragt, was der qt_metacast tut. Es wird überprüft, ob ein Objekt zu bestimmten Klasse gehört, und wenn dies der Fall kehrt der Zeiger auf sie. Wenn dies nicht der Fall, gibt sie 0.

Widget* w = new Widget();
Q_ASSERT(w->qt_metacast("Widget") != 0);
Q_ASSERT(w->qt_metacast("QWidget") != 0);
Q_ASSERT(w->qt_metacast("QObject") != 0);
Q_ASSERT(w->qt_metacast("UnrelatedClass") == 0);

Dies ist notwendig, eine gewisse Laufzeit Reflexion zu schaffen, die sonst nicht möglich ist. Die Funktion wird aufgerufen, in QObject::inherits(const char *) zum Beispiel und einfach überprüft für die Vererbung.

Andere Tipps

Diese Makros absolut nichts tun "einfach in C ++", - sie erweitern Saiten zu leeren (glaube ich)

.

QT verwendet ein Meta-Objekt-Compiler, die C ++ Code für Q_OBJECT-fähigen Klassen (Umsetzung der Signale / Slots Sie definieren unter anderem) erzeugt.

Sie können mehr darüber lesen in der offiziellen Dokumentation .

Die Grundidee ist, dass Sie Ihre Objekte verbinden können so dass sie ein Verfahren (Slot) auszuführen, wenn ein Signal durchgeführt wird.

connect(pistol,SIGNAL(sigShoot()),runner,SLOT(slotRun()))

Dadurch könnte die Verbindung über, wenn die Pistole das Signal aussendet, wird der Läufer seinen Schlitz auszuführen.

Um dies zu tun, müssen Sie Ihre Signale und Slots in Ihren jeweiligen Klassen erklären.

Ist die Grundidee.

Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top