对信号与槽的一点学习总结
来源:互联网 发布:外国人用淘宝 编辑:程序博客网 时间:2024/05/14 04:00
最近学习了Linux的高编和网络编程,在Linux中敲代码和之前在QT中敲的感觉是不一样的,因为QT好多函数都已经封装好了,只要了解这个函数是干嘛用的,函数里的参数是什么就可以了,非常的方便,在学习QT的时候,老师曾说过,如果不会用信号与槽,那就不能说自己学过QT,为什么呢,因为QT中大量的运用了信号与槽,来实现大部分功能,所以可以说信号与槽就是QT的精髓,下面我将对信号与槽进行一下总结。
首先简单回顾一下什么是信号、什么是槽。信号一般是用来传参或者是一种逻辑的调用者。槽 :是用来接收信号,并且完成信号想要实现的功能。所以可以看出,信号与槽是一种高级接口,实现对象之间的通信。
</pre><p> 用一个小例子来阐述信号与槽的基本使用。 </p><p> 1.如何声明信号与槽:代码如下</p><p> </p><pre class="cpp" name="code">#ifndef MYSIGNAL_H#define MYSIGNAL_H#include <QWidget>namespace Ui {class Mysignal;}class Mysignal : public QWidget{ Q_OBJECTpublic: explicit Mysignal(QWidget *parent = 0); ~Mysignal();signals: void signalsend();private slots: void receivesignal(); void on_lineEdit_returnPressed(); void receivesignal2();private: Ui::Mysignal *ui;};#endif // MYSIGNAL_H
能看出哪一句是声明信号的吗?没错,就是signals:
void signalsend(); 这句。
private slots:
void receivesignal();
void on_lineEdit_returnPressed();
void receivesignal2(); 这三句则是用来声明槽函数的。槽函数必须要有函数体,而信号只需要声明即可不需要写函数体。
2.信号和槽函数的连接。
代码如下:
#include "mysignal.h"#include "ui_mysignal.h"Mysignal::Mysignal(QWidget *parent) : QWidget(parent), ui(new Ui::Mysignal){ ui->setupUi(this); connect(this,SIGNAL(signalsend()),SLOT(receivesignal())); connect(this,SIGNAL(signalsend()),SLOT(receivesignal2()));}Mysignal::~Mysignal(){ delete ui;}void Mysignal::on_lineEdit_returnPressed(){ emit signalsend();}void Mysignal::receivesignal(){ ui->textEdit->setText("这是第一个接收信号的槽"+ui->lineEdit->text());}void Mysignal::receivesignal2(){ ui->lineEdit_2->setText("这是第二个接收信号的槽"+ui->lineEdit->text());}
①.转到槽。转到槽应用的比较多,因为只需要右键创建,一般用到pushbutton的时候往往配合转到槽来进行对象之间的通信。 这里首先将lineEdit 转到槽,槽有很多选项,这里我们选用returnPress();这个槽函数的效果就是你按回车键就可以完成输入。那么我们在槽函数里主要做一件事情,就是发送一个信号:发送信号要用emit +之前声明定义的信号,即emit signalsend();
②.连接槽函数。使用connect语句进行连接,connect(this,SIGNAL(signalsend()),SLOT(receivesignal()));
connect(this,SIGNAL(signalsend()),SLOT(receivesignal2()));
需要说一下connect()括号中的参数,第一个参数this是对象指针,this就是指当前你正在使用的这个类的对象指针,如果说你的信号和槽在同一个类里面,那么第三个参数就可以不再声明this。第二个参数是信号,第四个参数是槽,需要注意的事关键字SIGNAL,SLOT都需要大写。
③.构建槽函数。这里我们将一个信号连到两个槽中,所以要写两个槽函数,并且在头文件中需要声明。(一个信号可以连接一个或者多个槽函数,一个槽函数也可以被多个信号来连接,这些都是可以的。)
在槽函数体内,做了一下简单的处理,将lineEdit中的内容传递到textEdit 和lineEdit2中去,这样当你写一些字进去按回车就可以在textEdit 个lineEdit2中显示了,这是两个不同的组件,却是由一个信号来激发产生的。
下面在将这个过程简单捋顺一下:首先在页面中的lineEdit中打字,然后按回车,lineEdit的槽函数中发送一个信号给textEdit和lineEdit,告诉它们,现在需要你们两个槽函数干活了,当两个槽函数收到这个信号后,开始执行槽函数内部的程序,即将lineEdit中的文字set到textEdit中和lineEdit2中,这样就完成了这个小例子的全部内容
总结: ① 当一个信号连接多个信号槽时,槽函数会被调用,但是哪个槽函数先被执行呢?答案是随机的。
② 当多个信号连接到同一个槽函数时,任何一个信号发出emit,槽函数都会被执行。
③ 当不需要信号与槽连接的时候可以断开连接,用disconnect();如上例中,如果想将sendsignal 与receivesignal断开的话,可以写成
disconnect(this,SIGNAL(sendsignal()),SLOT(receivesignal()));这样你再按回车,lineEdit中的数据也不会显示到lineEdit2和textEdit中去了。
另外有几种情况必须使用diconnect()函数:1.断开与某个对象相关联的任何对象。
2.断开与某个特定信号的任何关联。
3.断开两个对象之间的关联。
经过一系列的学习,从一开始的一知半解,到现在的熟练掌握,汇文的宋老师给予了我很多的帮助,有不懂得可以去看一下网址 www.huiwen.com点击打开链接
- 对信号与槽的一点学习总结
- 学习fifo管道,对read的一点总结
- 对tpmm的一点总结
- 对Log4net的一点总结
- 对jquery的一点总结
- 对3G的一点总结
- [总结]对JFace的一点总结
- [总结]对JFace的一点总结
- Qt信号与槽的进一步学习
- 关于xml学习的一点思考与总结
- 我对Qt中信号与槽的误解!!
- 对Sublime的一点简单的总结
- 对PCA的学习与总结
- Qt总结: 信号与槽
- 学习htmlcontrol的一点总结
- 学习QTP的一点总结
- 学习SSD4的一点总结
- jquery学习的一点总结
- ORACLE 中ROWNUM用法总结! (转)
- 详解Spring3基于Annotation的依赖注入实现
- 关于暑期集训第一次测试的总结
- 已知随机数函数rand7(),如何构造rand10()函数
- MFC自动登陆网页,post提交UTF8数据
- 对信号与槽的一点学习总结
- 八大排序算法-归并排序
- [HDOJ 4550] 卡片游戏
- JavaWeb学习笔记:ServletConfig()和ServletContext()
- 哈希表查找 — 拉链法
- hdoj 1013 (没有体会到需要大数)
- HDU 3062 Party
- 使用MathJax在HTML中显示LaTeX
- [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第八章 Foudation Kit 介绍