信号槽机制是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(
int,
const QString &)),
this, SLOT(processReply(int, const QString &)));
这里有一种例外情况,如果信号的参数多于槽的参数,那么这个参数之后的那些参数都会被忽略掉,例如:
connect(ftp, SIGNAL(rawCommandReply(
int,
const 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++信号槽实现代码"的项目是一个深入理解事件驱动编程和对象间通信的好实践。通过这种方式,开发者可以在不依赖特定库的情况下,复用和扩展Qt的优秀设计,提高代码的可读性和可维护性。这不仅有助于...
信号槽是C++编程中的一种设计模式,常用于Qt、Qml等库中,用于对象间的通信。在C++中实现信号槽机制可以提供...通过学习和使用这个库,开发者可以深入理解信号槽的概念,将其应用到自己的项目中,提升软件设计的质量。
在本文中,我们将深入探讨如何使用MFC(Microsoft Foundation Classes)框架来创建窗口类,并结合Qt的信号槽机制实现消息处理的优化。MFC是微软为C++开发Windows应用程序提供的一种库,它提供了丰富的类库,简化了...
在深入理解QT原理时,特别是信号槽的连接存储结构,我们需要关注以下几个关键点: 1. **信号槽的存储结构**: 在`QObject`类中,有一个名为`d_ptr`的智能指针,指向`QObjectData`的实例,实际上是`QObjectPrivate`...
本文将深入探讨Qt中的线程与信号槽的关系,以及如何在多线程环境中有效地利用它们。 首先,线程是操作系统分配CPU时间的基本单元,它允许程序同时执行多个任务。在Qt中,我们可以使用QThread类来创建和管理线程。...
在QT编程中,信号与槽是其核心特性之一,它提供了一种强大的对象间通信机制。本示例探讨的主题是如何将自定义数据类型...通过查看和分析这些代码,你将更深入地理解如何在QT中有效地使用自定义数据作为信号槽的参数。
本文将深入探讨在Qt信号槽中不同参数传递方式——值传递和引用传递的区别,以及如何在实际应用中选择合适的传递方式。 首先,我们要理解信号和槽的基本概念。信号是对象在特定事件发生时发出的通知,而槽则是响应...
总之,“03 Qt信号槽使用及其原理”资料包将引导你深入理解Qt的核心特性,帮助你在构建GUI应用时更加得心应手。通过理论与实践相结合的方式,你可以掌握这个强大的工具,并将其应用于实际的软件开发中。随着对信号槽...
进一步学习Qt,需要深入理解信号槽机制。在“深入了解信号槽”部分,学习者将接触到信号槽的高级特性,例如在不同线程之间安全地使用信号槽。 ### Meta-Object系统和MainWindow Qt的Meta-Object系统是Qt反射机制的...
在本文中,我们将深入探讨Qt库中的线程池(Thread Pool)机制,以及如何结合使用信号槽(Signals and Slots)和跨线程的lambda表达式。这些技术在多线程编程中扮演着至关重要的角色,特别是在GUI应用中,能够帮助...
QT信号槽是Qt框架中的一个核心特性,它提供了一种对象间通信的机制,使得不同对象之间能够方便地进行交互。在Qt编程中,信号和槽的概念是理解并使用Qt库进行事件驱动编程的关键。 首先,让我们深入理解“信号”...
本篇文章将深入探讨Qt信号槽的使用,以及如何在主窗口与子窗口之间传递内容。 首先,理解Qt信号槽的概念。信号是对象在特定事件发生时发出的通知,而槽是响应这些通知的函数。当一个信号被触发时,可以连接到一个或...
通过深入理解 Qt Core 的这些核心机制,开发者可以更好地利用 Qt 构建高效、健壮的应用程序。无论是桌面应用、移动应用还是嵌入式系统,Qt Core 都提供了一套强大而全面的工具集。不断学习和探索 Qt Core 的源码,...
3. **信号和槽的类型匹配**:理解信号和槽参数的类型需要一致,否则连接无法建立。 4. **信号和槽的连接方式**:有直接连接和Queued连接两种方式,理解它们的区别,尤其是多线程环境下。 5. **信号和槽的动态连接*...
QT框架的信号槽机制是其核心特性之一,它提供了一种在对象间通信的优雅方式。这个机制使得在Qt应用程序中实现事件驱动编程变得简单高效。...理解和熟练使用信号槽机制是成为Qt开发专家的关键步骤。
本文将对Qt中的信号与槽机制进行深入探讨,包括其基本概念、工作原理以及应用场景等。 #### 二、信号与槽的基本概念 在图形界面编程中,常常需要解决一个问题:如何在不同的对象之间传递信息,以便这些对象能够...
通过阅读和分析这个源码,我们可以深入理解作者是如何在C语言中实现信号槽机制的。 总的来说,C语言实现的信号槽模块是一项挑战性的任务,需要对C语言的底层机制有深刻的理解,包括内存管理、数据结构和函数指针等...
这个“自编qt入门小例程”旨在帮助初学者理解和掌握Qt的基本操作,包括创建窗口、使用UI设计器以及信号槽机制。 首先,我们要理解Qt中的窗口部件。窗口部件是构成GUI的基本元素,如按钮、文本框、标签等。Qt提供了...
在实际开发中,了解和熟练掌握Qt的信号槽机制对于创建响应式、可维护的应用程序至关重要。信号槽机制不仅限于GUI事件处理,也可以用于任何需要对象间通信的场景,如网络通信、数据处理等。通过深入学习和实践,...
这里我们将深入探讨如何在Qt中实现静态单例以及如何利用它来管理信号和槽。 首先,理解单例模式的概念至关重要。单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在Qt中,我们通常...