您的位置:首页 > 其它

线程中通过信号和槽函数传递信息的时候,由于用到了自己定义的参数结构,所以使用qRegisterMetaType

2017-12-07 10:41 651 查看
如果是自己定义的类型如果想使用signal/slot来传递的话,则没有这么简单。直接使用的话,会产生下面这种错误:
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&)));    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐