2015-03-24 4 views
3

Используя Qt, я все больше и больше его раздражаю. Qt не позволяет мне использовать шаблоны в большинстве своих классов, поскольку компилятор MOC (или лучший препроцессор) запускается до того, как произойдет генерация кода C++.Концепция Signal/Slot Qt и шаблоны ... Альтернативы?

Есть ли разумная альтернатива концепции внутреннего Sing/Slot Qt? Я читал об boost :: signals2, но не мог узнать, предварительно ли он обработан или нет.

+2

Boost.Signals2 является раствор чистого C++, без предварительной обработки/прекомпиляция/другие такие вещи. Я даже использовал его вместе с Qt, и он работает отлично. Я закончил с Qt-сигналами для GUI-файлов и сигналов Boost для внутренней логики. – Angew

+0

Не могли бы вы предоставить точную ситуацию, где вам нужны шаблоны + наследование от QObject? В большинстве случаев возможны довольно обходные пути. Например, вы можете использовать методы шаблонов, если они не являются слотами. –

+0

Возможно [это может помочь] (http://doc.qt.digia.com/qq/qq15-academic.html). Кроме того, взгляните на [это] (http://stackoverflow.com/questions/26950718/how-to-use-templates-with-qt-signals-and-slots). –

ответ

1

Взгляните на sigslot. Это очень похоже на сигнал синтаксис Qt/слотов, и это чистый C++:

class Switch 
{ 
public: 
    signal0<> Clicked; 
}; 

class Light : public has_slots<> 
{ 
public: 
    void ToggleState(); 
}; 

Switch sw; 
Light light; 

sw.Clicked.connect(&light, &Light::ToggleState); 
1

Qt не позволяет мне использовать шаблоны в большинстве своих классов, так как MOC компилятора (или лучше препроцессора) выполняется до фактического кода происходит генерация C++.

Вы можете использовать классы шаблонов с Qt сигналов-слотов, но со следующими restircions:

  1. Шаблон класс должен быть унаследовал от QObject
  2. Q_OBJECT макрос не может быть использован в шаблон класса
  3. Вы не можете определить сигналы и слоты в этом классе - все сигналы и слоты должны быть в родительском классе.

Пример внедрения вы можете увидеть в header for QFutureWatcher class.

Есть ли разумная альтернатива концепции внутреннего Sing/Slot Qt?

Если вам нужно использовать аналоговый только для Qt :: DirectConnection, любая реализация от, например, here подходит. Если вам нужен Qt :: QueuedConnection, я не знаю прямых аналогов без использования дополнительного кода. Например, Qt :: QueuedConnection может быть реализован через объекты boost :: signals и boost :: asio.

Я прочитал о boost :: signals2, но не смог узнать, предварительно ли он обработан или нет.

Как я понимаю, вопрос, требующий предварительной обработки сигналов форсирования, требует, если не поддерживается вариационных шаблонов. От boost signal.hpp file:

#ifdef BOOST_NO_VARIADIC_TEMPLATES 
#include <boost/signals2/preprocessed_signal.hpp> 
#else 
#include <boost/signals2/variadic_signal.hpp> 
#endif 
Смежные вопросы