如何注册对Qt容器的引用

How to register reference to Qt containers?

本文关键字:Qt 引用 何注册 注册      更新时间:2023-10-16

我想通过一个信号将QQueue<double>&传递到另一个线程中的插槽。我想通过引用传递队列,因为我不希望在更改插槽中的队列元素时复制数据。所以我应该注册这个元类型来拥有QueuedConnection。当我注册它像:

qRegisterMetaType<QQueue<double>& >("QQueue<double>&");

我得到以下错误:

error: no matching function for call to 'qRegisterMetaType(const char [16])'

我应该如何注册?

您注册的是没有任何引用的基类型。

qRegisterMetaType<QQueue<double>>();

您还必须在将要使用的每个编译单元中声明元类型,因此理想情况下,您应该在其自己的头文件中有一个typedef:

// DoubleQueue.h
#ifndef DOUBLEQUEUE_H
#define DOUBLEQUEUE_H
#include <QQueue>
typedef QQueue<double> DoubleQueue;
Q_DECLARE_METATYPE(DoubleQueue)
#endif

然后必须始终只使用和注册DoubleQueue——记住,对于moc,类型是一块文本。剥离引用后,它必须完全匹配。

qRegisterMetaType<DoubleQueue>();