工作,我在我的課已經typedef ProxyTray<QImage, ImageCaptureService> TrayType;
(這爲的QObject但ProxyTray
是不 QObject的)。我在Signal,Slots中使用這種類型作爲參數類型。不QMetaType與模板類型
確實qRegisterMetaType
接受這樣的類型?我將如何建模參數化類型的字符串類型名稱?
工作,我在我的課已經typedef ProxyTray<QImage, ImageCaptureService> TrayType;
(這爲的QObject但ProxyTray
是不 QObject的)。我在Signal,Slots中使用這種類型作爲參數類型。不QMetaType與模板類型
確實qRegisterMetaType
接受這樣的類型?我將如何建模參數化類型的字符串類型名稱?
是,模板類型可以在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();
}
你可以聲明模板元類型
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>
等..
然而,有兩點需要說明:
Q_DECLARE_METATYPE
:Foo<Bar>
要求Bar
註冊爲一元類型太(如Qt的5.6 )
做'qRegisterMetaType( 「TrayType」);'在構造函數之前連接信號插槽。越來越'的QObject ::連接:(使用qRegisterMetaType()確保 'TrayType&' 被註冊)' –
2012-07-30 16:51:05
做你'Q_DECLARE_METATYPE'不能排隊類型的參數 'TrayType&' ? – tmpearce 2012-07-30 17:08:13
[這個問題](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