void setSignalEmiter(SignalEmiter* semiter){ if(m_semiter!=NULL){ /* тут отписываемся от сигналов */ } m_semiter = semiter; if(m_semiter!=NULL){ /* тут подписываемся на сигналы */ } }protected: SignalEmiter* m_semiter;
class SignalEmiterConsumer : QObject { Q_OBJECTpublic: explicit SignalEmiterConsumer(QObject *parent=0) : QObject(parent), m_semiter(NULL) { } virtual SignalEmiter* getSignalEmiter(){ return m_semiter; } void setSignalEmiter(SignalEmiter* semiter){ if(m_semiter!=NULL){ /* тут отписываемся от сигналов */ } m_semiter = semiter; if(m_semiter!=NULL){ /* тут подписываемся на сигналы */ } } protected slots: virtual void someSlot1(const QString &location, int exponent)=0; .... virtual void someSlotN(const QString &location, some_structure* kNumber, int tkNumber)=0;protected: SignalEmiter* m_semiter;};
C++ (Qt)class SignalEmiterConsumer {public: void setSignalEmiter(SignalEmiter* semiter){ if(m_semiter!=NULL){ /* тут отписываемся от сигналов */ } m_semiter = semiter; if(m_semiter!=NULL){ /* тут подписываемся на сигналы */ QObject * dst = dynamic_cast <QObject *> (this); Q_ASSERT(dst); QObject::connect(semitter, .., dst, ..); ... } }
QObject * dst = dynamic_cast <QObject *> (this);QObject::connect( semitter, &SignalEmiter::someSignal1, dst, &SignalEmiterConsumer::someSlot1 );
QObject::connect( semitter, &SignalEmiter::someSignal1, &SignalEmiterConsumer::someSlot1 );
//connect to a function pointer (not a member) template <typename Func1, typename Func2> static inline typename QtPrivate::QEnableIf<int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0, QMetaObject::Connection>::Type connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot) { return connect(sender, signal, sender, slot, Qt::DirectConnection); // <--- вот тут [b]'QObject::connect' : none of the 4 overloads could convert all the argument types[/b] }