信號(hào)和槽(signal and slot)

快速創(chuàng)建qt工程

當(dāng)我們熟悉基本的從空項(xiàng)目創(chuàng)建qt應(yīng)用程序后扼睬,以后我們可以直接從模板中創(chuàng)建一個(gè)qt工程


image.png

注意,本節(jié)暫時(shí)不使用界面文件來(lái)創(chuàng)建UI界面悴势,所以將下圖的單選框取消選中窗宇。
下圖的向?qū)?huì)自動(dòng)創(chuàng)建一個(gè)C++類MyWidget派生自QWidget類


image.png

創(chuàng)建工程完畢后,如下圖所示特纤,派生出的MyWidget類也將自動(dòng)創(chuàng)建對(duì)象军俊,并顯示


image.png

mywidget.h頭文件內(nèi)容

#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()
{

}

上述頭文件和源碼將作為一個(gè)自定義的窗口類使用,我們可以在窗口類的構(gòu)造函數(shù)里創(chuàng)建其他Qt控件

上述Qt程序的執(zhí)行流程

  1. 首先進(jìn)入main函數(shù)
  2. QApplication a(argc, argv);
    根據(jù)啟動(dòng)參數(shù)創(chuàng)建了一個(gè)Qt應(yīng)用程序
  3. MyWidget w;
    調(diào)用MyWidget類的構(gòu)造函數(shù)捧存,創(chuàng)建出一個(gè)對(duì)象w
  4. w.show();
    顯示出這個(gè)窗口控件
  5. a.exec();
    Qt應(yīng)用程序后續(xù)將持續(xù)阻塞在該語(yǔ)句粪躬,內(nèi)部為主線程的循環(huán)
  6. 當(dāng)a.exec()指定完畢后,攜帶著程序執(zhí)行結(jié)果代碼昔穴,通過(guò)return返回镰官。

直接在父控件的構(gòu)造函數(shù)中創(chuàng)建一個(gè)按鈕

在mywidget.h頭文件中對(duì)MyWidget類的public中插入

QPushButton b1,*b2

在mywidget.cpp的MyWidget類構(gòu)造函數(shù)中插入以下代碼

    b1.setParent(this);
    b1.setText("我是b1對(duì)象");
    b2=new QPushButton(this);
    b2->setText("我是b2指針");
    b2->move(100,100);

運(yùn)行結(jié)果如下,


image.png

按鈕點(diǎn)擊事件

通過(guò)connect吗货,可以建立一條“信號(hào)傳輸?shù)木€路”泳唠,使得某信號(hào)接收器能夠接收到某Widget控件所發(fā)出的信號(hào),也就是connect的過(guò)程宙搬。

實(shí)現(xiàn)按下b1后程序關(guān)閉

如上代碼中笨腥,想要按下b1按鈕后關(guān)閉整個(gè)程序,可以在MyWidget構(gòu)造函數(shù)中插入以下代碼

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

各個(gè)實(shí)參解釋:

  • &b1:信號(hào)發(fā)出者勇垛,是一個(gè)指針類型
  • &QPushButton::pressed:
    要處理的信號(hào)脖母,一般是 &發(fā)送者的類名::信號(hào)名
  • 信號(hào)接收者
  • 信號(hào)處理函數(shù)(槽函數(shù)slot)
    一般是 &接收者的類名::槽函數(shù)名

當(dāng)b1按下時(shí)候,立馬發(fā)出一個(gè)信號(hào)給this(信號(hào)接受者)闲孤,然后調(diào)用信號(hào)接收者中的槽函數(shù)close方法谆级,即Qt程序窗口將被關(guān)閉。

同理,我們還可以發(fā)送b2按鈕的released信號(hào)哨苛,并讓信號(hào)接受者為b2鸽凶,處理函數(shù)為b2的hide成員函數(shù)币砂,當(dāng)我們點(diǎn)擊b2并松開時(shí)建峭,b2按鈕的hide方法將被調(diào)用,即b2按鈕消失决摧。

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

自定義槽函數(shù)

在Qt5中亿蒸,槽函數(shù)可以使任意類的成員函數(shù),也可以是全局普通函數(shù)掌桩,還可以是靜態(tài)函數(shù)
槽函數(shù)要與信號(hào)相一致(參數(shù)边锁,返回值)
由于信號(hào)都沒(méi)有返回值,所以槽函數(shù)一定無(wú)返回值波岛。
示例:
在頭文件的類定義的public中添加void mySlot()函數(shù),
在源文件中添加void MyWidget::mySlot()函數(shù)的定義
通過(guò)connect方法建立信號(hào)和槽之間的通信鏈路

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

多個(gè)信號(hào)和槽之間建立鏈路連接

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

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("關(guān)閉當(dāng)前窗口");
    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()
{

}

如上代碼茅坛,可以分別實(shí)現(xiàn):

  • 當(dāng)b1按下時(shí),b2所指向的按鈕隱藏
  • 當(dāng)b1松開時(shí)则拷,將關(guān)閉窗口
  • 當(dāng)b2點(diǎn)擊時(shí)贡蓖,將調(diào)用自定義的mySlot函數(shù),設(shè)置b2指向的按鈕的文本為"Hello"

由此可得煌茬,信號(hào)類似短信斥铺,同一條信號(hào)可以發(fā)送給多個(gè)不同的接受者,或不同信號(hào)可以發(fā)送給同一個(gè)接受者坛善,其中connect用于建立發(fā)送信號(hào)的鏈路晾蜘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眠屎,隨后出現(xiàn)的幾起案子剔交,更是在濱河造成了極大的恐慌,老刑警劉巖改衩,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岖常,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡燎字,警方通過(guò)查閱死者的電腦和手機(jī)腥椒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)候衍,“玉大人笼蛛,你說(shuō)我怎么就攤上這事◎嚷梗” “怎么了滨砍?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我惋戏,道長(zhǎng)领追,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任响逢,我火速辦了婚禮绒窑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舔亭。我一直安慰自己些膨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布钦铺。 她就那樣靜靜地躺著订雾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矛洞。 梳的紋絲不亂的頭發(fā)上洼哎,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音沼本,去河邊找鬼噩峦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛擅威,可吹牛的內(nèi)容都是我干的壕探。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼郊丛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼李请!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起厉熟,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤导盅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后揍瑟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體白翻,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年绢片,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滤馍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡底循,死狀恐怖巢株,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熙涤,我是刑警寧澤阁苞,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布困檩,位于F島的核電站,受9級(jí)特大地震影響那槽,放射性物質(zhì)發(fā)生泄漏悼沿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一骚灸、第九天 我趴在偏房一處隱蔽的房頂上張望糟趾。 院中可真熱鬧,春花似錦逢唤、人聲如沸拉讯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至只锭,卻和暖如春著恩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜻展。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工喉誊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纵顾。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓伍茄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親施逾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敷矫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351