Zeiger auf einen Qt-Slot
-
06-07-2019 - |
Frage
Ich mag einen Zeiger auf einen Qt-Slot erstellen:
union {
void (*set_slot)(unsigned long value);
void (*refresh_slot)(void);
} the_slot;
Die Schlitz Definition lautet:
void set_pwm(unsigned long new_pwm);
Ich versuche, so etwas zu tun:
the_slot.set_slot = set_pwm;
Aber die Compiler sagt, dass die Signatur nicht übereinstimmt:
Fehler: Argument vom Typ
void (DriverBoard::)(long unsigned int)' does not match
void (*) (long unsigned int)
Hinweis: Der Schlitz ist in der Klasse Treiberkarte
Jede Idee, wo mein Fehler ist?
Und wenn jemand weiß - ist es möglich, auch so etwas wie die mit Signalen zu tun
Danke! Simon
Lösung
Slots und Signale, die durch ihre Namen identifiziert werden (wenn Sie SLOT(set_pwm(unsigned long))
in Ihrem Code verwenden, laden Sie bauen einen String). Sie können einfach den Namen speichern und das Objekt und dann den Schlitz rufen QMetaObject
verwendet wird.
Sie können verwenden Zeiger auf Member-Funktionen in C ++ (siehe C ++ FAQ ), aber in diesem Fall würde ich vorschlagen, Qt Meta-Objekt-System zu verwenden.
Andere Tipps
Im Anschluss an Lukáš Lalinský Antwort, ‚passing‘ Signale und Slots können so einfach sein wie diese:
void Foo::bar(const QObject *sender, const QString &signal,
const QObject *receiver, const QString &slot)
{
// ...
connect(sender, signal, receiver, slot);
// ...
}
// ...
fooObject->bar(aSender, SIGNAL(aSenderSignal(const QString &)),
aReceiver, SLOT(aReceiverSlot(const QString &)));
// ...