C++ QMetaType与模板化类型一起工作吗
我有C++ QMetaType与模板化类型一起工作吗,c++,qt,C++,Qt,我有typedef ProxyTray TrayType在我的类中(它是QObject,但ProxyTray不是QObject)。我在信号中使用这种类型,插槽作为参数类型 qRegisterMetaType是否接受这种类型?如何为参数化类型建模字符串类型名称?是的,可以在Qt信号/插槽中使用模板化类型。由于您的类型已经有了typedef,您只需使用Q\u DECLARE\u元类型即可,如下例所示: #include <QtCore> template <typename T&
typedef ProxyTray TrayType代码>在我的类中(它是QObject,但ProxyTray
不是QObject)。我在信号中使用这种类型,插槽作为参数类型
qRegisterMetaType
是否接受这种类型?如何为参数化类型建模字符串类型名称?是的,可以在Qt信号/插槽中使用模板化类型。由于您的类型已经有了typedef
,您只需使用Q\u DECLARE\u元类型即可,如下例所示:
#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();
}
#包括
样板
结构代理
{
T数据;
};
typedef代理TrayType;
Q_DECLARE_元类型(TrayType)
类捐赠者:公共QObject
{
Q_对象
公众:
捐赠者()
{
m_proxy.data=QImage(10,20,QImage::Format_Mono);
}
无效测试()
{
发出产品(m_代理);
}
信号:
无效生成(const TrayType&proxy);
私人:
TrayType m_代理;
};
类接受者:公共QObject
{
Q_对象
公众时段:
无效消耗(常量传输类型和代理)
{
qDebug()是的,可以在Qt信号/插槽中使用模板类型。由于您的类型已经有了typedef
,您只需使用Q_DECLARE\u元类型即可,如下例所示:
#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();
}
#包括
样板
结构代理
{
T数据;
};
typedef代理TrayType;
Q_DECLARE_元类型(TrayType)
类捐赠者:公共QObject
{
Q_对象
公众:
捐赠者()
{
m_proxy.data=QImage(10,20,QImage::Format_Mono);
}
无效测试()
{
发出产品(m_代理);
}
信号:
无效生成(const TrayType&proxy);
私人:
TrayType m_代理;
};
类接受者:公共QObject
{
Q_对象
公众时段:
无效消耗(常量传输类型和代理)
{
qDebug()您可以通过以下方式声明模板化的元类型:
Q_DECLARE_METATYPE_TEMPLATE_1ARG(TemplatedClass)
Q_DECLARE_METATYPE_TEMPLATE_2ARG(TemplatedClass)
e、 g
模板
类Foo{
};
Q_DECLARE_METATYPE_TEMPLATE_1ARG(Foo)
允许将Foo
、Foo
等传递到信号和插槽
template<class T, class U>
class Foo {
};
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo)
模板
类Foo{
};
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo)
允许传递Foo
,Foo
等
但是,有两个注意事项:
- 这不是官方qtapi的一部分,可能会在某个时候消失
- 模板类型本身必须使用
Q\u DECLARE\u元类型注册
:Foo
要求Bar
也注册为元类型(如下所示
第5.6节)
您可以通过以下方式声明模板化的元类型:
Q_DECLARE_METATYPE_TEMPLATE_1ARG(TemplatedClass)
Q_DECLARE_METATYPE_TEMPLATE_2ARG(TemplatedClass)
e、 g
模板
类Foo{
};
Q_DECLARE_METATYPE_TEMPLATE_1ARG(Foo)
允许将Foo
、Foo
等传递到信号和插槽
template<class T, class U>
class Foo {
};
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo)
模板
类Foo{
};
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo)
允许传递Foo
,Foo
等
但是,有两个注意事项:
- 这不是官方qtapi的一部分,可能会在某个时候消失
- 模板类型本身必须使用
Q\u DECLARE\u元类型注册
:Foo
要求Bar
也注册为元类型(如下所示
第5.6节)
在连接信号插槽之前在ctor中执行了qRegisterMetaType(“TrayType”);
获取QObject::connect:无法对类型为“TrayType&”的参数进行排队(请确保使用qRegisterMetaType()注册了“TrayType&”)
您是否在连接信号插槽之前在ctor中传递非常量引用didqRegisterMetaType(“TrayType”)
?可能会有帮助我如何在模板类型上执行Q\u DECLARE\u METATYPE
操作?看起来我无法在连接信号插槽之前在ctor中传递非常量引用
didqRegisterMetaType(“TrayType”)
。获取QObject::connect:无法对'TrayType&'(请确保使用qRegisterMetaType()注册了“TrayType&”)
您是否Q\u DECLARE\u METATYPE
?可能会有帮助我如何在模板类型上执行Q\u DECLARE\u METATYPE
?看起来我无法通过非常量ref