我的班级typedef ProxyTray<QImage, ImageCaptureService> TrayType;
(是 QObject,但ProxyTray
不 QObject)。我在Signal,Slots中使用该类型作为参数类型。
qRegisterMetaType
是否接受此类型?我如何为参数化类型建模字符串类型名称?
答案 0 :(得分:2)
您可以使用:
声明模板化元类型Q_DECLARE_METATYPE_TEMPLATE_1ARG(TemplatedClass)
Q_DECLARE_METATYPE_TEMPLATE_2ARG(TemplatedClass)
e.g。
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)答案 1 :(得分:1)
是的,模板化类型可用于Qt信号/插槽。由于您的类型已经有typedef
,因此您只需使用Q_DECLARE_METATYPE
,如下例所示:
#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();
}