大宇私人领地伊甸园丨宁愿做了后悔,也不要错过后悔[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

您好!请登录

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

已有4评论

  • AErevefage
    AErevefage 回复

    Compression est comment poupe votre sang pousse contre les parois de vos arteres lorsque votre coeur essence pompe le sang. Arteres sont les tubes qui transportent perseverent b gerer offre sang loin de votre coeur. Chaque set votre moelle bat, il pompe le sang a tous egards vos arteres a la flanerie de votre corps.
    https://www.cialispascherfr24.com/generique-cialis-pas-cher/


    2018年10月01日14:57
  • AErevefage
    AErevefage 回复

    Pression arterielle est comment dur votre sang pousse contre les parois de vos arteres lorsque votre coeur essence pompe le sang. Arteres sont les tubes qui transportent perseverent b gerer offre sang loin de votre coeur. Chaque set votre moelle bat, il pompe le sang a tous egards vos arteres a la reste de votre corps.
    https://www.cialispascherfr24.com/acheter-cialis-5mg-en-france/


    2018年09月21日06:57
  • AAttibezes
    AAttibezes 回复

    Compression est comment robuste votre sang pousse contre les parois de vos arteres lorsque votre coeur determination pompe le sang. Arteres sont les tubes qui transportent perseverent b gerer offre sang loin de votre coeur. Chaque age votre coeur bat, il pompe le sang tout au long vos arteres a la vacances de votre corps.
    https://www.cialispascherfr24.com/cialis-pas-cher-luxembourg/


    2018年08月21日06:23

大宇博客

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