zoukankan      html  css  js  c++  java
  • 57.Qt-qRegisterMetaType

    在定义信号槽的时候,传递的参数类型如果是自定义类型(自定义class类,或者enum类等),

    并且涉及跨线程时,最好先通过qRegisterMetaType()将自定义类型进行注册,否则会报错:

    QObject::connect: Cannot queue arguments of type 'XXXXXXX' 
    (Make sure 'ERROR_LEVEL' is registered using qRegisterMetaType().)

    1.为什么自定义类型信号槽在跨线程会报错?

    因为跨线程时,当发送方信号发出时,此时接受对象所在的线程未取得控制权,所以需要发送方需要将

    信号放在信号队列中储存发送的参数,QT就会去construct构造对象,而我们定义的是自定义类型,所以需要使用qRegisterMetaType()来注册,告诉QT怎么去构造对象.

    2.如果传递的参数类型是指针类型?

    不需要进行注册,因为指针实际传递的是指针地址,QT无需去从新construct构造对象,但是需要注意的是,指针指向的地址不能发送完立马释放.

    3.步骤 (以自定义Text类型为例)

    #include <QString>
    #include <QMetaType>
    #include <QDebug>
    
    class Text
    {
    public:
        Text()
        {
            qDebug()<<"Text";
        }
    
        Text(const Text& t)
        {
            this->m_str = t.m_str;
        }
    
        QString m_str;
    };
    
    Q_DECLARE_METATYPE(Text);        //声明该类

    在connect连接信号槽之前调用RegisterMetaType<Text>("Text");告诉QT,Text类型的别名为"Text",当然也可以改为其他别名.

    比如:

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        qRegisterMetaType<Text>("Text");
        MyThread t;
        QObject::connect(&t,SIGNAL(send(Text)),&w,SLOT(recv(Text)));
        t.start();
        w.show();
        return a.exec();
    }
  • 相关阅读:
    Uncaught TypeError: Cannot read property 'PRINT_INIT' of undefined user:100
    haproxy 负载elasticsearch 切换
    高德地图-展示多个信息窗口
    elasticsearh 中每个节点中需要有相同的插件
    haporxy 负载elasticsearch
    AngularJS之ng-if指令
    文件上传并展示上传文件
    json编解码
    Grok 正则捕获
    logstash date插件介绍
  • 原文地址:https://www.cnblogs.com/lifexy/p/14049698.html
Copyright © 2011-2022 走看看