использование сигналов boost вместо qt
Это длинный выстрел, но, столкнувшись с ограничением в виде сигналов qt, слоты не могут быть шаблонизированы, я просто думаю о замене их сигналами усиления, было бы это жизнеспособным вариантом?
1 ответов
вы не обязаны использовать сигналы и слоты qt. От использование Qt с сторонними сигналами и слотами:
можно использовать Qt с механизмом сигнала/слота третьей стороны. Вы можно даже использовать оба механизма в одном проекте. Просто добавьте следующая строка вашего проекта qmake (.pro) файл.
CONFIG += no_keywords
Он говорит Qt не определять ключевые слова moc сигналы, слоты и излучать, потому что эти имена будут использоваться сторонней библиотекой, например, Boost. Затем продолжить использование сигналов и слотов Qt с установленным флагом no_keywords , просто замените все использование ключевых слов Qt moc в ваших источниках на соответствующие макросы Qt Q_SIGNALS( или Q_SIGNAL), Q_SLOTS (или Q_SLOT) и Q_EMIT.
есть полное описание о том, как подключить сигналы boost к сигналам qt.
Я нашел этот адаптер где-то в сети, но не знаю, где:
#ifndef _QT_2_FUNC_3_H_
#define _QT_2_FUNC_3_H_
#include <iostream>
#include <boost/function.hpp>
#include <boost/type_traits.hpp>
#include <QObject>
#include <libQtSignalAdapters/QtConnDefault.h>
using namespace boost;
namespace QtSignalAdapters
{
/**
* \cond
*/
template<typename SIGNATURE>
class Qt2FuncSlot3
{
public:
typedef function<SIGNATURE> FuncType;
typedef typename function_traits<SIGNATURE>::arg1_type ParmType1;
typedef typename function_traits<SIGNATURE>::arg2_type ParmType2;
typedef typename function_traits<SIGNATURE>::arg3_type ParmType3;
Qt2FuncSlot3(const FuncType& func) :
func_(func)
{
}
void call(QObject* sender, void **arguments)
{
ParmType1* a1 = reinterpret_cast<ParmType1*>(arguments[1]);
ParmType2* a2 = reinterpret_cast<ParmType2*>(arguments[2]);
ParmType3* a3 = reinterpret_cast<ParmType3*>(arguments[3]);
if ( func_ )
func_(*a1,*a2, *a3);
}
private:
FuncType func_;
};
/**
* \endcond
*/
template<typename SIGNATURE>
class Qt2Func3 : public QObject, public QtConnDefault
{
public:
typedef function<SIGNATURE> FuncType;
typedef typename function_traits<SIGNATURE>::arg1_type ParmType;
Qt2Func3(QObject* qobject, int signalIdx, const FuncType& func,
bool initiallyConnected=true) :
QObject(qobject),
QtConnDefault(qobject, signalIdx),
func_(func)
{
//
// Get the next usable slot ID on this...
//
slotIdx_ = metaObject()->methodCount();
//
// Create a slot to handle invoking the boost::function object.
//
slot_ = new Qt2FuncSlot3<SIGNATURE>(func);
if ( initiallyConnected )
connect();
}
~Qt2Func3()
{
delete slot_;
}
int qt_metacall(QMetaObject::Call c, int id, void **arguments)
{
id = QObject::qt_metacall(c, id, arguments);
if ( id < 0 || c != QMetaObject::InvokeMetaMethod )
return id;
slot_->call(sender(), arguments);
return -1;
}
void connect()
{
connect_();
}
void disconnect()
{
disconnect_();
}
private:
void connect_()
{
connected_ =
QMetaObject::connect(qobject_, signalIdx_, this, slotIdx_);
}
void disconnect_()
{
connected_ =
!QMetaObject::disconnect(qobject_, signalIdx_, this, slotIdx_);
}
FuncType func_;
Qt2FuncSlot3<SIGNATURE>* slot_;
};
}
#endif
Так, в основном вы должны переопределить