2011-12-16 17 views
7

के बजाय बूस्ट सिग्नल का उपयोग करके यह एक लंबा शॉट है, लेकिन एक क्यूटी के सिग्नल के रूप में एक बाधा भरने के बाद, स्लॉट templatized करने में असमर्थ होने के कारण, मैं सिर्फ उन्हें बढ़ावा संकेतों के साथ बदलने की सोच रहा हूं, क्या वह व्यवहार्य विकल्प हो?क्यूटी

+2

हम कैसे जानते होंगे? आम तौर पर, Boost.Signals के साथ बिल्कुल कुछ भी गलत नहीं है, लेकिन यह तय करने के लिए आप पर निर्भर है कि बूस्ट आपकी विशेष समस्या के लिए सही है या नहीं। –

उत्तर

10

आपको क्यूटी के सिग्नल और स्लॉट का उपयोग करने के लिए मजबूर नहीं किया जाता है। Using Qt with 3rd Party Signals and Slots से:

तीसरे पक्ष के सिग्नल/स्लॉट तंत्र के साथ क्यूटी का उपयोग करना संभव है। आप एक ही प्रोजेक्ट में दोनों तंत्रों का भी उपयोग कर सकते हैं। बस अपनी qmake प्रोजेक्ट (.pro) फ़ाइल के लिए निम्न पंक्ति जोड़ें।

CONFIG += no_keywords 

यह क्यूटी बताता MOC कीवर्ड संकेत, स्लॉट्स, और फेंकना, क्योंकि इन नामों एक 3 पार्टी पुस्तकालय द्वारा उपयोग किया जाएगा, उदा परिभाषित करने के लिए नहीं बढ़ावा। फिर no_keywords ध्वज के साथ क्यूटी संकेतों और स्लॉट का उपयोग जारी रखना, बस क्यूटी MOC कीवर्ड के सभी उपयोगों अपने स्रोतों में साथ इसी क्यूटी मैक्रो Q_SIGNALS (या Q_SIGNAL) की जगह, Q_SLOTS (या Q_SLOT), और Q_EMIT।

qt संकेतों को बढ़ावा संकेत जोड़ने के लिए complete explanation है।


मैं नेट पर कहीं न कहीं इस एडाप्टर पाया है, लेकिन पता नहीं कहाँ:

#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 

तो, मूल रूप से आप qt_metacall समारोह reimplement करने के लिए।

+2

क्यूटी 5 बॉक्स के बाहर मनमाने ढंग से कार्यों को जोड़ने के संकेतों का समर्थन करता है - http://qt-project.org/wiki/New_Signal_Slot_Syntax क्यूटी 4 के लिए, कुछ एडाप्टर पुस्तकालय हैं। दूसरों के साथ इस प्लस लिंक पर मेरा प्रयास https://github.com/robertknight/qt-signal-tools –

+0

@RobertKnight पर एक उत्तर दिया जाना चाहिए (एक अच्छा, अगर आप मुझसे पूछें)। बीटीडब्ल्यू फिनली ने अपने सिग्नल/स्लॉट –

+1

के बारे में एक अच्छा निर्णय लिया, वास्तव में बहुत अच्छा निर्णय। अंत में मोक (* राजा *) कुचलना! –