提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
信号与槽函数机制是QT编程的基础,也是QT的一大创新,是通过QT的元对象系统实现。
一、什么是信号和槽函数
信号(Signal):就是在特定条件下被发射的事件,比如QPushButton 最常见的信号就是鼠标单击时发射clicked()信号。
槽函数:当我们收到这个信号后,需要有一个函数对信号响应,这个函数就是槽函数,槽函数跟一般的函数用法一样,只不过槽函数可以跟信号进行关联。当信号被发射时,槽函数将会自动执行。
二、格式
1.第一种格式:
第一种方法:
QMetaObject::Connection QObject::connect(
const QObject *sender, //信号的发送者
const char *signal, //发送的信号
const QObject *receiver, //接收者
const char *method, //槽函数(信号响应函数)
Qt::ConnectionType type = Qt::AutoConnection
)
Connection 函数是QObject类的一个静态函数,QObject类是所有Qt类的基类,在实际调用Connection 函数时可以忽略前面的限定符。
第二种方法:通过信号与槽函数 传输数据
connect(this,&LoginWidget::sendIPSignal,mainWindow,&MainWindow::on_getIP);//先关联
emit sendIPSignal(ui->iplineEdit->text());//再发送
2.第二种格式
Connect(sender, SIGNAL(signal()),receiver,SLOT(slot()));
代码如下(示例):
connect(this,SIGNAL(sendIPSignal(QString)),mainWindow,SLOT(on_getIP(QString)));
3.使用信号和槽函数实现多界面的数据传输
信号:本质上也是一个函数,可以使用系统预定义的信号,开发者也可以自定义信号,如果
自定义信号,该信号只需要声明(类中),不需要实现
槽:本质上也是一个函数,可以使用系统预定义的槽,开发者也可以自定义槽,如果
自定义槽,该槽需要声明(类中),并且需要实现
第一步:在LoginWidget类中自定义 或者 使用系统预定义好的信号
class LoginWidget : public QWidget
{
Q_OBJECT//1.如果是自定义的类,想要支持信号和槽的操作,必须要加上宏,声明这个宏,来说明要使用信号和槽
public:
LoginWidget(QWidget *parent = nullptr);
~LoginWidget();
private slots:
void on_btn1_clicked();
signals://自定义信号
void sendIPSignal(QString ip);
private:
Ui::LoginWidget *ui;
};
第二步:在MainWindow类中定义槽函数(类内声明类外实现)
类内声明:
class MainWindow : public QMainWindow
{
Q_OBJECT //如果一个类中想要使用QT中信号和槽的机制,必须添加这个宏
public slots:
void on_getIP(QString ip);
}
类外实现:
void MainWindow::on_getIP(QString ip)
{
qDebug()<<on_getIP<<:<<ip;
ui->iplabel->setText(ip);
}
总结
- 信号和槽中,槽函数的调用是通过信号来完成,所以槽函数的参数类型要跟信号函数的参数类型保持一致,槽的参数个数不大于信号的参数个数
- 槽函数的调用,必须要跟对应的信号建立连接关系,通过connect函数来实现连接
- 一个信号可以跟多个槽函数相关联
- 多个信号可以执行同一个槽函数
目录
信号(Signal):就是在特定条件下被发射的事件,比如QPushButton 最常见的信号就是鼠标单击时发射clicked()信号。
槽函数:当我们收到这个信号后,需要有一个函数对信号响应,这个函数就是槽函数,槽函数跟一般的函数用法一样,只不过槽函数可以跟信号进行关联。当信号被发射时,槽函数将会自动执行。
Connection 函数是QObject类的一个静态函数,QObject类是所有Qt类的基类,在实际调用Connection 函数时可以忽略前面的限定符。
第一步:在LoginWidget类中自定义 或者 使用系统预定义好的信号
第二步:在MainWindow类中定义槽函数(类内声明类外实现)
- 一个信号可以跟另一个信号相关联
- 使用信号与槽函数机制必须在类的声明中添加Q_OBJECT宏,因为只有标记该宏的头文件才能让元对象编译器去处理