qt学习笔记(五)之浅析信号与槽进制

转载 2015年07月09日 15:32:52

一、原理

Qt的"信号与槽",笔者是这么理解的--"回调机制”。

在Gui用户界面中,往往有这种需求,“动作”一个窗口部件,需要激活其他的操作。这种功能,我们经常使用回调函数来实现。

在MINIGui中,也提供了一套类似的机制,就是postmessage、sendmessage。(呵呵,其实也是windows的机制啦~~)

信号与槽的关联有以下几种方式:

一个信号与一个槽关联;

一个信号与多个槽关联:槽函数的执行顺序是随机的,与关联的顺序无关;

多个信号与一个槽关联;

信号与信号关联:当第一个信号触发后,会激发Qt去发送第二个信号

二、函数解析

  1. QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, constchar * method, Qt::ConnectionType type = Qt::AutoConnection )  

信号与槽通过QObject::connect(..)进行关联。

send是信号的发送者,必须是一个QObject类对象。

singal就是一个信号,Qt本身提供了一些信号。例如按钮的clicked();对话框的accept()、reject()等等。

当对象的状态发生改变时,信号被某一个对象发射(emit)。只有定义过这个信号的类或其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被执行,就像一个正常的函数调用一样。

method是槽函数。

type定义了信号与槽的关联方式:

Qt::DirectConnection:信号发出去,等待槽函数返回才能继续执行之后的代码;

Qt::QueuedConnection:信号发出去,"就不管了",立即执行发送信号之后的代码;

而Qt::AutoConnection 相当于上面2个方式结合起来,当信号与槽在同一线程时,等同于Qt::DirectConnection;而在不同线程,效果等同于Qt::QueuedConnection。

这点和MNIGUI异曲同工。(GUI的基本原理是共通的~~~)

  1. QObject::connect(pushbutton, SIGNAL(clicked), label, SLOT(on_btn_slot()));  
上面的函数实例就是将信号与槽关联起来。

SIGNAL和SLOT都是宏,返回类型是(const char *)

注意点:
1、如果在应用程序加入了信号与槽,则必须在类声明加入Q_OBJECT宏。

  1. class MainWindow : public QMainWindow  
  2. {  
  3.     Q_OBJECT  
  4.   
  5. public:  
  6.     explicit MainWindow(QWidget *parent = 0);  
  7.     ~MainWindow();  
  8. public slots:  
  9.     void on_btn_slot();  
  10. private:  
  11.     Ui::MainWindow *ui;  
  12. };  

2、public slots意味着void on_btn_slot() 是槽函数。on_btn_slot()既可以当槽函数,也可以作为普通函数来使用。但要注意的一点就是,作为普通函数使用的时候,返回类型有效,而当成槽函数使用,Qt是忽略其返回类型的。

3、“参数对应”原则

信号的参数类型、个数与槽的参数类型、个数是“相同的”,不过槽的参数个数可以少于信号的参数个数,缺少的参数必须是最后n个参数。

4、宏定义不能用在signal和slot的参数中

5、构造函数不能用在signals或者slots声明区域内

6、函数指针不能作为信号或槽的参数

7、信号与槽不能有缺省参数

8、信号与槽也不能携带模板类参数

9、相关联的信号与槽是可以取消关联的。disconnect();

MIGUI的消息机制、Qt的信号与槽机制等都减少了应用程序的耦合度,良好的程序框架~~。虽然效率对于回调函数来说相对低下,~~~但是是可以忽略的。强大的windows开发消息机制,是吧~~亲!

三、信号与槽自动关联

我们通常手动关联信号与槽。Qt还提供了自动关联方法。

如果不是在(*.ui)创建的窗口部件,首先必须在类构造函数内加入下面一行代码。

  1. QMetaObject::connectSlotsByName(this);  
对于Qt窗口部件已经提供的信号,如果能按下面的规则命名槽函数,那么Qt就能够自动进行关联

void on<窗口部件名>_<信号名>(<信号参数>);

这里要注意 窗口部件名为objectname,与我们命名的窗口部件变量名是不一样的。

我们可以通过void QObject::setObjectName(constQString&name) 来设置窗口部件名

Qt信号和槽的实现揭秘

Qt信号和槽的实现揭秘 对于刚开始学习Qt的同学,对信号和槽的运行机制是非常难于理解的,这篇Blog 的目的就是解析掀开信号和槽的神秘面纱。 支持信号与槽机制的类必须派生于QObject,并且在类的...
  • zmm19861210
  • zmm19861210
  • 2013年06月06日 09:37
  • 2529

QT信号与槽的简单实例

假设基于这样的一个情况: 在某一个程序里有两个主要的两个逻辑功能部分---UI交互的功能块和用于网络通信的网络功能块。当网络中有新的消息到达时,网络功能块需要通知UI刷新信息的显示;当用户输入新的操...
  • vectim
  • vectim
  • 2017年05月18日 23:27
  • 284

QT 信号与槽 最简单例子

QT  信号与槽 最简单例子   main.cpp 和 my_head.h源码:   #ifndef MY_HEAD_H #define MY_HEAD_H #include #inc...
  • EastonWoo
  • EastonWoo
  • 2013年05月18日 20:13
  • 5027

vs2013中QT信号槽绑定

一、概述 由于是在vs2013中进行QT的开发,环境的搭建是:vs2013 、QT for windows with openGL、vs add-in插件。发现搭建好了之后,并不能像QT Creat...
  • GAMEloft9
  • GAMEloft9
  • 2015年06月08日 19:20
  • 1428

QT的信号与槽原理(经典)

QT的信号与槽原理(经典)   信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。 QT是一个跨...
  • linux_wgl
  • linux_wgl
  • 2014年06月22日 22:47
  • 1269

Qt信号槽分析总结

注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的。 1.先说Qt信号槽的几种连接方式和执行方式。 1)Qt信号槽给出了五种连接方式: Qt::AutoConnec...
  • Andy_93
  • Andy_93
  • 2016年09月28日 10:30
  • 1481

Qt信号与槽&标准对话框

(多图预警!) 一、模态对话框与非模态对话框 1.定义:模态对话框:在当前对话框激活的情况下不能与其他对话框进行交互;               非模态对话框:在当前对话框激活的情况下可以...
  • u013752202
  • u013752202
  • 2015年05月14日 00:41
  • 938

Qt信号与槽机制源码分析

在前一篇中,我翻译了一篇关于信号与槽机制详解的文章Qt信号与槽工作机制–译文。在这一篇文章中,我将根据自己的理解从Qt源码中分析该机制。建议在看本文章之前先去看看前面提到的译文或者直接看原文原文How...
  • encourage2011
  • encourage2011
  • 2015年05月28日 17:37
  • 2469

Qt信号与槽实现原理

有网友抱怨: 哪个大牛能帮帮我,讲解一下信号槽机制的底层实现? 不要那种源码的解析,只要清楚的讲讲是怎么发送信号,怎么去选择相应的槽,再做出反应。也就是类似于一个信号槽的相应流程。。。求解啊!!! 看...
  • fuyunzhishang1
  • fuyunzhishang1
  • 2015年09月10日 16:37
  • 9494

QT信号(SIGNAL)与槽(SLOT)

QT中的信号槽是QT框架中十分重要,同时也是十分特别的机制之一。对于它的理解,你可以把它当做Windows系统中的消息处理函数。比如,当一个按钮控件被单击了一下,那么它就会发出一个信号(signal)...
  • YZS_L_H
  • YZS_L_H
  • 2016年06月04日 15:14
  • 1114
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:qt学习笔记(五)之浅析信号与槽进制
举报原因:
原因补充:

(最多只允许输入30个字)