我的班上有typedef ProxyTray<QImage, ImageCaptureService> TrayType; (这是QObject,但ProxyTray不是QObject)。我在信号中使用这种类型,插槽作为参数类型。
qRegisterMetaType接受这样的类型吗?如何为参数化类型建模字符串类型名称?
发布于 2016-05-14 21:45:12
您可以使用以下方法声明模板化的元类型:
Q_DECLARE_METATYPE_TEMPLATE_1ARG(TemplatedClass)
Q_DECLARE_METATYPE_TEMPLATE_2ARG(TemplatedClass)例如:
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注册为元类型(从QT5.6开始)发布于 2012-08-17 17:47:08
是的,模板类型可以在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();
}https://stackoverflow.com/questions/11725730
复制相似问题