`
qimo601
  • 浏览: 3418270 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

深入了解信号槽

阅读更多
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/199461
信号槽机制是Qt编程的基础。通过信号槽,能够使Qt各组件在不知道对方的情形下能够相互通讯。这就将类之间的关系做了最大程度的解耦。
 
槽函数和普通的C++成员函数没有很大的区别。它们也可以使virtual的;可以被重写;可以使public、protected或者private的;可以由其它的C++函数调用;参数可以是任何类型的。如果要说区别,那就是,槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用。
 
connect()语句的原型类似于:
 
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
 
这里,sender和receiver都是QObject类型的,singal和slot都是没有参数名称的函数签名。SINGAL()和SLOT()宏用于把参数转换成字符串。
 
深入的说,信号槽还有更多可能的用法,如下所示。
 
一个信号可以和多个槽相连:
 
connect(slider, SIGNAL(valueChanged(int)),
              spinBox, SLOT(setValue(int))); 
connect(slider, SIGNAL(valueChanged(int)),
              this, SLOT(updateStatusBarIndicator(int)));
 
注意,如果是这种情况,这些槽会一个接一个的被调用,但是它们的调用顺序是不确定的。
 
多个信号可以连接到一个槽:
 
connect(lcd, SIGNAL(overflow()),
              this, SLOT(handleMathError())); 
connect(calculator, SIGNAL(divisionByZero()),
              this, SLOT(handleMathError()));
 
这是说,只要任意一个信号发出,这个槽就会被调用。
 
一个信号可以连接到另外的一个信号:
 
connect(lineEdit, SIGNAL(textChanged(const QString &)),
              this, SIGNAL(updateRecord(const QString &)));
 
这是说,当第一个信号发出时,第二个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别。
 
槽可以被取消链接:
 
disconnect(lcd, SIGNAL(overflow()),
                 this, SLOT(handleMathError()));
 
这种情况并不经常出现,因为当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽。
 
为了正确的连接信号槽,信号和槽的参数个数、类型以及出现的顺序都必须相同,例如:
 
connect(ftp, SIGNAL(rawCommandReply(intconst QString &)),
              this, SLOT(processReply(intconst QString &)));
 
这里有一种例外情况,如果信号的参数多于槽的参数,那么这个参数之后的那些参数都会被忽略掉,例如:
 
connect(ftp, SIGNAL(rawCommandReply(intconst QString &)), 
            this, SLOT(checkErrorCode(int)));
 
这里,const QString &这个参数就会被槽忽略掉。
 
如果信号槽的参数不相容,或者是信号或槽有一个不存在,或者在信号槽的连接中出现了参数名字,在Debug模式下编译的时候,Qt都会很智能的给出警告。
 
在这之前,我们仅仅在widgets中使用到了信号槽,但是,注意到connect()函数其实是在QObject中实现的,并不局限于GUI,因此,只要我们继承QObject类,就可以使用信号槽机制了:
 
class Employee : public QObject 

        Q_OBJECT 
public
        Employee() { mySalary = 0; }  
        int salary() const { return mySalary; } 
 
public slots: 
        void setSalary(int newSalary); 
 
signals: 
        void salaryChanged(int newSalary); 
 
private
        int mySalary; 
};
 
在使用时,我们给出下面的代码:
 
void Employee::setSalary(int newSalary) 

        if (newSalary != mySalary) { 
                mySalary = newSalary; 
                emit salaryChanged(mySalary); 
        } 
}
 
这样,当setSalary()调用的时候,就会发出salaryChanged()信号。注意这里的if判断,这是避免递归的方式!还记得前面提到的循环连接吗?如果没有if,当出现了循环连接的时候就会产生无限递归。

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/199461

分享到:
评论

相关推荐

    qt图形库框架培训文档,全面学习理解深入qt入门文档

    qt图形库框架培训文档,全面学习理解深入qt入门文档,包括qt发展史,qt开发工具及使用介绍,元对象及属性方法,事件循环,信号与槽等等

    《Qt 学习之路 2》

    16 深入 Qt5 信号槽新语法 17 文件对话框 18 事件 19 事件的接受与忽略 20 event() 21 事件过滤器 22 事件总结 23 自定义事件 24 Qt 绘制系统简介 25 画刷和画笔 26 反走样 27 渐变 28 坐标系统 29 ...

    QT射击小游戏

    完成一个射击小游戏,这是 4.7.0 之前的版本的 Qt 源码中自带的一个范例程序,具体位置在 qtopia-core-opensource-src-4.3.5\...例,但是通过这个实例,可以使读者深入理解 QT 信号与槽,变换坐标系等较深层内容

    gnome-glib

    Gnome Glib-具有信号和插槽的基于C的对象和类型系统文献资料 安装不要单独安装此软件包。 而是安装Gnome::Gtk3 。 zef install Gnome::Gtk3 作者姓名: Marcel Timmerman ... 其他有用的模块,供他们深入了解和使用。

    PLC系统方案设计.doc

    此阶段一定要与 用户进行深入的沟通,确保分析的全面而准确。在控制系统设计时,往往需要达到一些 特定的指标和要求,即满足实际应用或是客户需求。在分析被控对象时,必须考虑这些 指标和要求。在全面的分析之后,...

    Mastering-GUI-Programming-with-Python:精通Python的GUI编程

    了解GUI应用程序中的元素如何与信号和插槽通信 学习样式化应用程序的技巧 使用QtSQL模块探索数据库驱动的应用程序 使用QPainter创建2D图形 使用QOpenGLWidget深入研究3D图形 使用QtNetwork和QtWebEngine构建网络和...

    精通qt4编程(源代码)

    较深入地分析了Qt对象模型的一些基本知识,涉及信号和槽机制、Qt元对象系统、属性系统和对象树机制,以及部件类型和部件的几何布局等内容。 35 \ 第4章 程序主窗口—— QMainWindow 卢传富 Qt应用程序的主窗口是由多...

    精通Qt4编程(第二版)源代码

    较深入地分析了Qt对象模型的一些基本知识,涉及信号和槽机制、Qt元对象系统、属性系统和对象树机制,以及部件类型和部件的几何布局等内容。 35 \ 第4章 程序主窗口—— QMainWindow 卢传富 Qt应用程序的主窗口是由...

    基于USB的实时数据采集系统设计--毕业设计开题报告.docx

    随着信息化带动工业化进程的逐步深入,电子计算机信息技术的不断发展和完善,采用单片机实现的数据采集系统的应用越来越多。随着工业化的进步,以前传统的采用人工进行数据记录登记已经远远不能满足现在工业化生产的...

    单片机到底有什么作用PDF文件讲解

    这些都是这个系统多年迭代累积下来的“车轮”,如果感兴趣的朋友可以深入的了解一下。uC/OS固然是好,但是真的有必要什么都用uC/OS么?我看未必,杀鸡何用宰牛刀。以下引用一位知友的留言:“2以前没学过操作系统,...

    Magic ARM 2410

    第1 章 MagicARM2410 实验箱硬件结构 1.1 功能特点...............................6 1.1.1 硬件资源.......................6 1.1.2 软件资源.......................7 1.1.3 可选硬件.......................8 ...

Global site tag (gtag.js) - Google Analytics