2016-08-29 2 views
2

Для данного определения класса:Почему обычные методы класса могут использоваться как слоты в Qt?

class B : public QObject 
{ 
    Q_OBJECT 
public: 
    void normalFunction(){ qWarning() << "normal function";} 
signals: 
    void someSignal(); 
}; 

Там будет следующий код:

B a; 
QObject::connect(&a, &B::someSignal, &a, &B::normalFunction); 
a.someSignal(); 

Дело в том, что можно использовать обычный метод как слот - без ошибок компиляции, не во время выполнения предупреждений, все выглядит нормально. Правильно ли поведение использовать обычные методы (которые не объявлены в разделе slots) в качестве слотов? Я полагаю, что метаданные, сгенерированные moc, не используются при подключении сигналов и слотов с помощью указателей функций?

ответ

1

Почему обычные методы класса могут использоваться в качестве слотов в Qt?

Почему нет?

Я полагаю, что метаданные, сгенерированные moc, не используются при подключении сигналов и слотов с помощью указателей функций?

Метаданные используются для сигнала, но не используются для слота. Новый синтаксис connect не заботится о том, к чему вы подключаетесь, но определенно заботится о том, из чего вы подключаетесь. Если сигнал не объявлен как таковой, соединение будет работать во время выполнения, даже если оно скомпилируется успешно:

#include <QObject> 
struct Test : public QObject { 
    Q_SIGNAL void trueSignal(); 
    void fakeSignal() {} 
    Q_OBJECT 
}; 

int main() { 
    Test test; 
    auto c1 = QObject::connect(&test, &Test::trueSignal, []{}); // succeeds 
    auto c2 = QObject::connect(&test, &Test::fakeSignal, []{}); // fails 
    Q_ASSERT(c1); 
    Q_ASSERT(!c2); 
} 
#include "main.moc" 
Смежные вопросы