Qt學習筆記 自定義訊號與槽函式

2021-10-03 13:56:32 字數 2660 閱讀 2452

qpushbutton *b1=new qpushbutton(this)

qpushbutton *b2=new qpushbutton(this) 1

connect(b1,&qpushbutton::pressed,b2,&qpushbutton::close);

其作用即是按b1按鈕時,對b2按鈕實現close函式(也就是槽函式)b2關閉

語法 :

b1:訊號發出者,指標型別

&qpushbutton::pressed:處理的訊號(signal), [&傳送者類名::訊號名字]

b2:訊號接受者,指標型別

&qpushbutton::close:槽函式,訊號處理函式 [&接受的類名::槽函式名字]

2任意的成員函式,普通全域性函式,靜態函式

槽函式需要和訊號一直(引數,返回值)

由於訊號都是沒有返回值的,所以槽函式一定沒有返回值

connect(&b3,&qpushbutton::released,this,&mainwidget::changewin);

changewin就是自定義槽函式

void mainwidget::changewin()

訊號必須由signals關鍵字申明

訊號沒有返回值但可以有引數

訊號就是函式的宣告,只需宣告無需定義

使用 emit mysignal();發射訊號

在常用控制項qpushbuttion裡繼承了qabstractbutton的訊號

定義為按下按鈕時發射訊號(必須有發射的動作

在mainwidget類(qwidget派生而來)中定義乙個副視窗(另乙個從qwidget派生出的類作為成員變數),主視窗呼叫副視窗輕而易舉,只需定義乙個槽函式實現即可。而副視窗對主視窗通訊,則需要副視窗自己發射訊號讓主視窗引起「中斷」

subwidget 副視窗類

#ifndef subwidget_h

#define subwidget_h

#include #includeclass subwidget : public qwidget

;

則在建構函式裡設定好訊號發射的條件:當空間b被按下時呼叫sendslot()發射訊號

這樣在主視窗隱藏時,副視窗就可以通過發射訊號給主視窗

#include "subwidget.h"

subwidget::subwidget(qwidget *parent) : qwidget(parent)

void subwidget::sendslot()

#endif // subwidget_h

//lambda表示式:匿名函式物件

//c++11增加到新特性,專案檔案:config+=c++11

//qt配合訊號一起使用方便至極

//不必再定義多餘的槽函式

connect(b4,&qpushbutton::clicked,//clicked是有參訊號按下引數為false預設也是false

//函式傳參 //=把外部所有區域性變數以及類中所有成員以值傳遞方式全傳進來(預設為唯讀形式)想改值需要在()後加上mutable,比較安全

//this:類中的所有成員以值傳遞方式

//&:把外部所有區域性變數,引用方式千萬不要在引用時對函式操作動態分配記憶體的指標,因為指標還沒有被釋放引用它就導致衝突

//()傳遞訊號引數

//{}函式體

[=](bool ischeck)mutable

;#endif // subwidget_h

/*訊號有過載,產生二義性解決方法:利用函式指標確定要呼叫哪個訊號函式/槽函式

*所以就不能表示為:connect(&w,&subwidget::mysignal,this,&mainwidget::deal);

*訊號函式指標定義方法: void (定義域::*指標名)(過載函式引數表)=&定義域::訊號名

*/void (subwidget::*fistsignal)()=&subwidget::mysignal;

void (subwidget::*secondsignal)(int,qstring)=&subwidget::mysignal;//如此就定義好兩個過載訊號的指標

connect(&w,fistsignal,this,&mainwidget::dealsub);//用的是第一的無參的

connect(&w,secondsignal,this,&mainwidget::deal);//用的是第二個有參的

qt4中connect區分過載訊號是在直接用signal()會顯示訊號型別選擇,關鍵字slot()顯示定義的槽函式選擇。connect(&b1,signal(mysignal()),&b2,slot(myslot());但是qt4中signal後括號只要是字串編譯的時候就不會報錯,執行時才會出錯。故不太容易後期維護。

指定父物件 ↩︎

均為qt5版本下 ↩︎

Qt自定義訊號槽

qt自定義訊號槽,在控制台程式中實現 qt5 如下 qt5 include news h class news public qobject void send signals void new const qstring name private qstring m name reader.h i...

Qt 自定義訊號槽

使用 connect 可以讓我們連線系統提供的訊號和槽。但是,qt 的訊號槽機制並不僅僅是使用系統提供的那部分,還會允許我們自己設計自己的訊號和槽。這也是 qt 框架的設計思路之一,用於我們設計解耦的程式。本節將講解如何在自己的程式中自定義訊號槽。訊號槽不是 gui 模組提供的,而是 qt 核心特性...

Qt學習筆記 自定義的訊號和槽

自定義訊號 1.返回void 2.只宣告,不需要實現 3.可以有引數 4.可以過載 5.寫到signals下 自定義槽函式 1.返回void 2.需要宣告也需要實現 在標頭檔案中宣告,在cpp中實現 3.可以有引數 4.可以過載 5.寫到public或public slot 5.11前版本 下 te...