• qt中信号与槽机制


    一. 简介

    就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。

    信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。

    • 信号

    当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。

    用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。

    • 信号与槽的连接

    所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。

    connect(sender, SIGNAL(signal), receiver, SLOT(slot));

    其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。

    二. 特点

    • 一个信号可以连接多个槽

    当信号发射时,会以不确定的顺序一个接一个的调用各个槽。

    • 多个信号可以连接同一个槽

    即无论是哪一个信号被发射,都会调用这个槽。

    • 信号直接可以相互连接

    发射第一个信号时,也会发射第二个信号。

    • 连接可以被移除

    这种情况用得比较少,因为在对象被删除时,Qt会自动移除与这个对象相关的所有连接。语法如下:

    disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));

    三. 应注意的问题

    1. 信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如 , 在前面给出的例子中如果在 mySlot() 槽函数中加上语句 emit mySignal() 即可形成死循环。
    2. 如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是按照connect的顺序的。
    3. 宏定义不能用在 signal 和 slot 的参数中。
    4. 信号和槽的参数个数与类型必须一致。

    四、源码举例

    #include "gettime.h"

    #include "ui_gettime.h"
    #include <QTime>
    
    
    GetTime::GetTime(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::GetTime)
    {
        ui->setupUi(this);
        connect(ui->pBtnGetTime,SIGNAL(clicked()),this,SLOT(currentTime()));
        connect(this,SIGNAL(getData(QString)),ui->lblDisPlayTime,SLOT(setText(QString)));
    }
    
    
    GetTime::~GetTime()
    {
        delete ui;
    }
    void GetTime::currentTime()
    {
        emit getData(QTime::currentTime().toString("hh:mm:ss"));
    }
  • 相关阅读:
    多线程总结三:控制线程
    ios -- 为导航栏添加播放动画
    IOS -- UITableView里面点击一个cell改变其他cell的设置
    IOS -- UICollectionView里面的cell点击,点击一个cell改变其他cell的状态
    ios -- Masonry 更新约束
    IOS--按钮里面 左边文字右边图片的设置
    IOS--时间 NSDate,NSTimeInterval的一些转换
    IOS--通过宽度算高度
    iOS App中添加半透明新手指引
    IOS--解决tableview里面cell 文本输入框键盘遮盖的问题
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/5511245.html
Copyright © 2020-2023  润新知