柚子快報激活碼778899分享:學習 【QT】信號和槽
個人主頁~
信號和槽
一、概述二、信號和槽的使用連接信號和槽純代碼實現(xiàn)可視化實現(xiàn)
三、自定義信號和槽1、基本語法(1)自定義信號函數(shù)書寫規(guī)范(2)自定義槽函數(shù)書寫規(guī)范(3)發(fā)生信號
2、帶參數(shù)的信號和槽
四、信號與槽的連接方式1、一對一(1)一個信號連接一個槽(2)一個信號連接一個信號
2、一對多(1)一個信號連接多個槽(2)一個槽連接多個信號
五、其他說明1、信號與槽的斷開2、connect函數(shù)的解析3、Lambda表達式①[capture]標識一個Lambda表達式的開始,不可省略②(params)函數(shù)參數(shù)表③opt選項④->ret返回類型⑤{Function body}函數(shù)體
六、信號和槽的優(yōu)缺點
一、概述
在QT中,用戶和控件的每次交互過程稱為一個事件,每個事件都會發(fā)出信號,QT當中的每個控件都有接收信號的能力,對信號做出相應動作就稱之為槽
信號的本質就是事件,用戶對窗口或控件進行操作,比如單擊、雙擊,比如鍵盤輸入,會導致窗口或者控件產(chǎn)生某個特定事件,這時QT對應的窗口類會發(fā)出某個信號,以此對用戶的操作做出反應 信號的呈現(xiàn)形式是函數(shù),產(chǎn)生事件后QT框架會調用相對應的信號函數(shù) 在QT中信號的發(fā)出者是某個實例化的類對象
槽就是對信號響應的函數(shù),槽函數(shù)除了可以與一個信號關聯(lián),當信號被發(fā)射時,關聯(lián)的槽函數(shù)被自動執(zhí)行以外,其他方面與一般的普通C++函數(shù)都是一樣的
信號和槽機制底層是通過函數(shù)間的相互調用實現(xiàn)的,每個信號都可以用函數(shù)來表示,成為信號函數(shù),每個槽也可以用函數(shù)表示,稱為槽函數(shù)
信號函數(shù)和槽函數(shù)通常位于某個類中,和普通的成員函數(shù)相比它們有幾個特別之處: 信號函數(shù)用signals關鍵詞修飾,槽函數(shù)用public slots、protected slots、private slots修飾,signal和slots是QT在C++基礎上擴展的關鍵字,專門用來指明信號函數(shù)和槽函數(shù) 信號函數(shù)只需要聲明,不需要定義,而槽函數(shù)需要聲明并定義
二、信號和槽的使用
連接信號和槽
QT中QIbject類提供了靜態(tài)成員函數(shù)connect專門負責用來關聯(lián)指定的信號函數(shù)和槽函數(shù) connect函數(shù)原型:
connect(const QObject* sender,
const char* signal,
const QObject* receiver,
const char* method,
Qt::ConnectionType type = Qt::AutoConnection)
sender:信號的發(fā)送者 signal:發(fā)送的信號 receiver:信號接收者 method:接收信號的槽函數(shù) type:用于指定關聯(lián)方式,默認的關聯(lián)方式為Qt::AutoConnection
現(xiàn)在我們來寫一個按鈕,這個按鈕可以用來關閉窗口
純代碼實現(xiàn)
#include "widget.h"
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QPushButton* btn = new QPushButton("關閉窗口",this);
connect(btn,&QPushButton::clicked,this,&QWidget::close);
}
Widget::~Widget()
{
}
可以實現(xiàn)點按按鈕與關閉窗口的呼應
QT窗口信號和槽演示
可視化實現(xiàn)
在自動生成的函數(shù)中描述該按鈕的槽
加一句關閉代碼,由于此時的函數(shù)的隱藏參數(shù)為該按鈕,所以直接操作就可以了
this->close();
QT關閉窗口信號與槽可視化構建
三、自定義信號和槽
1、基本語法
在QT中允許自定義信號的發(fā)送方和接收方,也就是說可以自定義信號函數(shù)和槽函數(shù),但是有一些書寫規(guī)范
(1)自定義信號函數(shù)書寫規(guī)范
自定義信號函數(shù)必須寫到signal下 返回值為void,只需聲明,無需定義 可以有參數(shù),可以發(fā)生重載
(2)自定義槽函數(shù)書寫規(guī)范
可以寫到public slots或者public以及全局下 返回值為void,需要聲明以及定義 可以有參數(shù),可以發(fā)生重載
(3)發(fā)生信號
使用emit關鍵字發(fā)送信號,emit是一個空的宏,沒有含義,只是為了提醒開發(fā)人員,并且提高代碼的可讀性
將信號和槽連接,當發(fā)送信號時,槽做出反應,也就是執(zhí)行槽函數(shù)
2、帶參數(shù)的信號和槽
上面我們展示的是無參的信號和槽,那么有參數(shù)的信號和槽是怎么工作的呢
QT的信號和槽也支持帶有參數(shù),同時可以支持重載,但是我們要求信號函數(shù)的參數(shù)列表要和對應的槽函數(shù)參數(shù)列表一致
信號的參數(shù)個數(shù)可以多于槽函數(shù)的參數(shù)個數(shù),但是槽的參數(shù)個數(shù)不能多于信號參數(shù)個數(shù),當然最好還是一致
四、信號與槽的連接方式
1、一對一
(1)一個信號連接一個槽
在上文3.1.3中就是一個信號連接一個槽的情況,這是最常用的方法
(2)一個信號連接一個信號
將按鈕的點擊信號與我的自定義信號連接,將我的自定義信號和我的自定義槽連接,這時,點擊按鈕就會觸發(fā)我的自定義槽的效果
信號連接信號,信號連接槽
2、一對多
(1)一個信號連接多個槽
一個信號和三個槽連接,觸發(fā)信號三個槽都響應
(2)一個槽連接多個信號
三個信號和一個槽連接,每觸發(fā)一個信號槽就響應一次
五、其他說明
1、信號與槽的斷開
connect可以連接信號和槽,與之對應的,disconnect可以斷開這個關系,用法與connect一致
2、connect函數(shù)的解析
在Qt5以前的版本中,connect的第二個和第四個參數(shù)是不允許任意函數(shù)的,使用的時候只能搭配著宏來使用,類似下方的代碼
connect(this,SIGNAL(mysignal(),this,SLOT(myslot()));
這樣會導致一個問題,它沒有類型的檢查,只要套上宏就可以用,如果出現(xiàn)以下情況,還是可以正常運行的,但信號與槽的參數(shù)列表不對應了,是錯誤的
connect(this,SIGNAL(mysignal(),this,SLOT(myslot(QStirng)));
當然現(xiàn)在我使用的QT5以及現(xiàn)在最新版本的QT6都沒有這個問題了,該位置的參數(shù)可以是任意類型的
3、Lambda表達式
Lambda表達式是可以直接在connect中編寫槽函數(shù)的一種方式,是C++11新增的特性,用來簡化編程工作
語法格式:
[ capture ] ( params ) opt -> ret
{
Function body;
};
參數(shù)作用capture捕獲列表params參數(shù)表opt函數(shù)選項ret返回值類型Function body函數(shù)體
①[capture]標識一個Lambda表達式的開始,不可省略
符號說明[ ]局部變量捕獲列表,Lambda表達式不能訪問外部函數(shù)體的任何局部變量[a]在函數(shù)體內用值傳遞的方式訪問a變量[&a]在函數(shù)體內用引用傳遞的方式訪問a變量[=]以值傳遞的方式使用Lambda表達式外部的所有變量[&]以引用的方式使用Lambda表達式外部的所有變量[=,&foo]foo使用引用方式傳遞,其余是值傳遞[&,foo]foo使用值傳遞方式傳遞,其余是引用方式傳遞[this]在函數(shù)內部可以使用類的成員函數(shù)和成員變量
在Lambda表達式后加一個括號表示調用
②(params)函數(shù)參數(shù)表
值傳遞和引用傳遞,省略相當于無參
③opt選項
這部分可以省略,是一個選項,常用mutable聲明
Lambda表達式外部的局部變量通過值傳遞進來時,默認為const,所以不能修改這個局部變量的拷貝,加上mutable就可以修改
mutable的使用
④->ret返回類型
可以指定Lambda表達式的返回類型,如果不指定則為編譯器自己根據(jù)代碼推導的一個返回類型,如果返回類型是void那不用寫
⑤{Function body}函數(shù)體
函數(shù)定義在這大括號中
六、信號和槽的優(yōu)缺點
優(yōu)點:低耦合,信號和槽不是綁定在一起的,改變信號函數(shù)不會影響槽函數(shù),改變槽函數(shù)也不會影響信號函數(shù),它們只在發(fā)送信號的一瞬間建立聯(lián)系
缺點:效率低,但這個低是相對于回調函數(shù)來說的,但是這個效率低的影響不大,因為對于人來說是感知不到的
今日分享就到這里~
柚子快報激活碼778899分享:學習 【QT】信號和槽
好文推薦
本文內容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。