信号和槽(signal and slot)

快速创建qt工程

当我们熟悉基本的从空项目创建qt应用程序后,以后我们可以直接从模板中创建一个qt工程


image.png

注意,本节暂时不使用界面文件来创建UI界面,所以将下图的单选框取消选中。
下图的向导将会自动创建一个C++类MyWidget派生自QWidget类


image.png

创建工程完毕后,如下图所示,派生出的MyWidget类也将自动创建对象,并显示


image.png

mywidget.h头文件内容

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();
};

#endif // MYWIDGET_H

mywidget.cpp源码

#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
}

MyWidget::~MyWidget()
{

}

上述头文件和源码将作为一个自定义的窗口类使用,我们可以在窗口类的构造函数里创建其他Qt控件

上述Qt程序的执行流程

  1. 首先进入main函数
  2. QApplication a(argc, argv);
    根据启动参数创建了一个Qt应用程序
  3. MyWidget w;
    调用MyWidget类的构造函数,创建出一个对象w
  4. w.show();
    显示出这个窗口控件
  5. a.exec();
    Qt应用程序后续将持续阻塞在该语句,内部为主线程的循环
  6. 当a.exec()指定完毕后,携带着程序执行结果代码,通过return返回。

直接在父控件的构造函数中创建一个按钮

在mywidget.h头文件中对MyWidget类的public中插入

QPushButton b1,*b2

在mywidget.cpp的MyWidget类构造函数中插入以下代码

    b1.setParent(this);
    b1.setText("我是b1对象");
    b2=new QPushButton(this);
    b2->setText("我是b2指针");
    b2->move(100,100);

运行结果如下,


image.png

按钮点击事件

通过connect,可以建立一条“信号传输的线路”,使得某信号接收器能够接收到某Widget控件所发出的信号,也就是connect的过程。

实现按下b1后程序关闭

如上代码中,想要按下b1按钮后关闭整个程序,可以在MyWidget构造函数中插入以下代码

connect(&b1,&QPushButton::pressed,this,&MyWidget::close);

各个实参解释:

  • &b1:信号发出者,是一个指针类型
  • &QPushButton::pressed:
    要处理的信号,一般是 &发送者的类名::信号名
  • 信号接收者
  • 信号处理函数(槽函数slot)
    一般是 &接收者的类名::槽函数名

当b1按下时候,立马发出一个信号给this(信号接受者),然后调用信号接收者中的槽函数close方法,即Qt程序窗口将被关闭。

同理,我们还可以发送b2按钮的released信号,并让信号接受者为b2,处理函数为b2的hide成员函数,当我们点击b2并松开时,b2按钮的hide方法将被调用,即b2按钮消失。

connect(b2,&QPushButton::released,b2,&QPushButton::hide);

自定义槽函数

在Qt5中,槽函数可以使任意类的成员函数,也可以是全局普通函数,还可以是静态函数
槽函数要与信号相一致(参数,返回值)
由于信号都没有返回值,所以槽函数一定无返回值。
示例:
在头文件的类定义的public中添加void mySlot()函数,
在源文件中添加void MyWidget::mySlot()函数的定义
通过connect方法建立信号和槽之间的通信链路

connect(b2,&QPushButton::clicked,this,&MyWidget::mySlot);

多个信号和槽之间建立链路连接

#include "mywidget.h"
//#include <QPushButton>

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("关闭当前窗口");
    b2=new QPushButton(this);
    b2->setText("改变此按钮文本");
    b2->move(100,100);

    connect(&b1,&QPushButton::pressed,b2,&QPushButton::hide);
    connect(&b1,&QPushButton::released,this,&MyWidget::close);
    connect(b2,&QPushButton::clicked,this,&MyWidget::mySlot);

}
void MyWidget::mySlot()
{
    MyWidget::b2->setText("Hello");
}
MyWidget::~MyWidget()
{

}

如上代码,可以分别实现:

  • 当b1按下时,b2所指向的按钮隐藏
  • 当b1松开时,将关闭窗口
  • 当b2点击时,将调用自定义的mySlot函数,设置b2指向的按钮的文本为"Hello"

由此可得,信号类似短信,同一条信号可以发送给多个不同的接受者,或不同信号可以发送给同一个接受者,其中connect用于建立发送信号的链路。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,565评论 6 525
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,696评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,935评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,327评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,338评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,760评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,085评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,091评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,656评论 1 327
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,657评论 3 348
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,767评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,360评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,088评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,493评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,654评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,374评论 3 383
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,841评论 2 367