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 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题

概述:          笔者原来一直在windows下编程,近期转QT。对于原windows下的自定义消息传送,在QT 下自定义信号与信号槽是一个完美解决方案。 但由于笔者是一个生手,对自定义...

qt信号槽接收不到的情况(自定义数据类型+多线程)

一般的基本数据类型,qt都认识,包括QString,所以信号和槽一般都可以正常使用。 今天发现一种情况,如果信号的参数是自定义的数据类型,并且在不同的线程中被发送,对应的槽就不会收到。 当然也有解决办...
  • ndzjx
  • ndzjx
  • 2017年08月04日 08:04
  • 154

如何在Qt中使用自定义数据类型

本文转载至: http://www.cnblogs.com/cute/archive/2011/03/01/1968245.html 如何在Qt中使用自定义数据类型 这里我们使用下面这...
  • plfl520
  • plfl520
  • 2012年08月07日 07:19
  • 983

MapReduce模型--自定义数据类型

  • 2013年05月28日 15:40
  • 81KB
  • 下载

Qt中菜单创建及自定义数据类型与QVariant互转

diagramtextitem.h: /**************************************************************************** ** ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
举报原因:
原因补充:

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