QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
2013-12-05 13:18
2221 查看
笔者原来一直在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
但由于笔者是一个生手,对自定义信号与信号使用也不是一帆风顺。现将过程中遇到的问题及解决方案记录下来,便于日后查看。
本文将从以下三个方面讲术:
(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 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
- QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类
- Oracle自定义函数解决数据类型转换出错的问题
- SpringMVC Controller函数参数问题(就是作为方法的参数,以类名小写开头可以在JSP页面中获得该变量的数据 )
- SQL中函数 replace 的参数1的数据类型ntext无效的解决方法
- SQL中函数 replace 的参数1的数据类型ntext无效的解决方法
- Qt信号函数无法解析的问题解决方法
- fstream对象作为函数参数的问题汇总及解决方法
- 关于在用curl函数post网页数据时,遇上表单提交 type为submit 类型而且没有name和id时可能遇到的问题及其解决方法
- qtcpsocket调用write和read函数写数据乱码问题解决方法
- VS2005+ACCESS2003开发中遇到的“标准表达式中数据类型不匹配”问题解决方法
- 2.关于结构体以及结构体数组作为函数入口参数的方法(学习笔记)
- python通过装饰器检查函数参数数据类型的方法
- 解决BeanUtils传入date数据类型参数的异常问题
- 用va_start() va_end()函数解决不定参数问题(即,fun(...)实现方法)
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- Python 读Dict数据的方法,解决key 不在dict的问题,get()函数,setdefault()函数
- MyBatis 参数类型为String时常见问题及解决方法
- qt信号槽接收不到的情况(自定义数据类型+多线程)
- 使用<a>标签提交表单数据的问题以及获取session作为函数的参数调用的问题