Цитата(deniska91 @ 11.11.2014, 00:37 ) | | Правильно ли я понимаю, сигналы и слоты это абстракция и по сути являются обычными методами, их преимущество только в том, что один сигнал можно соединить с несколькими слотами. |
Нет. Прелесть сигнал/слотов, в основном, в том, что они могут передавать данные между потоками прозрачно для тебя. Например, если твой второй класс (с логикой) работает в отдельном потоке, то просто так вызвать из него функцию класса формы, которая что-то должна нарисовать, нельзя. А если ты кидаешь сигнал, то Qt сама заботится о том, чтобы прикреплённый к нему слот вызвался в контексте потока окна.
У сигнал/слотов есть, пожалуй, один недостаток по сравнению с прямым связыванием по функциям/callback'ам - твой код становится уже не чистым Си++. Ты не сможешь его использовать вне Qt (без moc-компилятора). Но, если ты готов с этим жить, то сигнал/слоты - очень удобная вещь.
Цитата(deniska91 @ 11.11.2014, 00:37 ) | | А как быть если классы удалены ещё больше друг от друга - делать пробрасывание сигналов через все сопутствующие классы? |
Нет. Сигнал можно коннектить не только на слот, но и на сигнал:
| Код | class A { signals: void aEvent(); public: void foo() { emit aEvent(); } }; class B { A a; signals: void bEvent(); public: B() { connect( & a, SIGNAL( aEvent() ), SIGNAL( bEvent() ) ); } void bar() { a.foo(); } }; class Main { B b; slots: void onEvent() {} public: Main() { connect( & b, SIGNAL( bEvent() ), SLOT( onEvent() ) ); b.bar(); } }; |
|