大宇私人领地伊甸园丨宁愿做了后悔,也不要错过后悔[www.mrdayu.com]
注册

24小时联系邮箱:[email protected]

所有文章
大宇私人伊甸园: 首页 > 所有文章 > 编程人生 > 系统架构 > QT > 《大宇:Qt入门到精通》 > [002.02]初识qt信号与槽

[002.02]初识qt信号与槽

前言:

本篇文章为大家初步介绍信号与槽的神秘机制。

过程:

本篇文章依据上篇获得的知识进行加深映像-》创建Button按钮-》点击触发的效果-》间接初步认识信号和槽

要求:

对上一篇文章的绝对理解,不再对QApplication进行讲解。请先了解清楚信号和槽:

信号和槽:

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

当然,对于windows下信号机制不清楚的也不用刻意去翻看相关资料。

信号:

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

槽:

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

信号与槽的关联:

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

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

正文:

①创建一个Empty SLN(空项目)//上节课已经介绍

②创建一个带有main函数的main.cpp文件

③如果为Qt4.9版本以上,请在pro文件中加入:QT+=widgets gui

④创建一个进程,加入以下代码

⑤运行程序:

点击Quit按钮,会使得进程退出。

讲解:

QPushButton *button = new QPushButton("Quit");
[创建一个名字为Quit的button按钮]
QObject::connect(button, SIGNAL(clicked()),&app, SLOT(quit()));
[将一个信号和槽链接]
button->show();
[将Button按钮显示出来]

讲解进化出来的疑问:

为何button显示为Quit为文字的button按钮?

初始化QPushButton有三个重载函数:
QPushButton(QWidget *parent = Q_NULLPTR)
QPushButton(const QString &text, QWidget *parent = Q_NULLPTR)
QPushButton(const QIcon &icon, const QString &text, QWidget *parent = Q_NULLPTR)
由于我们在初始化QPushButton的时候,传进一个字符串参数
于是调用的了QPushButton的第二个构造函数,而字符串会被赋值为这个Button按钮的Text属性
也就是显示出来的那个值

怎么实现的,点击Quit按钮实现进程/窗口退出的?

由于信号和槽的绑定
QObject::connect(button, SIGNAL(clicked()),&app, SLOT(quit()));
信号发送者:button->QPushButton实例化对象
发送内容:clicked()->button的点击触发信号
接收者:&app->此程序的进程句柄
接收调用函数:quit()->此进程的系统函数退出->系统进程退出
相应的app.exec()死循环不再,窗口也会被迫进程的退出而自动销毁

源码:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QPushButton *button = new QPushButton("Quit");
    QObject::connect(button, SIGNAL(clicked()),
                     &app, SLOT(quit()));
    button->show();
    return app.exec();
}

解除你心中的纠结:

 QObject::connect(button, SIGNAL(clicked()),&app, SLOT(quit()));什么时候起效果?什么时候没有效果?
绑定成功:信号接受者和发送者都有被实例化的时候,并且发送者的信号和接受者的槽函数已经被定义的情况下,信号和槽才能实现绑定
绑定失败:信号接收者和发送者只要有一个没有被实例化
绑定失败:信号接收者和发送者只要有一个被销毁
绑定失败:信号没有声明,或者槽没有实现
 
The bottom line, for me, is simple.

Let’s hope it doesn’t take 500 years for a discipline of testing to becomes the standard for software developers.

From:dayu

您好!请登录

合作网站快捷登录:
点击取消回复

已有1评论

    大宇博客

    点击这里给我发消息点击这里给我发消息