Qt 线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)
2017-02-24 15:30
651 查看
不跨线程的话,使用自定义的类型使用signal/slot来传递,没有什么问题。
但如果是跨线程的使用,则没有这么简单。
直接使用的话,会产生下面这种错误:(假定自定义类为MyClass)
QObject::connect: Cannot queue arguments of type 'MyClass' (Make sure 'MyClass' is registed using qRegisterMetaType().)
实际运行中也会发现,该信号槽没有起作用。
其实解决方法在错误提示中已经给出了:Make sure 'MyClass' is registed using qRegisterMetaType().
即使用qRegisterMetaType()将自定义类型进行注册
这里总结使用方法如下:
1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册;
2、注册方法:在当前类的顶部包含:#include <QMetaType>,构造函数中加入代码:qRegisterMetaType<MyClass>("Myclass");
3、Myclass的引用类型需单独注册:qRegisterMetaType<MyClass>("Myclass&");
***************************************************************************
如果不实用这种方法,还有一种办法来使跨线程的signal/slot起作用,即使用connect函数的Qt::DirectConnection参数
connect(A,SIGNAL(sendA(MyClass)),B,SLOT(getA(MyClass)),Qt::DirectConnection);
但此方法官方不推荐使用,认为其不安全。不过在笔者实际使用过程中,未发现有不妥之处。
参考文章:
http://www.360doc.com/content/11/0513/17/2775766_116494672.shtml http://xinlongli.blog.163.com/blog/static/7342907620134272564462/
但如果是跨线程的使用,则没有这么简单。
直接使用的话,会产生下面这种错误:(假定自定义类为MyClass)
QObject::connect: Cannot queue arguments of type 'MyClass' (Make sure 'MyClass' is registed using qRegisterMetaType().)
实际运行中也会发现,该信号槽没有起作用。
其实解决方法在错误提示中已经给出了:Make sure 'MyClass' is registed using qRegisterMetaType().
即使用qRegisterMetaType()将自定义类型进行注册
这里总结使用方法如下:
1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册;
2、注册方法:在当前类的顶部包含:#include <QMetaType>,构造函数中加入代码:qRegisterMetaType<MyClass>("Myclass");
3、Myclass的引用类型需单独注册:qRegisterMetaType<MyClass>("Myclass&");
***************************************************************************
如果不实用这种方法,还有一种办法来使跨线程的signal/slot起作用,即使用connect函数的Qt::DirectConnection参数
connect(A,SIGNAL(sendA(MyClass)),B,SLOT(getA(MyClass)),Qt::DirectConnection);
但此方法官方不推荐使用,认为其不安全。不过在笔者实际使用过程中,未发现有不妥之处。
参考文章:
http://www.360doc.com/content/11/0513/17/2775766_116494672.shtml http://xinlongli.blog.163.com/blog/static/7342907620134272564462/
相关文章推荐
- Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)
- 线程中通过信号和槽函数传递信息的时候,由于用到了自己定义的参数结构,所以使用qRegisterMetaType
- QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类
- Qt 线程间共享数据(qRegisterMetaType的使用)
- Qt-信号和槽中使用自定义数据类型
- Qt-信号和槽中使用自定义数据类型
- 信号槽所用的参数类型,必须是Qt能认识的元类型,否则就要调用Q_DECLARE_METATYPE和qRegisterMetaType进行注册
- 详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)
- 如何在Qt中使用自定义数据类型
- 【Android】使用AIDL传递用户自定义类型数据--附完整示例代码
- Qt中带有参数的信号传递出错--自定义类型的参数
- QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
- Qt_log2000_父子窗体传递数据-使用信号与槽
- QVariant(相当于是Java里面的Object,起到一个数据类型“擦除”的作用,可以使用Q_DECLARE_METATYPE进行注册)
- Qt Q_DECLARE_METATYPE说明——让自定义的类型设置到QVariant
- Qt使用自定义类型信号槽注册问题
- 如何在Qt中使用自定义数据类型
- QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
- Qt信号之自定义数据类型
- 如何在Qt中使用自定义数据类型 (zz)