【linux】【qt5】【信号槽示例】
什么叫信号槽:
信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
信号槽的作用:
一般情况下信号槽做监视作用,对于新手则更多是窗体间的信息传递。父窗体点击事件在子窗体显示文本,子窗体点击事件关闭父窗体之类的。
信号槽格式:
connect(sender, signal, receiver, slot);
connect(Sender,SIGNAL(signal),Receiver,SLOT(slot));
connect(sender,SIGNAL(signal),receiver,SLOT(slot),Qt::DirectConnection);
参数:
- sender:发出信号的对象(一般为ui控件或者窗体对象)。
- signal:发送对象发出的信号(程序运行到这个地方,就会执行槽函数)。
- receiver:接收信号的对象(那个对象接受信号,本窗体的话就是this)。
- slot:接收对象在接收到信号之后所需要调用的函数(槽函数)。
声明:
signals:
void sendData(QString);//声明信号。
private slots:
void receiveData(QString data);//声明槽函数。
信号槽的格局:
一个信号可以对应多个槽函数,多个信号也可以对应一个槽函数。
示例:
点击父窗体的按钮,将获取到的文本框的值传给子窗体。
#ifndef DIALOG_H
#define DIALOG_H #include <QDialog>
#include "dialog2.h" namespace Ui {
class Dialog;
} class Dialog : public QDialog
{
Q_OBJECT public:
explicit Dialog(QWidget *parent = );
~Dialog(); private slots:
void on_pushButton_clicked(); signals:
void sendData(QString);//定义信号 private:
Ui::Dialog *ui;
Dialog2 *dlg2;//定义子窗体对象
}; #endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h" Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this); dlg2 = new Dialog2(this);//对象用new是为了实现非模态对话框,this用了对象树(即非模态对话框父窗体关闭,子窗体也关闭)
connect(this, SIGNAL(sendData(QString)), dlg2, SLOT(receiveData(QString)));//构造一个信号槽,这个多方构造函数里面。
} Dialog::~Dialog()
{
delete ui;
} void Dialog::on_pushButton_clicked()
{
emit sendData(ui->lineEdit->text()); //获取lineEdit的输入并且发射信号
dlg2->show();//show出子窗体
}
#ifndef DIALOG2_H
#define DIALOG2_H #include <QDialog> namespace Ui {
class Dialog2;
} class Dialog2 : public QDialog
{
Q_OBJECT public:
explicit Dialog2(QWidget *parent = );
~Dialog2(); private slots:
void receiveData(QString data);//槽函数,接受到信号后做处理 private:
Ui::Dialog2 *ui;
}; #endif // DIALOG2_H
#include "dialog2.h"
#include "ui_dialog2.h" Dialog2::Dialog2(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog2)
{
ui->setupUi(this);
} Dialog2::~Dialog2()
{
delete ui;
} void Dialog2::receiveData(QString data)
{
ui->textEdit->setText(data); //获取传递过来的数据
}
父窗体里面2个控件:按钮和输入框。
子窗体一个空间:文本框。
信号槽的断开:
信号槽在出生就一直处于监视状态,一旦有信号就执行槽函数,有时间我们不想让他执行怎么办,那就断开这个信号槽吧。
[static] bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
disconnect(myObject, 0, 0, 0);
myObject->disconnect();
disconnect(myObject, SIGNAL(mySignal()), 0, 0);
myObject->disconnect(SIGNAL(mySignal()));
disconnect(myObject, 0, myReceiver, 0);
想让信号槽只执行一次,那就把断开放到槽函数里面吧。执行到槽函数就断开,哈哈。
后记:
信号槽对于喜欢qt的是在是太重要了。对于qt也是太重要了,但这个核心也不是一天两天就能学会的,上面示例也就是起到抛砖引玉的效果。先挺过过去吧。
读者加油。
【linux】【qt5】【信号槽示例】的更多相关文章
- Qt 学习之路 2(16):深入 Qt5 信号槽新语法
Qt 学习之路 2(16):深入 Qt5 信号槽新语法 豆子 2012年9月19日 Qt 学习之路 2 53条评论 在前面的章节(信号槽和自定义信号槽)中,我们详细介绍了有关 Qt 5 的信号 ...
- Qt 学习之路:深入 Qt5 信号槽新语法
在前面的章节(信号槽和自定义信号槽)中,我们详细介绍了有关 Qt 5 的信号槽新语法.由于这次改动很大,许多以前看起来不是问题的问题接踵而来,因此,我们用单独的一章重新介绍一些 Qt 5 的信号槽新语 ...
- Qt5中的信号槽
Qt4中的信号槽 Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signal和slot声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...
- Qt5信号和槽机制
信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被 ...
- Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)
一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...
- 我的QT5学习之路(四)——信号槽
一.前言 前面说了Qt最基本的实例创建.控件以及工具集的介绍,相当于对于Qt有了一个初次的认识,这次我们开始认识Qt信号通信的重点之一——信号槽. 二.信号槽 信号槽是 Qt 框架引以为豪的机制之一. ...
- [转]QT子线程与主线程的信号槽通信-亲测可用!
近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽 ...
- Qt5 信号重载
下面以最常用的QComboBox为例说明. [1]Qt4风格的connect 示例代码: connect(ui->comboBox, SIGNAL(activated(int index)), ...
- Qt 学习之路 2(5):自定义信号槽
Home / Qt 学习之路 2 / Qt 学习之路 2(5):自定义信号槽 Qt 学习之路 2(5):自定义信号槽 豆子 2012年8月24日 Qt 学习之路 2 131条评论 上一节我们详 ...
随机推荐
- c++容器简单总结
数据结构 描述 实现头文件 向量(vector) 连续存储的元素 <vector> 列表(list) 由节点组成的双向链表,每个结点包含着一个元素 <list> 双队列(deq ...
- angularjs的input防抖
在开发中,遇到一个这样的需求,使用$scope.$watch()方法监听input值的改变,然后去$resource请求,但是请求过于频繁,需要做逻辑调整.代码如下: var timeout; $sc ...
- CMD开放3389端口
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t R ...
- GDOI#348大陆争霸[SDOI2010]最短路有限制条件
在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林·布拉 ...
- Draw.io
如何给类图增加一个字段? 选中一个字段,然后按 Ctrl +Enter 即可. 参考:Add row to class diagram - stackoverflow
- 使用IDEA打包scala程序并在spark中运行
一.首先配置ssh无秘钥登陆, 先使用这条命令:ssh-keygen,然后敲三下回车: 然后使用cd .ssh进入 .ssh这个隐藏文件夹: 再创建一个文件夹authorized_keys,使用命令t ...
- Java——反射:运行时的类信息
RTTI的使用 如果不知道某个对象的确切类型,RTTI会告诉我们,但是有一个限制:这个类型在编译时必须已知,这样才能使用RTTI识别它,并利用这些信息做一些有用的事情. 2.什么情况下需要反射 假设 ...
- 用xshell链接虚拟机上的linux
[步骤]一.安装VMware直接点击下一步即可 二.安装linux下载CentOS,在VMware中安装,这个网上有很多教程,这里就不赘述了. 三.配置要想连接上xshell,需要配置IP,将Linu ...
- 多线程 共享资源 同步锁 java
Java多线程编程:Lock synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 如果一个代码块被synchronized修饰了,当一 ...
- HelloDjango 第 08 篇:开发博客文章详情页
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按 ...