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

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

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

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

  • 相关阅读:
    C#开发微信门户及应用(6)--微信门户菜单的管理操作
    C#开发微信门户及应用(5)--用户分组信息管理
    Django
    Django
    Django
    Django
    Django
    Django
    6.1
    Django
  • 原文地址:https://www.cnblogs.com/Wangjiaq/p/9220517.html
Copyright © 2020-2023  润新知