zoukankan      html  css  js  c++  java
  • Qt 线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)

    不跨线程的话,使用自定义的类型使用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);

    但此方法官方不推荐使用,认为其不安全。不过在笔者实际使用过程中,未发现有不妥之处。

  • 相关阅读:
    装饰器函数(一)
    面向对象的初阶复习
    内置函数/反射/内置方法(单例类面)
    property特殊属性/类方法/静态方法
    多态/封装
    接口类抽象类
    初始继承之顺序/深度优先及广度优先
    类涉及的空间关系及组合(可变项地址面)
    <head></head>
    让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15769725.html
Copyright © 2011-2022 走看看