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()函数了。

有时需要信号槽来完成参数传递。带参数的信号槽在使用时,有几点需要注意的地方。

第一点:当信号与槽函数的参数数量相同时,它们参数类型要完全一致。

第二点:当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多余的参数会被忽略。

猜你喜欢

转载自www.cnblogs.com/Wangjiaq/p/9220517.html