QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题

转载 2013年12月05日 13:18:42
       笔者原来一直在windows下编程,近期转QT。对于原windows下的自定义消息传送,在QT 下自定义信号与信号槽是一个完美解决方案。

但由于笔者是一个生手,对自定义信号与信号使用也不是一帆风顺。现将过程中遇到的问题及解决方案记录下来,便于日后查看。

       本文将从以下三个方面讲术:

       (1) 如何自定义信号与信号槽

       (2) 如何连接信号与信号槽

       (3) 如何解决在运行期间,连接信号与信号槽(Qt::QueuedConnection方式连接)问题。

 

详细过程:

       (1) 如何自定义信号与信号槽

                   不解释,直接上代码,如下:

                   ------------------------------------------------------------------------------------------------

#include <QObject>

class CMYClass : public QObject
{
 
public:
 XXXXXX

/**/
Q_OBJECT 
signals:       //自定义信号,不需要在cpp中实现
 int signal1(DWORD a);
 int signal2(char * tel,char * txt,char * timestamp);
 int signal3(BYTE a[5],BYTE b,BYTE c);
private slots: //自定义槽,接收信号,需要在cpp中实现
 int onSignal1(DWORD a);
 int onSignal2(char * tel,char * txt,char * timestamp);
 int onSignal3(BYTE a[5],BYTE b,BYTE c);
};

                   ------------------------------------------------------------------------------------------------

      (2) 如何连接信号与信号槽

                   代码

                   ------------------------------------------------------------------------------------------------

 //连接信号槽
 QObject::connect(this,SIGNAL(signal1(DWORD)),this,SLOT(onSignal1(DWORD)));
 QObject::connect(this,SIGNAL(signal2(char * ,char * ,char *)),this,SLOT(onSignal2(char * ,char * ,char *)));
 QObject::connect(this,SIGNAL(signal3(BYTE [5],BYTE ,BYTE )),this,SLOT(onSignal3(BYTE [5],BYTE ,BYTE )));

                   ------------------------------------------------------------------------------------------------

                   需要注意两点:(1)连接时必须写出参数类型,但是不能写参数名;

                                               (2)数组作为参数量,记录 XXX[ N],如下:

 //信号
 int signal3(BYTE a[5],BYTE b,BYTE c);
 //槽函数
 int onSignal3(BYTE *a,BYTE b,BYTE c);    
 //连接方法
 QObject::connect(this,SIGNAL(signal3(BYTE [5],BYTE ,BYTE )),this,SLOT(onSignal3(BYTE [5],BYTE ,BYTE )

     (3)如何解决在运行期间,连接信号与信号槽(Qt::QueuedConnection方式连接)问题。

               一般情况下上面连接方式不会出现问题,但是如果信号与槽在不同线程或Qt::QueuedConnection方式连接,可能会在连接期间报以下类似问题。

              QObject::connect: Cannot queue arguments of type 'BYTE[5]'
             (Make sure 'BYTE[5]' is registered using qRegisterMetaType().)

              出现如此问题,在于QT对数据类型未知,按照料提示在连接信号与槽之前,调用 qRegisterMetaType()解决。直接上代码,如下:

------------------------------------------------------------------------------------------------------------

 //连接信号槽
 qRegisterMetaType<DWORD>("DWORD");     //向注册自定义数据类型
 qRegisterMetaType<DWORD>("DWORD");
 qRegisterMetaType<BYTE>("BYTE");
 qRegisterMetaType<BYTE * >("BYTE[5]"); //请注意这一行,关于如何注册数组类型 (这样不行,最后槽传过来是指针的指针,求解决方法)
 QObject::connect(this,SIGNAL(signal1(DWORD)),this,SLOT(onSignal1(DWORD)),Qt::QueuedConnection);
 QObject::connect(this,SIGNAL(signal2(char * ,char * ,char *)),this,SLOT(onSignal2(char * ,char * ,char *)),Qt::QueuedConnection);
 QObject::connect(this,SIGNAL(signal3(BYTE [5],BYTE ,BYTE )),this,SLOT(onSignal3(BYTE [5],BYTE ,BYTE )),Qt::QueuedConnection);


转自:http://blog.csdn.net/yewenlin/article/details/8063316

【QT】信号槽传递自定义数据结构

定义一个结构体stuct myStuct { int a; float b; };通过信号槽传递该结构体connect(this, SIGNAL(m_signal(myStruct)), th...
  • Kelvin_Yan
  • Kelvin_Yan
  • 2017年04月11日 15:38
  • 1270

Qt 线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)

不跨线程的话,使用自定义的类型使用signal/slot来传递,没有什么问题。 但如果是跨线程的使用,则没有这么简单。 直接使用的话,会产生下面这种错误:(假定自定义类为MyClass) QObje...
  • xbnlkdbxl
  • xbnlkdbxl
  • 2017年02月24日 15:30
  • 1363

QT中自定义的信号和槽

使用自定义的信号和槽,需要注意以下几点: 1、类的声明和实现分别放在.h和.cpp文件中; 2、类声明中包含Q_OBJECT宏; 3、信号只要声明不要设计其的实现函数; 4、发射信号用emit关键字;...
  • Apple1985507
  • Apple1985507
  • 2010年03月27日 00:43
  • 26166

Qt多线程编程(4)——使用线程中自定义的信号和槽进行通信

Qt多线程程序设计中,可使用信号和槽进行线程通信。下面是一个简单的示例。 该程序实现了线程中自定义一个信号和槽,定时1秒发送信号,槽响应后打印一条信息。 #include #include ...
  • Zhangchen9091
  • Zhangchen9091
  • 2014年03月22日 12:49
  • 1129

Qt 自定义信号与槽

本文所示代码在windows xp + MingW3.4.2+ eclipse3.4+CDT5.0版本中调试通过     QT系统为我们提供功能非常全面信号处理机制,它的内制信号和槽已经非常全面,因此...
  • u013378306
  • u013378306
  • 2016年09月04日 12:33
  • 13804

自定义信号和槽

4.3.1 C++ 的沟通方式 C++编程中,经常遇到各个对象之间进行沟通的情况,需要将数据从一个对象传递给另一个对象来处理。大致的方法有如下几种: 接收端定义公有成员变量以供源端修改,然后接收端...
  • YZS_L_H
  • YZS_L_H
  • 2016年06月11日 17:38
  • 1493

Qt在信号中如何发送自定义结构体,或者发送多个自定义参数

昨天调试项目时,突然发现如下消息: QObject::connect: Cannot queue arguments of type 'ERROR_LEVEL' (Make sure 'ERROR_...
  • qq_20307987
  • qq_20307987
  • 2018年01月05日 20:17
  • 81

Qt多线程间信号和槽连接及自定义型信号参数

Qt 多线程的信号传递 QObject::connect(const QObject * sender, const char * signal, const QObject * receiver,...
  • OutManLee
  • OutManLee
  • 2012年04月04日 15:05
  • 4244

QT信号和槽使用自定义的类或结构体

#include //需要添加的头文件 qRegisterMetaType("CMessage*");//此行需要在connect函数使用之前注册,CMessage为自定义的类 connect...
  • rongyong
  • rongyong
  • 2015年08月11日 10:42
  • 2240

有关qt的信号槽错误的处理方法

C++使用qt的信号槽,进行vs编译常见错误分析 编译器常出现的提醒方式如下。 1>cmmwindow.obj : error LNK2001: unresolved extern...
  • yishiwei123
  • yishiwei123
  • 2014年05月27日 08:52
  • 1144
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
举报原因:
原因补充:

(最多只允许输入30个字)