2009-10-27 3 views
2

я хочу построить указатель на слот Qt:Указатель на слот 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; 

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

error: argument of type void (DriverBoard::)(long unsigned int)' does not match void (*)(long unsigned int)'

подсказка: слот в классе DriverBoard

Любая идея, где моя ошибка?

И если кто-то знает - возможно ли это сделать и с сигналами?

Спасибо! Simon

ответ

6

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

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

+0

Спасибо! Это делает его намного проще. – 2009-10-27 09:09:46

2

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

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

Лучше передавать имена сигналов/слотов как 'const char *'. Преобразование в QString не требуется. –

Смежные вопросы