线程中通过信号和槽函数传递信息的时候,由于用到了自己定义的参数结构,所以使用qRegisterMetaType
2017-12-07 10:41
651 查看
如果是自己定义的类型如果想使用signal/slot来传递的话,则没有这么简单。直接使用的话,会产生下面这种错误:
原因:当一个signal被放到队列中(queued)时,它的参数(arguments)也会被一起一起放到队列中(queued起来),这就意味着参数在被传送到slot之前需要被拷贝、存储在队列中(queue)中;为了能够在队列中存储这些参数(argument),Qt需要去construct、destruct、copy这些对象,而为了让Qt知道怎样去作这些事情,参数的类型需要使用qRegisterMetaType来注册(如错误提示中的说明)
步骤:(以自定义TextAndNumber类型为例)
自定一种类型,在这个类型的顶部包含:#include <QMetaType>
在类型定义完成后,加入声明:Q_DECLARE_METATYPE(TextAndNumber);
在main()函数中注册这种类型:qRegisterMetaType<TextAndNumber>("TextAndNumber");
如果还希望使用这种类型的引用,可同样要注册:qRegisterMetaType<TextAndNumber>("TextAndNumber&");
#include <QMetaType>
//必须包含QMetaType,否则会出现下面错误:
//error: expected constructor, destructor, or type conversion before ‘;’ token
#include <QString>
class TextAndNumber {
public:
TextAndNumber();
TextAndNumber(int, QString);
int count();
QString text();
private:
int m_count;
QString m_text;
};
Q_DECLARE_METATYPE(TextAndNumber);
#endif // TEXTANDNUMBER_H
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
qRegisterMetaType<TextAndNumber>("TextAndNumber");
qRegisterMetaType<TextAndNumber>("TextAndNumber&");
TextDevice device;
TextThread foo("foo"), bar("bar");
QObject::connect(&foo, SIGNAL(writeText(TextAndNumber&)), &device, SLOT(write(TextAndNumber&)));
QObject::connect(&bar, SIGNAL(writeText(TextAndNumber&)), &device, SLOT(write(TextAndNumber&)));
QObject::connect: Cannot queue arguments of type 'TextAndNumber' (Make sure 'TextAndNumber' is registed using qRegisterMetaType().)
原因:当一个signal被放到队列中(queued)时,它的参数(arguments)也会被一起一起放到队列中(queued起来),这就意味着参数在被传送到slot之前需要被拷贝、存储在队列中(queue)中;为了能够在队列中存储这些参数(argument),Qt需要去construct、destruct、copy这些对象,而为了让Qt知道怎样去作这些事情,参数的类型需要使用qRegisterMetaType来注册(如错误提示中的说明)
步骤:(以自定义TextAndNumber类型为例)
自定一种类型,在这个类型的顶部包含:#include <QMetaType>
在类型定义完成后,加入声明:Q_DECLARE_METATYPE(TextAndNumber);
在main()函数中注册这种类型:qRegisterMetaType<TextAndNumber>("TextAndNumber");
如果还希望使用这种类型的引用,可同样要注册:qRegisterMetaType<TextAndNumber>("TextAndNumber&");
#include <QMetaType>
//必须包含QMetaType,否则会出现下面错误:
//error: expected constructor, destructor, or type conversion before ‘;’ token
#include <QString>
class TextAndNumber {
public:
TextAndNumber();
TextAndNumber(int, QString);
int count();
QString text();
private:
int m_count;
QString m_text;
};
Q_DECLARE_METATYPE(TextAndNumber);
#endif // TEXTANDNUMBER_H
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
qRegisterMetaType<TextAndNumber>("TextAndNumber");
qRegisterMetaType<TextAndNumber>("TextAndNumber&");
TextDevice device;
TextThread foo("foo"), bar("bar");
QObject::connect(&foo, SIGNAL(writeText(TextAndNumber&)), &device, SLOT(write(TextAndNumber&)));
QObject::connect(&bar, SIGNAL(writeText(TextAndNumber&)), &device, SLOT(write(TextAndNumber&)));
相关文章推荐
- Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)
- Qt 线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)
- 使用@RequestMapping 定义处理器函数-通过@RequestParam元注解来将请求参数绑定到方法形参
- 嵌入式 Linux 通过信号机制在进程间传递参数中的几个主要函数解析
- 信号槽所用的参数类型,必须是Qt能认识的元类型,否则就要调用Q_DECLARE_METATYPE和qRegisterMetaType进行注册
- Python def函数的定义、使用及参数传递实现代码
- WM_PAINT在微软官方定义中,wParam和lParam都没有使用,所以就被Delphi给重定义了这个消息,还增加了DC(Delphi可任意改写消息的结构,只需要保持前4个字节是消息即可,另外要携带微软定义的所有必要信息就行了)
- Python def函数的定义、使用及参数传递实现代码
- QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类
- 详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)
- 使用通过寄存器传递的参数的地址, 作为支持调用其他函数
- Qt 线程间共享数据(qRegisterMetaType的使用)
- 可以通过定义js函数,将jsp变量值作为参数传递给该函数
- Python def函数的定义、使用及参数传递实现代码
- C# 线程中使用Timer,并向其触发的事件(函数)中传递参数
- DMP文件的生成和使用(转),由于须要取得用户出现问题的信息,所以须要取得demp信息,可以通过本方法获取。
- 为什么在C++使用pthread_create()的时候,类成员函数做线程的处理函数必须要定义成static类型的?
- 为什么在C++使用pthread_create()的时候,类成员函数做线程的处理函数必须要定义成static类型的?
- 向非托管Dll 函数传递结构参数
- 如何使用定时器settimeout、setInterval执行能传递参数的函数