QMetaType与模板化类型一起工作吗
Does QMetaType work with templated Type
我的类中有typedef ProxyTray<QImage, ImageCaptureService> TrayType;
(哪个是QObject,但ProxyTray
不是QObject)。我在Signal中使用该类型,Slots作为参数类型。
qRegisterMetaType
接受这样的类型吗?如何为参数化类型的字符串类型名称建模?
您可以使用以下命令声明模板化的元类型:
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>
等…
然而,有两个注意事项:
- 这不是官方Qt API的一部分,可能会在某个时候消失
- 模板类型本身必须使用
Q_DECLARE_METATYPE
进行注册:Foo<Bar>
也要求Bar
注册为元类型(如第5.6季度)
是的,模板化类型可以在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();
}
相关文章:
- 如何使我的 sizeof sum 结构与空参数包一起工作
- SFINAE:它如何与派生类一起工作?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 尝试让条形码扫描仪与Arduino一起工作
- 从书本中学习C++无法使该程序与类一起工作
- 让类与运算符一起工作更简单的方法
- 如何使lambda与std::nullopt一起工作
- 当我使用长整型时,我的代码不起作用,它与 int 一起工作得很好
- 返回对象如何与分配运算符一起工作
- GLM :: perspective()和glm :: lookat()一起工作
- SFML OpenGL:如何同时与他们一起工作
- 使QTConcurrent ::映射与Lambdas一起工作
- 如何与C 字符串中的非ASCII字符一起工作
- 我如何适应擦除式习惯与矢量元组一起工作
- 需要帮助使 VOID 代码与总工资一起工作
- 我怎样才能让这个刽子手代码与 wxDev-C++ 一起工作
- Googletest 在 bazel test 中永远不会失败(在它应该失败的地方),但与 cmake & clion 一起工作
- 常量变量初始化仅与成员初始化列表一起工作
- feal_ptr与unique_ptr一起工作
- OpenGL Ping Pong可与一张通行证一起工作,而不是两个通行证