2011-12-16 29 views
7

Đây là một cảnh quay dài nhưng đã gặp phải một hạn chế dưới dạng tín hiệu của qt, các khe không thể được templatized, tôi chỉ nghĩ đến việc thay thế chúng bằng tín hiệu tăng, là lựa chọn khả thi?sử dụng tín hiệu tăng thay vì qt

+2

Làm cách nào chúng tôi biết? Nói chung có, hoàn toàn không có gì sai với Boost.Signals, nhưng nó tùy thuộc vào bạn để quyết định nếu Boost là đúng cho vấn đề cụ thể của bạn. –

Trả lời

10

Bạn không bị buộc phải sử dụng tín hiệu và vị trí của qt. Từ Using Qt with 3rd Party Signals and Slots:

Có thể sử dụng Qt với cơ chế tín hiệu/khe của bên thứ ba. Bạn thậm chí có thể sử dụng cả hai cơ chế trong cùng một dự án. Chỉ cần thêm dòng sau vào tệp dự án qmake (.pro) của bạn.

CONFIG += no_keywords 

Nó nói với Qt không để xác định từ khóa moc tín hiệu, khe, và phát ra, vì các tên này sẽ được sử dụng bởi một thư viện của bên thứ 3, ví dụ Tăng cường. Sau đó, để tiếp tục sử dụng tín hiệu và vị trí Qt với cờ no_keywords, chỉ cần thay thế tất cả các từ khóa Qt moc trong nguồn của bạn bằng các macro Qt tương ứng Q_SIGNALS (hoặc Q_SIGNAL), Q_SLOTS (hoặc Q_SLOT) và Q_EMIT.

Có một complete explanation cách kết nối tín hiệu tăng cường với tín hiệu qt.


tôi thấy bộ chuyển đổi này ở đâu đó trên mạng, nhưng không có ý tưởng đó:

#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 

Vì vậy, về cơ bản bạn phải reimplement qt_metacall chức năng.

+2

Qt 5 hỗ trợ kết nối tín hiệu với các chức năng tùy ý ra khỏi hộp - xem http://qt-project.org/wiki/New_Signal_Slot_Syntax Đối với Qt 4, có một vài thư viện bộ điều hợp. Nỗ lực của tôi tại liên kết này cộng với những người khác có thể được tìm thấy tại https://github.com/robertknight/qt-signal-tools –

+0

@RobertKnight Phải là câu trả lời (một câu trả lời hay, nếu bạn hỏi tôi). btw finaly họ đã đưa ra quyết định tốt về tín hiệu/khe của họ –

+1

Quyết định rất tốt, quả thật vậy. Cuối cùng mương moc (* vua *)! –

Các vấn đề liên quan