2012-07-30 81 views
0

工作,我在我的課已經typedef ProxyTray<QImage, ImageCaptureService> TrayType;(這的QObject但ProxyTray QObject的)。我在Signal,Slots中使用這種類型作爲參數類型。不QMetaType與模板類型

確實qRegisterMetaType接受這樣的類型?我將如何建模參數化類型的字符串類型名稱?

+0

做'qRegisterMetaType ( 「TrayType」);'在構造函數之前連接信號插槽。越來越'的QObject ::連接:(使用qRegisterMetaType()確保 'TrayType&' 被註冊)' – 2012-07-30 16:51:05

+0

做你'Q_DECLARE_METATYPE'不能排隊類型的參數 'TrayType&' ? – tmpearce 2012-07-30 17:08:13

+0

[這個問題](http://stackoverflow.com/questions/1276967/qt-4-5-how-do-i-perform-a-queued-connection-with-a-template-type)可能是有幫助 – tmpearce 2012-07-30 17:17:26

回答

1

是,模板類型可以在Qt信號/時隙被使用。當你已經有一個typedef你的類型,你可以簡單地使用Q_DECLARE_METATYPE如下面的例子:

Q_DECLARE_METATYPE_TEMPLATE_1ARG(TemplatedClass) 
Q_DECLARE_METATYPE_TEMPLATE_2ARG(TemplatedClass) 

例如:

#include <QtCore> 

template <typename T> 
struct Proxy 
{ 
    T data; 
}; 
typedef Proxy<QImage> TrayType; 
Q_DECLARE_METATYPE(TrayType) 

class Donor : public QObject 
{ 
    Q_OBJECT 
public: 
    Donor() 
    { 
     m_proxy.data = QImage(10, 20, QImage::Format_Mono); 
    } 

    void test() 
    { 
     emit produce(m_proxy); 
    } 

signals: 
    void produce(const TrayType& proxy); 

private: 
    TrayType m_proxy; 
}; 

class Acceptor : public QObject 
{ 
    Q_OBJECT 
public slots: 
    void consume(const TrayType& proxy) 
    { 
     qDebug() << "The mage size is" << proxy.data.size(); 
    } 
}; 

int main(int argc, char* argv[]) 
{ 
    QCoreApplication app(argc, argv); 

    QScopedPointer<Donor> donor(new Donor); 
    QScopedPointer<Acceptor> acceptor(new Acceptor); 
    QObject::connect(donor.data(), SIGNAL(produce(TrayType)), 
        acceptor.data(), SLOT(consume(TrayType))); 

    // Test the signal-slot connection. 
    donor->test(); 
    return app.exec(); 
} 
1

你可以聲明模板元類型

template<class T> 
class Foo { 

}; 
Q_DECLARE_METATYPE_TEMPLATE_1ARG(Foo) 

允許通過Foo<int>Foo<QString>,等...的信號和槽。

template<class T, class U> 
class Foo { 

}; 
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo) 

允許通過Foo<int, double>Foo<bool, bool>等..

然而,有兩點需要說明:

  • 這是不是官方的Qt API的一部分,並可能在某一時刻消失。
  • 的模板類型必須是自己註冊使用Q_DECLARE_METATYPEFoo<Bar>要求Bar註冊爲一元類型太(如Qt的5.6 )