信号槽机制是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
分享到:
相关推荐
《QT学习之路2-2020整理版》是一份详尽的QT开发教程,涵盖了从基础到进阶的多个方面。这份资料基于豆子大佬的博客内容进行整理,不仅包含原有的79章,还增加了豆子在2016年3月11日后更新的15章内容,共计94章,旨在...
《Qt学习之路2》不仅介绍了MainWindow等GUI组件的使用方法,还深入探讨了布局管理器、菜单栏、工具栏和状态栏的设置,这些都是构建复杂用户界面不可或缺的部分。 对于Qt的绘图系统,该书也进行了详细的介绍,包括画...
这个资源,"Qt学习之路2带目标可注释版pdf",显然是一本专注于Qt编程的教程,特别适合初学者或希望深入理解Qt5的开发者。教程更新至第41篇,意味着它涵盖了相当全面的基础知识和进阶主题。 Qt5是Qt框架的一个重大...
### Qt学习之路:核心知识点概览 #### 一、前言 - **Qt简介**:Qt是一个跨平台的C++图形用户界面应用程序开发框架。它不仅支持Windows、macOS、Linux等主流操作系统,还能用于开发嵌入式系统、移动设备应用(如...
### Qt学习之路知识点总结 #### 一、基础知识与入门 - **Hello, World!** - **知识点**:Qt环境搭建、第一个Qt程序编写、基本的窗口显示。 - **重要性**:作为Qt初学者的第一课,通过简单的示例程序帮助理解Qt的...
**《Qt 学习之路2》** 是对之前教程的全面更新和补充,旨在帮助读者深入了解 Qt 框架,并掌握其最新特性和高级功能。作者豆子希望通过该教程,使读者能够更好地利用 Qt 进行高效开发。此外,作者还鼓励读者直接阅读...
### Qt学习之路2.pdf知识点概览 #### 一、序言 ...通过以上内容的梳理,可以看出《Qt学习之路2.pdf》涵盖了Qt开发的基础知识到高级应用的各个方面,非常适合希望深入了解Qt框架的开发者阅读学习。
### QT学习之路2(带书签):深入理解与学习指南 #### 序章:启程新旅程 《QT学习之路2》是作者豆子基于多年经验与不断更新的技术趋势,精心打造的一部QT学习宝典。随着技术的发展,QT本身也在不断演进,从最初的...
7. **Meta-Object系统** —— 深入了解Qt的元对象系统,它是实现动态属性、信号槽等特性的关键。 8. **MainWindow** —— 掌握如何使用Qt的主窗口组件来搭建复杂的应用界面。 9. **菜单和工具条** —— 学习如何为...
这个“03 Qt信号槽使用及其原理”资料包专注于讲解Qt的核心特性之一——信号与槽机制。这一机制是Qt设计模式的核心,它允许程序员在类之间建立连接,使得当一个对象的某个事件发生时,可以自动触发另一个对象的相应...
在深入探讨文档内容前,需明确“Qt学习之路2”这篇文档的主要目的是指导初学者如何学习和掌握Qt框架,这是一个广泛应用于软件开发中的跨平台C++图形用户界面应用程序框架。文档由Andy_Liu整理,包含了大量的章节,从...
【QT学习之路(全集)】是一套全面的Qt学习资源,专为初学者设计,旨在帮助新手快速掌握Qt开发的基础知识和技能。Qt是一个跨平台的C++图形用户界面应用程序开发框架,由Qt Company提供支持,广泛应用于桌面、移动和...
QT学习之路2是针对Qt框架的一次全面更新和深化,主要针对初学者和有一定基础的开发者,旨在提供一套系统化的学习资源。Qt是一款强大的跨平台应用程序开发框架,它支持多种操作系统,包括Windows、Linux、macOS、...
QT学习视频3主要聚焦于C++与QT的联合开发,这一部分的学习内容是QT学习旅程中的重要阶段。QT是一个强大的跨平台应用开发框架,由Qt Company维护,广泛应用于桌面、移动以及嵌入式设备的软件开发。C++是QT的主要编程...
### QT学习之路知识点总结 #### 一、前言:为何选择Qt? - **Qt与C++ GUI编程**:Qt是C++的一种GUI编程框架,并非C++标准的一部分。相比之下,Java有内置的AWT/Swing支持,而C++提供了多种第三方库作为GUI编程的...
在实际开发中,了解和熟练掌握Qt的信号槽机制对于创建响应式、可维护的应用程序至关重要。信号槽机制不仅限于GUI事件处理,也可以用于任何需要对象间通信的场景,如网络通信、数据处理等。通过深入学习和实践,...
7. 深入了解信号槽 在初探信号槽的基础上,本节深入讲解了信号槽机制的高级用法和技巧。 8. META-OBJECT系统 Qt的META-OBJECT系统用于提供反射特性,支持信号和槽等Qt特性的实现。本节介绍了META-OBJECT系统的基础...