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();
    }
  • 相关阅读:
    HDU 5273 Dylans loves sequence 暴力递推
    HDU 5285 wyh2000 and pupil 判二分图+贪心
    HDU 5281 Senior's Gun 贪心
    HDU 5651 xiaoxin juju needs help 逆元
    HDU 5646 DZY Loves Partition
    HDU 5366 The mook jong
    HDU 5391Z ball in Tina Town 数论
    HDU 5418 Victor and World 允许多次经过的TSP
    HDU 5642 King's Order dp
    抽屉原理
  • 原文地址:https://www.cnblogs.com/lifexy/p/14049698.html
Copyright © 2011-2022 走看看