Указатель на слот Qt - PullRequest
       20

Указатель на слот Qt

2 голосов
/ 27 октября 2009

я хочу построить указатель на слот Qt:

union {
    void (*set_slot)(unsigned long value);
    void (*refresh_slot)(void);
} the_slot;

Определение слота:

void set_pwm(unsigned long new_pwm);

Я пытаюсь сделать что-то вроде этого:

the_slot.set_slot = set_pwm;

Но компилятор говорит, что подпись не совпадает:

ошибка: аргумент типа void (DriverBoard::)(long unsigned int)' does not match void (*) (длинный без знака int) '

подсказка: слот находится в классе DriverBoard

Есть идеи, где моя ошибка?

А если кто-то знает - возможно ли сделать что-то подобное и с сигналами?

Спасибо! Simon

Ответы [ 2 ]

6 голосов
/ 27 октября 2009

Слоты и сигналы идентифицируются по их именам (когда вы используете SLOT(set_pwm(unsigned long)) в своем коде, вы создаете строку). Вы можете просто сохранить имя и объект, а затем вызвать слот, используя QMetaObject.

Вы можете использовать указатели на функции-члены в C ++ (см. C ++ faq ), но в этом случае я бы предложил использовать мета-объектную систему Qt.

2 голосов
/ 27 октября 2009

Исходя из ответа Лукаша Лалинского, «проходящие» сигналы и слоты могут быть такими простыми:

  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 &))); 
  // ...
...