Qt信号和槽的个人总结
1、connect
- connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
这里用到了两个宏:SIGNAL() 和SLOT();通过connect声明可以知道这两个宏最后倒是得到一个const char*类型。
在qobjectdefs.h中可以看到SIGNAL() 和SLOT()的宏定义:
- #ifndef QT_NO_DEBUG
- # define QLOCATION "\0"__FILE__":"QTOSTRING(__LINE__)
- # define METHOD(a) qFlagLocation("0"#a QLOCATION)
- # define SLOT(a) qFlagLocation("1"#a QLOCATION)
- # define SIGNAL(a) qFlagLocation("2"#a QLOCATION)
- #else
- # define METHOD(a) "0"#a
- # define SLOT(a) "1"#a
- # define SIGNAL(a) "2"#a
- #endif
所以这两个宏的作用就是把函数名转换为字符串并且在前面加上标识符。
比如:SIGNAL(read())展开后就是"2read()";同理SLOT(read())展开后就是"1read()"。
- connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
- 实际上就是connect(sender,“2signal()”,receiver,“1slot())”;
2、slots,signals
Qt4源码定义的宏如下:
# define slots
#define signals protected
# define emit
再来看例子:
#ifndef COUNTER_H
#define COUNTER_H
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter();
private:
int m_value1;
int m_value2;
public slots:
void setValue1(int value);
void setValue2(int value);
signals:
void valueChanged1(int newValue);
void valueChanged2(int newValue);
};
#endif // COUNTER_H
注意,头文件定义的public slots和signals对C++编译器而言没有意义,会被替换成public和protected。他们的真实意图其实是给moc工具使用的,moc根据这些字符串关键字匹配,用来生成文件moc_Counter.cpp。Qt源码的构建过程是先moc转换然后再执行C++编译器。moc的目的是展开信号和槽,生成一个能让编译器读懂的源文件。
以下是生成的moc文件:
QT_BEGIN_MOC_NAMESPACE static const uint qt_meta_data_Counter[] = {
// content: 6, // revision //指明moc生成代码的版本号:Qt4的moc生成的代码,该值是6,也就是相当于moc v6;Qt5则是7 0, // classname //类名的索引,在数组qt_meta_stringdata_Counter的起始下标是0 0, 0, // classinfo 4, 14, // methods //有4个函数(2个信号函数,2个槽函数);函数的描述在数组qt_meta_data_Counter的起始下标是14 0, 0, // properties 0, 0, // enums/sets 0, 0, // constructors 0, // flags 2, // signalCount //信号函数的数量
// signals: signature, parameters, type, tag, flags 18, 9, 8, 8, 0x05, //信号的索引,在数组qt_meta_stringdata_Counter的起始下标是18,flags:0x05表示是信号 37, 9, 8, 8, 0x05, //同上
// slots: signature, parameters, type, tag, flags 62, 56, 8, 8, 0x0a, //槽的索引,在数组qt_meta_stringdata_Counter的起始下标是62,flags:0x0a表示是槽
77, 56, 8, 8, 0x0a, //同上
0 // eod };
static const char qt_meta_stringdata_Counter[] = { "Counter\0\0newValue\0valueChanged1(int)\0" "valueChanged2(int)\0value\0setValue1(int)\0" "setValue2(int)\0" };
文章来源:
http://blog.csdn.net/oowgsoo/article/details/1529411 Qt源码分析之信号和槽机制
http://www.devbean.net/2012/12/how-qt-signals-and-slots-work/ Qt信号槽的实现
http://woboq.com/blog/how-qt-signals-slots-work.html How Qt Signals and Slots Work
http://mobile.51cto.com/symbian-270982_all.htm 详解QT源码之QT元对象系统和信号槽机制
http://mobile.51cto.com/symbian-288016.htm 解析关于Qt Quick宏学习教程
http://blog.csdn.net/superfpe/article/details/5782707 Qt的Signal和Slot机制(一)★
http://blog.csdn.net/superfpe/article/details/5788636 Qt的Signal和Slot机制(二)★
http://blog.csdn.net/ybjx111/article/details/8272405 QT QObject::connect函数的学习★
http://blog.csdn.net/libaineu2004/article/details/19476039
Qt信号和槽的个人总结的更多相关文章
- QT 信号与槽connect
QT 信号与槽connect QT 信号与槽connect connect函数调用几个限制 connect函数代码 QT中信号与槽的连接使用的connect函数是一个静态函数,在类QObject中定义 ...
- Qt 信号与槽
Qt信号与槽的理解 信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解.信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重 ...
- QT信号和槽
QT信号和槽 ============ 信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性.要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler) ...
- Qt信号与槽自动关联机制
参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...
- Qt信号与槽应用实例一
..... connect(m_pGlobelWidget,signal(globeControlClick(object,object)),this,slot(globeControlClick(o ...
- Qt 信号和槽函数
信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性.当某个信号被发射,就需要调用与之相绑定的槽函数.这与Windows下的消息机制类似,消息机制是基于回调函数.一个回调即是一个函数的 ...
- QT 信号与槽连接
转帖 http://www.cnblogs.com/cnhome/archive/2009/10/01/1577277.html 信号(SIGNAL)和槽(SLOT)是Qt编程的一个重要部分.这个机制 ...
- QT 信号与槽 QT简单加法器的实现
信号与槽 背景: 面向过程 模块之间低耦合设计(高内聚). 函数调用: 直接调用 回调调用(低耦合) 面向对象 模块之间低耦合设计(高内聚) 对象调用 直接调用 接口调用 QT: 信号与槽解决问题: ...
- 关于Qt信号与槽机制的传递方向性研究(结论其实是错误的,但是可以看看分析过程)
最近由于项目的需求,一直在研究Qt.信号与槽机制是Qt的一大特色,该机制允许两者间传递参数,依次来实现对象间的通信.这个参数会分别存在于信号的参数列表和槽函数的参数列表中.需要注意的是,若将槽函数绑定 ...
随机推荐
- Contest - 第10届“新秀杯”ACM程序设计大赛网络资格赛 赛后信息(晋级名单·正式版)
2014_acm_fresh_0057 刘畅 20131620 2014_acm_fresh_0099 汪哲 20132185 2014_acm_fresh_0086 陈顺 2014111776 20 ...
- Contest - 2014 SWJTU ACM 手速测试赛(2014.10.31)
题目列表: 2146 Problem A [手速]阔绰的Dim 2147 Problem B [手速]颓废的Dim 2148 Problem C [手速]我的滑板鞋 2149 Problem D [手 ...
- OpenCV中OpenCL模块函数
It currently develop and test on GPU devices only. This includes both discrete GPUs(NVidia,AMD), as ...
- Selenium2(webdriver)入门之TestNG的使用
一.在Eclipse中安装TestNG 1.打开eclipse-->help-->Install New Software-->Add,输入Name和Location后,点击OK. ...
- Linux(CentOS 5.5) Redis安装
一,什么是redis redis是一个key-value存储系统. 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset ...
- 百度之星资格赛 hdu 4826 Labyrinth 动态规划
/********************* Problem Description 是一仅仅喜欢探险的熊.一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上 ...
- javascript eval和JSON之间的联系(转)
eval函数的工作原理 eval函数会评估一个给定的含有JavaScript代码的字符串,并且试图去执行包含在字符串里的表达式或者一系列的合法的JavaScript语句.eval函数将把最后一个表达式 ...
- NYOJ 16 矩形嵌套(动态规划)
矩形嵌套 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅 ...
- Redmine backlogs 升级
刚装完1.0.3两天,1.0.4发布了,乘项目还没有开始,赶快升级.升级过程 1.设置环境变量: RAILS_ENV=production export RAILS_ENV 2. 获取最新代码: cd ...
- springmvc 基础
在最简单的springmvc应用程序中,控制器是唯一需要在java web部署描述文件(web.xml)中配置的servlete(springmvc的控制器是Dispatcher Servlet).每 ...