什么叫信号槽:

  信号槽是 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);

  参数:

  1.    sender:发出信号的对象(一般为ui控件或者窗体对象)。
  2.   signal:发送对象发出的信号(程序运行到这个地方,就会执行槽函数)。
  3.   receiver:接收信号的对象(那个对象接受信号,本窗体的话就是this)。
  4.   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】【信号槽示例】的更多相关文章

  1. Qt 学习之路 2(16):深入 Qt5 信号槽新语法

    Qt 学习之路 2(16):深入 Qt5 信号槽新语法  豆子  2012年9月19日  Qt 学习之路 2  53条评论 在前面的章节(信号槽和自定义信号槽)中,我们详细介绍了有关 Qt 5 的信号 ...

  2. Qt 学习之路:深入 Qt5 信号槽新语法

    在前面的章节(信号槽和自定义信号槽)中,我们详细介绍了有关 Qt 5 的信号槽新语法.由于这次改动很大,许多以前看起来不是问题的问题接踵而来,因此,我们用单独的一章重新介绍一些 Qt 5 的信号槽新语 ...

  3. Qt5中的信号槽

    Qt4中的信号槽 Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signal和slot声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...

  4. Qt5信号和槽机制

    信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被 ...

  5. Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)

    一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...

  6. 我的QT5学习之路(四)——信号槽

    一.前言 前面说了Qt最基本的实例创建.控件以及工具集的介绍,相当于对于Qt有了一个初次的认识,这次我们开始认识Qt信号通信的重点之一——信号槽. 二.信号槽 信号槽是 Qt 框架引以为豪的机制之一. ...

  7. [转]QT子线程与主线程的信号槽通信-亲测可用!

    近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽 ...

  8. Qt5 信号重载

    下面以最常用的QComboBox为例说明. [1]Qt4风格的connect 示例代码: connect(ui->comboBox, SIGNAL(activated(int index)), ...

  9. Qt 学习之路 2(5):自定义信号槽

    Home / Qt 学习之路 2 / Qt 学习之路 2(5):自定义信号槽 Qt 学习之路 2(5):自定义信号槽  豆子  2012年8月24日  Qt 学习之路 2  131条评论 上一节我们详 ...

随机推荐

  1. F#周报2019年第30期

    新闻 Fantomas 3.0 宣告.NET Core 3.0预览版7 .NET Core 3.0预览版7中ASP.NET Core与Blazor的升级 Visual Studio 2019版本16. ...

  2. javaweb入门----servlet简介

    servlet 上文已经了解了web服务器和http协议是怎么回事儿,并且也了解了浏览器与服务器之间的联系,现在要介绍一下服务器是如何处理来自客户端的请求的,这就是servlet. servlet:J ...

  3. ES 23 - 检索和过滤的区别 (query vs. filter)

    目录 1 filter与query示例 1.1 准备测试数据 1.2 搜索测试 2 filter与query的区别 2.1 相关度处理上的不同 2.2 性能上的对比 2.3 对比结论 本文以 ES 6 ...

  4. iOS Xcode6 新建OC Category文件

    首先:File -> New File 接下来界面如下,选择Objective-C File,然后Next 在这里选择 Category 即可

  5. ubuntu清理系统垃圾与备份

    虽然linux下不会有windows下的那么多垃圾和磁盘碎片!但还是会留下一些用不着的临时文件或是多次升级后的N个旧的内核! 1,非常有用的清理命令: sudo apt-get autoclean s ...

  6. 前端笔记之微信小程序(二){{}}插值和MVVM模式&数据双向绑定&指令&API

    一.双花括号{{}}插值和MVVM模式 1.1 体会{{}}插值 index.wxml的标签不是html的那些标签,这里的view就是div. {{}}这样的插值写法,叫做mustache语法.mus ...

  7. 【Java例题】8.2 手工编写字符串统计的可视化程序

      2. 手工编写字符串统计的可视化程序. 一个Frame窗体容器,布局为null,两个TextField组件,一个Button组件. Button组件上添加ActionEvent事件监听器Actio ...

  8. 【Java例题】2.2 分数类

    2.定义分数类,包括分子和分母变量.构造方法. 加减乘除方法.化简方法.值计算方法和显示分子和分母的方法. 然后编写一个主类,在其主方法中通过定义两个分数对象来 显示每一个分数的分子值.分母值.化简和 ...

  9. LR(1)语法分析器生成器(生成Action表和Goto表)java实现(二)

    本来这次想好好写一下博客的...结果耐心有限,又想着烂尾总比断更好些.于是还是把后续代码贴上.不过后续代码是继续贴在BNF容器里面的...可能会显得有些臃肿.但目前管不了那么多了.先贴上来吧hhh.说 ...

  10. JAVA基础知识(四):final关键字

    final关键字可以用于成员变量.本地变量.方法以及类. 2. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误. 3. 你不能够对final变量再次赋值. 4. 本地 ...