Qt信号和槽

一、原理

  1. 信号和槽是QT 自行定义的一种通信机制,实现对象之间的数据交互。
  2. 当用户或系统触发了一个动作,导致某个控件的状态发生了改变,该控件就会发射一个信号,即调用其类中一个特定的成员函数(信号),同时还可能携带有必要的参数
  3. 槽和普通的成员函数几乎没有太多区别,可以是公有的、保护的或私有的,可以被重载,也可以被覆盖,其参数可以是任意类型,并可以像普通成员函数一样调用
  4. 槽函数与普通成员函数的差别并不在于其语法特性,而在于其功能。槽函数更多体现为对某种特定信号的处理,可以将槽和其它对象信号建立连接,这样当发射信号时,槽函数将被触发和执行,进而来完成具体功能。

二、信号的定义

        信号函数只需声明,不能写定义

class XX:public QObject{ QObject{
    Q_OBJECT
    signals: 
        void void signal_func signal_func signal_func(..);  // 信号函数
};

 三、槽函数的定义

        槽函数可以连接到某个信号上,当信号被发射时,槽函数将被触发和执行,另外槽函数也可以当做普通的成员函数直接调用

//槽的定义
class class XX:public QObject{ QObject{
    Q_OBJECT
    public slots: public slots:
        void void slot_func slot_func slot_func(...){...}// (...){...}//槽函数
};

四、信号和槽函数的连接

一般用法:

        例子:用 connect() 函数将 But 按钮的 clicked() 信号函数和 widget 窗口的 close() 槽函数关联起来;实现了“按下按钮会关闭窗口”的功能。

//构造函数
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
//例子:
connect(&But, SIGNAL(clicked()), &widget, SLOT(close()));

参数:
sender :信号发送对象指针
signal :要发送的信号函数,可以使用“SIGNAL(..) ”宏进行类型转换
receiver :信号的接收对象指针
method :接收信号后要执行的槽函数,可以使用“SLOT(..)”宏进行类型转换 
type:用于指定关联方式,默认的关联方式为 Qt::AutoConnection,通常不需要手动设定

新版本:                                                                                                                     

        Qt5 版本中,connect() 函数引入了新的用法,新版的 connect() 函数改进了指定信号函数和槽函数的方式,不再使用 SIGNAL() 和 SLOT() 宏。新版 connect() 函数关联 But 按钮的 clicked() 信号函数和 widget 窗口的 close() 槽函数,实现代码为:

//构造函数
QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
//例子
connect(&But, &QPushButton::clicked, &widget, &QWidget::close);

        

五、槽函数语法要求

一个信号可以被连接到多个槽(一对多)

QObject::connect(A,SlGNAL(sigfun(int)),B1,SLOT(slotfun1(int)));//ok
QObject:connect(A,SIGNAL(sigfun(int)), B2,SLOT(slotfun2(int)));//ok

多个信号也可以连接到同一个槽(多对一)

QObject::connect(A1,SIGNAL(sigfun1(int)),B,SLOT(slotfun(int)));//ok
QObject::connect(A2,SIGNAL(sigfun2(int)), B,SLOT(slotfun(int)));//ok

两个信号可以直接连接(信号级联)

QObject::connect(A1,SIGNAL(sigfun1(int)), A2,SIGNAL(sigfun2(int)));//ok

六、比较好的网站 

lQLineEdit 各类操作详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值