一. 简介
在Qt中使用信号和槽机制来完成对象之间的协同操作。简单来说,信号和槽都是函数,比如按下窗口上的一个按钮后想要弹出一个对话框,那么就可以将这个按钮的单击信号和我们定义的槽关联起来,在这个槽中可以创建一个对话框,并且显示它。这样,当单击这个按钮时就会发射信号,进而执行我们的槽来显示一个对话框。
实际上,我们一般需要自己实现的是槽函数。槽函数即:接收到信号后所要执行的动作。
二. 声明
/*
* 使用关键字:signals,来声明信号函数
*/
signals:
void sig_updateNtpTime(QString *time);
/*
* 使用关键字:slots,来声明槽函数。
* 一般槽函数需要指明权限:public/private/protected等
*/
public slots:
void slot_receiveTime(QString *time);
注意: 槽一般使用slots关键字进行修饰(Qt 4中必须使用,Qt 5以后使用新connect语法时可以不用,为了与一般函数进行区别,建议使用)
三. 信号的类别
1)基于部件对象,可以使用其类中自带的信号(比如:按钮部件,其类中自带的信号)
/*
* 1)clicked(): 被点击
* 2) clicked(bool):被点击,区分是否被选中(一般在单选框部件中使用)
* 3)pressed(): 按钮被按下
* 4)released(): 按钮被松开
*/
2)自定义信号
/*
* 使用关键字:signals,来自定义信号
*/
signals:
void sig_updateNtpTime(QString *time);
四. 信号和槽的关联方式
1. 使用connect()函数关联
// 函数原型
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
// connect()函数中的四个参数分别是:发送信号的对象、发送的信号、接收信号的对象和要执行的槽。
信号触发形式:
1)使用部件对象自带的信号
connect(ui->button, SIGNAL(clicked()), this, SLOT(slot_exitsCardsDevice()));
// 当点击按钮button时,触发信号-->执行槽函数 slot_exitsCardsDevice().
2)使用自定义的信号
connect(ui->functionBtn_1, SIGNAL(sig_mouseReleaseEvent()), this, SLOT(slot_functionBtn_1_clickedX()));
//使用关键字:emit,来触发自定义信号
emit sig_mouseReleaseEvent();//执行后,触发槽函数 slot_functionBtn_1_clickedX()
2. 自动关联
在设计模式中的UI主设计区,选择需要操作的部件,右击,在弹出的菜单上选择“转到槽”,根据需求选择对应的槽函数。
自动关联就是将关联函数整合到槽命名中。 例如on_pushButton_clicked()就是由字符“on”和发射信号的部件对象名,还有信号名组成。这样就可以去掉那个connect()关联函数了。每当pushButton被按下,就会发射clicked()信号,然后就会执行on_pushButton_clicked()槽。
//对名称为 pushButton_save 的按钮进行的 按下和释放 动作的槽函数
void frmTelBook::on_pushButton_save_pressed()
{
//
}
void frmTelBook::on_pushButton_save_released()
{
//
}
注意:一般自动关联方式的槽函数数目较少,选择性叫少。