QT信号与槽连接(松耦合)

本文详细介绍了Qt的信号与槽机制,这是GUI编程中的关键特性,解决了传统回调机制的类型不安全和强耦合问题。信号在特定事件下发射,槽则是响应信号的函数。通过示例展示了如何在Qt中创建信号、槽以及使用connect函数建立它们之间的连接,使得代码更加灵活和易于维护。此外,还讨论了不同类型的连接方式,如直接连接和队列连接,并强调了信号与槽参数匹配的重要性。
摘要由CSDN通过智能技术生成

    GUI用户界面中,当用户操作一个窗口部件时,需要其他窗口部件响应,传统方式经常使用callback(回调机制)来实现。所谓回调即事先将函数指针作为参数传递另一个函数,然后在函数处理过程中适当地方调用回调函数回调机制有两个缺陷:类型不安全,不能保证调用函数过程中使用正确的参数;强耦合,处理函数必须知道调用哪个回调函数。Qt的信号与槽机制是类型安全的,松耦合,更灵活,更方便。

    信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 

    信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号。发射信号使用Qt的emit关键字。QT 的 signals 关键字指出进入了信号声明区,随后即可声明自己的信号。 

在对话窗口上放三个控件,当点击对应控件时在DeBug输出“XXX加油 ”字样。

    槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以声明在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。 

    我们可以使用右键的方式给控件添加槽方法。也可也按on_对象名_事件名的格式手动添加槽方法,按这种格式添加的槽方法可以自动与单击时发射的 clicked() 信号连接。

private slots:
    void on_whBtn_clicked();
    void on_zgBtn_clicked();
    void on_sjBtn_clicked();    //自动连接 on_对象名_信号名

关键字signals定义一个信号,当控件点击的槽方法执行时我们让其发出这个信号。

signals:
    void Commeon(QString& str); //信号不能也无需实现,且返回值是void

使用emit关键字发送信号 。

void MainWindow::on_whBtn_clicked()
{
    QString str="武汉加油";
    emit Commeon(str);
}

void MainWindow::on_zgBtn_clicked()
{
    QString str="中国加油";
    emit Commeon(str);
}

void MainWindow::on_sjBtn_clicked()
{
    QString str="世界加油";
    emit Commeon(str);
}

我们再准本一个槽方法,用来与上面的信号关联;槽方法将一个CString在DeBug中打印出

private slots:
    void CommeonGuys(QString& str);
void MainWindow::CommeonGuys(QString& str)
{
    qDebug()<<str;
}

在构造函数中将信号与上面新定义的槽方法绑定起来

connect(this,SIGNAL(Commeon(QString&)),this,SLOT(CommeonGuys(QString&)));

信号与槽关联是用 QObject::connect() 函数实现:

QMetaObject::Connection QObject::connect(
const QObject *sender, //信号发送者
const char *signal, //发送的信号
const QObject *receiver, //信号接收者
const char *method, //表示与信号连接的方式的字符串,可以是槽或信号
Qt::ConnectionType type = Qt::AutoConnection //连接方式,默认自动连接

)

常用格式:connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

信号使用SIGNAL,对于槽则使用SLOT,用它们将函数的原型包围起来即可。注意connect方法采用SIGNAL()及SLOT()时,这里的函数原型只能写出类型,不能有任何参数名,否则连接将会失败。

同时信号与槽连接方式:

  1. Qt::AutoConnection:(默认连接方式)自动方式,由系统自动选择连接方式。
  2. Qt::DirectConnection:直接方式,信号发射时,立即调用槽。
  3. Qt::QueuedConnection:队列方式,信号发射时产生一个事件进入队列,事件被处理时槽才能调用。
  4. Qt::BlockQueuedConnection:阻塞队列方式,信号发射时产生一个事件进入队列,然后当前线程进入阻塞状态,直到事件处理完毕,若接收方位于发送信号的线程中,则程序会死锁,故此连接方式仅用于多线程。

也可以不使用SIGNAL和SLOT,直接取地址。

connect(this,&MainWindow::Common,this,&MainWindow::CommonGuys);

信号可以看做是特殊的函数,需要带括号,可带参数,信号无需实现也不能实现。槽函数需要带括号,有参数时还需要指明参数。当信号和槽函数带有参数时,在 connect()函数里,要写明参数的类型。信号的参数需与槽的参数列表一致,允许比槽参数多。如果不匹配或参数过少,会出现编译错误或运行错误。在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT。当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值