QT中的信号与槽
Posted wangjiaq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT中的信号与槽相关的知识,希望对你有一定的参考价值。
信号与槽是QT中很重要的机制,给大家分享一下我学习中的一些总结和体会。
信号和槽是一种高级接口,应用于对象之间的通信,是QT的核心特性,信号和槽是QT自行定义的一种通信机制,其本质就是函数。在 QT中信号和槽使得通信过程更加的简洁明了。信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的。所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改动其状态时,信号就由该对象发射出去,但是对象并不知道另一端是谁在接收这个信号。实现了信息封装。槽用于接收信号,是普通的对象成员函数。一个槽也不知道是否有所有信号和自己相连接。能将非常多信号和单个的槽进行连接,也能将单个的信号和非常多的槽进行连接。
信号:
当某个信号对其客户或所有者发生的内部状态发生改动,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,和其相关联的槽将被即时执行,就象一个正常的函数调用相同。如果存在多个槽和某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,不过执行的顺序是随机的、不确定的。信号的声明是在头文件中进行的,QT中使用signals关键字。
槽 :
槽是普通的C++成员函数,能被正常调用,唯一的特别之处是非常多信号能和其相关联。当和其关联的信号被发射时,这个槽就会被调用。槽能有参数,但槽的参数不能有缺省值。 槽也能够声明为虚函数
槽的声明也是在头文件中进行的,使用关键字slots修饰。
信号和槽的关联 :
1.手动关联:
通过调用QObject对象的connect函数来将某个对象的信号和另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。关于connect()函数:
connect(sender,
SIGNAL(signal), receiver,
SLOT(slot));它有四个参数,
sender是发射信号的对象指针, SIGNAL是发射的信号,receiver是接收信号的对象的指针,SLOT是要执行的槽
2.自动关联:
将关联函数整合到槽名中。自动关联的槽命由字符,发射信号的部件对象名和信号名组成。
实际举例:
在MyWidget类的头文件中,它是继承自QWidget,在类中添加的Q_OBJECT是一个Qt定义的宏,这个宏中包含了Qt中最重要的一个机制:也就是信号和槽的机制。由于 主操作控制器moc 只处理头文件中的标记了Q_OBJECT
的类声明,不会处理 cpp 文件中的类似声明。接着就是类的构造函数和析构函数的声明,后面声明了namespace Ui里的Widget 类的指针ui,以及showChildDialog()槽的声明。
在MyWidget类的cpp文件中,构造函数先初始化父类,接着初始化ui,之后的setupUi(this)是由.ui文件生成的类的构造函数,这个函数的作用是对界面进行初始化,它按照我们在Qt设计器里设计的样子把窗体画出来,把我们在Qt设计器里面定义的信号和槽建立起来。也可以说,setupUi是我们画界面和写程序之间的桥梁。然后使用的connect()函数将按钮的单击信号clicked()与新建的槽进行关联。
关于connect()函数:
解释一下就是发射信号的指针是ui,发射的信号是单击信号,接收信号的对象是当前MyWidget的对象,要执行的槽就是showChildDialog。
关于showChildDialog()的实现就是定义了一个以当前窗口为父窗口的窗口,然后显示出来。
点击显示子窗口:
如果要将信号和槽的关联自动实现则将槽名改为:on_showChildButton_clicked(),由字符on,发射信号的部件对象名和信号名组成。就不再需要connect()函数了。
有时需要信号槽来完成参数传递。带参数的信号槽在使用时,有几点需要注意的地方。
第一点:当信号与槽函数的参数数量相同时,它们参数类型要完全一致。
第二点:当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多余的参数会被忽略。
以上是关于QT中的信号与槽的主要内容,如果未能解决你的问题,请参考以下文章