`
qimo601
  • 浏览: 3443577 次
  • 性别: 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

分享到:
评论

相关推荐

    使用纯C++信号槽实现代码

    总之,"使用纯C++信号槽实现代码"的项目是一个深入理解事件驱动编程和对象间通信的好实践。通过这种方式,开发者可以在不依赖特定库的情况下,复用和扩展Qt的优秀设计,提高代码的可读性和可维护性。这不仅有助于...

    信号槽开源库.rar

    信号槽是C++编程中的一种设计模式,常用于Qt、Qml等库中,用于对象间的通信。在C++中实现信号槽机制可以提供...通过学习和使用这个库,开发者可以深入理解信号槽的概念,将其应用到自己的项目中,提升软件设计的质量。

    MFC创建窗口类v1.6(简单模仿Qt的信号槽机制,并对消息处理优化)

    在本文中,我们将深入探讨如何使用MFC(Microsoft Foundation Classes)框架来创建窗口类,并结合Qt的信号槽机制实现消息处理的优化。MFC是微软为C++开发Windows应用程序提供的一种库,它提供了丰富的类库,简化了...

    QT 原理2 信号槽的连接1

    在深入理解QT原理时,特别是信号槽的连接存储结构,我们需要关注以下几个关键点: 1. **信号槽的存储结构**: 在`QObject`类中,有一个名为`d_ptr`的智能指针,指向`QObjectData`的实例,实际上是`QObjectPrivate`...

    Qt中线程跟信号槽的关系

    本文将深入探讨Qt中的线程与信号槽的关系,以及如何在多线程环境中有效地利用它们。 首先,线程是操作系统分配CPU时间的基本单元,它允许程序同时执行多个任务。在Qt中,我们可以使用QThread类来创建和管理线程。...

    以自定义数据作为信号槽的参数

    在QT编程中,信号与槽是其核心特性之一,它提供了一种强大的对象间通信机制。本示例探讨的主题是如何将自定义数据类型...通过查看和分析这些代码,你将更深入地理解如何在QT中有效地使用自定义数据作为信号槽的参数。

    Qt信号槽中的信号传递对比

    本文将深入探讨在Qt信号槽中不同参数传递方式——值传递和引用传递的区别,以及如何在实际应用中选择合适的传递方式。 首先,我们要理解信号和槽的基本概念。信号是对象在特定事件发生时发出的通知,而槽则是响应...

    03 Qt信号槽使用及其原理.zip

    总之,“03 Qt信号槽使用及其原理”资料包将引导你深入理解Qt的核心特性,帮助你在构建GUI应用时更加得心应手。通过理论与实践相结合的方式,你可以掌握这个强大的工具,并将其应用于实际的软件开发中。随着对信号槽...

    Qt学习之路(1-60)

    进一步学习Qt,需要深入理解信号槽机制。在“深入了解信号槽”部分,学习者将接触到信号槽的高级特性,例如在不同线程之间安全地使用信号槽。 ### Meta-Object系统和MainWindow Qt的Meta-Object系统是Qt反射机制的...

    Qt thread pool 线程池样例,信号槽,跨线程 lambda

    在本文中,我们将深入探讨Qt库中的线程池(Thread Pool)机制,以及如何结合使用信号槽(Signals and Slots)和跨线程的lambda表达式。这些技术在多线程编程中扮演着至关重要的角色,特别是在GUI应用中,能够帮助...

    021 QT信号槽概念原理讲解.7z

    QT信号槽是Qt框架中的一个核心特性,它提供了一种对象间通信的机制,使得不同对象之间能够方便地进行交互。在Qt编程中,信号和槽的概念是理解并使用Qt库进行事件驱动编程的关键。 首先,让我们深入理解“信号”...

    Qt信号槽使用

    本篇文章将深入探讨Qt信号槽的使用,以及如何在主窗口与子窗口之间传递内容。 首先,理解Qt信号槽的概念。信号是对象在特定事件发生时发出的通知,而槽是响应这些通知的函数。当一个信号被触发时,可以连接到一个或...

    Qt核心机制、Qt元对象系统、Qt信号槽原理

    通过深入理解 Qt Core 的这些核心机制,开发者可以更好地利用 Qt 构建高效、健壮的应用程序。无论是桌面应用、移动应用还是嵌入式系统,Qt Core 都提供了一套强大而全面的工具集。不断学习和探索 Qt Core 的源码,...

    信号与槽的实际例程

    3. **信号和槽的类型匹配**:理解信号和槽参数的类型需要一致,否则连接无法建立。 4. **信号和槽的连接方式**:有直接连接和Queued连接两种方式,理解它们的区别,尤其是多线程环境下。 5. **信号和槽的动态连接*...

    qt的信号槽机制的例子

    QT框架的信号槽机制是其核心特性之一,它提供了一种在对象间通信的优雅方式。这个机制使得在Qt应用程序中实现事件驱动编程变得简单高效。...理解和熟练使用信号槽机制是成为Qt开发专家的关键步骤。

    QT信号与槽机制浅析

    本文将对Qt中的信号与槽机制进行深入探讨,包括其基本概念、工作原理以及应用场景等。 #### 二、信号与槽的基本概念 在图形界面编程中,常常需要解决一个问题:如何在不同的对象之间传递信息,以便这些对象能够...

    C语言实现的信号槽模块.zip

    通过阅读和分析这个源码,我们可以深入理解作者是如何在C语言中实现信号槽机制的。 总的来说,C语言实现的信号槽模块是一项挑战性的任务,需要对C语言的底层机制有深刻的理解,包括内存管理、数据结构和函数指针等...

    自编qt入门小例程(新建窗口及信号槽)

    这个“自编qt入门小例程”旨在帮助初学者理解和掌握Qt的基本操作,包括创建窗口、使用UI设计器以及信号槽机制。 首先,我们要理解Qt中的窗口部件。窗口部件是构成GUI的基本元素,如按钮、文本框、标签等。Qt提供了...

    QT静态单例管理信号和槽

    这里我们将深入探讨如何在Qt中实现静态单例以及如何利用它来管理信号和槽。 首先,理解单例模式的概念至关重要。单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在Qt中,我们通常...

    Qt 信号槽介绍

    在实际开发中,了解和熟练掌握Qt的信号槽机制对于创建响应式、可维护的应用程序至关重要。信号槽机制不仅限于GUI事件处理,也可以用于任何需要对象间通信的场景,如网络通信、数据处理等。通过深入学习和实践,...

Global site tag (gtag.js) - Google Analytics