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 matchvoid (*) (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

War es hilfreich?

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 &))); 
  // ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top