Qt圖形界面編程入門(信號和槽通信機制)

信號和槽機制是Qt的核心機制,可以讓編程人員將互不相關的對象綁定在一起,實現對象之間的通信。

聲明了信號的對象,當其狀態改變時,信號就由該對象發送出去,而且該對象只負責發送信號,它不知道另一端是誰在接收這個信號

槽用于接收和處理信號,一個槽并不知道是否有任何信號與自己相連接

槽實際上只是普通的對象成員函數。當一個信號被發射時,與其相關的槽將被立即執行,就像一個正常的函數調用一樣。

信號與槽機制完全獨立于任何GUI事件循環

信號

①信號(signal)的聲明是在一個類的頭文件中進行的

②Qt的signal關鍵字指出進入了信號聲明區,隨后即可聲明自己的信號

例如:

signals:void stateChanged(int nNewVal); //定義信號

這里signals是Qt的關鍵字,而非C++的關鍵字。

信號函數stateChanged定義了信號stateChanged,這個信號帶有參數nNewVal

信號函數語法受到以下幾點約束:

①函數返回值是void類型,因為觸發信號函數的目的是執行與其綁定的槽函數,無須信號函數返回任何值。

②開發人員只能聲明而不能實現信號函數。

③信號函數被moc自動設置為protected,因而只有包含一個信號函數的那個類及其派生類才能使用該信號函數。

④信號函數的參數個數、類型由開發人員自行設定。這些參數的職責是封裝類的狀態信息,并將這些信息傳遞給槽函數。

⑤只有QObject及其派生類才可以聲明信號函數

①槽函數和普通的C++成員函數一樣,可以被正常調用。

②槽唯一的特殊性就是很多信息可以與其相關聯。

③當與其關聯的信號被發送時,這個槽就會被調用。

④槽可以有參數,但槽的參數不能有默認值。關鍵字slots表名進入了槽函數聲明區。

槽的聲明也是在頭文件中進行的,例如:

public slots:   //此語句說明后面就是槽函數void Function(int nNewVal){qDebug() << "new Values" << nNewVal;  //顯示變量    }

槽函數的返回值是void類型,因為信號和槽機制是單向的:信號被發送后,與其綁定的槽函數會被執行,但不要求槽函數返回任何執行結果。和信號函數一樣,只有QObject及其派生類才可以定義槽函數。

既然槽函數是普通的成員函數,因此與其他的函數一樣,它們也有存取權限(public,protected,private)。也就是說,人們能控制其他類能夠以怎樣的方式調用一個函數。

關聯信號與槽

通過調用QObject::connect函數可以綁定一個信號函數和一個槽函數,該函數最常用的格式如下:

connect(sender,SIGNAL(signal_func()),receiver,SLOT(slot_func()))

其中sender及receiver都是指向QObject(或其子類)對象的指針

前者指向發送信號的對象,后者指向處理信號的對象,兩者分別被稱為“發送者”及“接收者”。

signal_func以及slot_func分別是這兩個對象中定義的信號函數和槽函數。

當指定信號signal時一般使用Qt的宏SIGNAL,指定槽函數時必須使用宏SLOT。

一個信號函數可以和多個槽函數綁定。

多個信號函數可以和一個槽函數綁定。

使用信號和槽機制時應該注意以下幾點:

①信號和槽機制與普通函數調用一樣,如果使用不當,在程序執行時也有可能產生死循環

②如果一個信號與多個槽相聯系,那么當這個信號被發送時,與之相關的槽被激活的順序將是隨機的

③宏定義不能用在信號和槽的參數中。

④信號和槽的參數個數與類型必須一致

信號和槽舉例

?

再次建立頭文件

exampleA.h,修改其內容為

#ifndef EXAMPLEA_H
#define EXAMPLEA_H
#include<QCoreApplication>
class CExampleA:public QObject
{Q_OBJECTint m_Value;// 定義私有成員
public:CExampleA(){m_Value = 0;}void SetValue(int nNewVal){if (m_Value ==  nNewVal){ return ; }m_Value = nNewVal;// emit函數用來激活信號函數,發送信號emit stateChanged(m_Value);}
signals:  // 定義信號函數,帶參數void stateChanged(int nNewVal);
};
#endif // EXAMPLEA_H

?exampleB.h,修改其內容為

#ifndef EXAMPLEB_H
#define EXAMPLEB_H
#include<QDebug>  //包含調式類
#include<QCoreApplication>
class CExampleB:public QObject
{Q_OBJECT
public:CExampleB(){}
public slots:  //定義槽函數void Function(int nNewVal)  //nNewVal為100{qDebug() << "new Values" << nNewVal;}
};#endif // EXAMPLEB_H

?再次打開新建對話框,添加主函數文件

?

main.cpp中修改為

?

#include<exampleA.h>
#include<exampleB.h>
int main()
{CExampleA a;   //創建CExampleA類的對象a,調用構造函數,m_Value = 0CExampleB b;   //創建CExampleB類的對象b//連接信號和槽,connect函數要求發送對象和接收對象均為指針,a,b是對象名,&a,&b是發送對象的指針和接收對象的指針。QObject::connect(&a,SIGNAL(stateChanged(int)),&b,SLOT(Function(int)));a.SetValue(100);  //調用a對象的公有函數return 0;
}

運行

簡單實現了信號與槽的功能

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534322.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python二級筆記(18,19合集知識點篇)

知識點&#xff1a; 1&#xff0c;軟件測試的目的是發現程序中的錯誤。調試是作為成功測試的后過而出現的步驟&#xff0c;也就是&#xff0c;調試是在測試發現錯誤之后排除錯誤的過程。軟件調試的任務是診斷和改成程序中的錯誤。 2&#xff0c;深度等于控制的層數 3&#x…

軟件工程(成本/效益分析)

一般說來&#xff0c;人們投資于一項事業的目的是為了在將來得到更大的好處。開發一個軟件系統也是一種投資&#xff0c;期望將來獲得更大的經濟效益&#xff0c;經濟效益通常表現為減少運行費用或增加收入。但是&#xff0c;投資開發新系統往往需要冒一定的風險。系統的開發成…

Linux基礎(用戶身份和文件權限)

用戶身份與能力 Linux是一個多用戶、多任務的操作系統&#xff0c;具有很好的穩定性與安全性&#xff0c;在幕后保障Linux系統安全則是一系列復雜的配置工作。 Linux系統的管理員之所以是root&#xff0c;并不是因為它的名字叫root&#xff0c;而是因為該用戶的身份號碼即UID…

Centos 8 RHEL 8 破解root密碼

https://blog.csdn.net/u014042047/article/details/107309890/

TensorFlow實驗(1)

實驗1-2 搭建深度學習開發環境 1&#xff09;安裝Anaconda 2&#xff09;創建虛擬環境&#xff1a; 3&#xff09;激活環境 4&#xff09;安裝tensorflow 5)安裝jupyter notebook 安裝完成之后&#xff0c;運行第一個程序“Hello,World” 要求&#xff1a;詳細安裝步驟&…

TensorFlow實驗(2)

實驗3-4 數據結構-張量 1&#xff09;已知兩個張量[1,3,5,7]和[2,4,4,8],編寫一個模型&#xff0c;計算兩個張量的加法&#xff0c;輸出結果&#xff0c;并在tensorboard中顯示 2&#xff09;已知張量[1,2,3,4,5,6,7,8,9,10,11,12]有12個元素&#xff0c;利用tf.reshape()將其…

Linux基礎(文件權限續篇)

文件的特殊權限 在復雜多變的生產環境中&#xff0c;單純設置文件的rwx權限無法滿足我們對安全和靈活性的需求&#xff0c;因此便有了SUID,SGID,SBIT的特殊權限位。這是一種對文件權限進行設置的特殊功能&#xff0c;可以與一般權限同時使用&#xff0c;以彌補一般權限不能實現…

Linux基礎(存儲結構和磁盤劃分)

一切從“/”開始 在Linux系統中&#xff0c;目錄、字符設備、塊設備、套接字、打印機等都被抽象成了文件&#xff0c;一切皆為件 與windows操作系統不同&#xff0c;Linux系統內不存在C/D/E/F盤等&#xff0c;一切文件都是從根&#xff08;/&#xff09;目錄開始的 Linux系統…

軟件工程(需求分析)

需求分析 為了開發出真正滿足用戶需求的軟件產品&#xff0c;首先必須知道用戶的需求。對軟件需求的深人理解是軟件開發工作獲得成功的前提條件&#xff0c;不論人們把設計和編碼工作做得如何出色,不能真正滿足用戶需求的程序只會令用戶失望.給開發者帶來煩惱。 需求分析是軟…

TensorFlow構建二維數據擬合模型(1)

知識圖譜 TensorFlow運行機制 TensorFlow是基于計算圖的深度學習編程模型 Tensor表示張量&#xff0c;其實質上是某種類型的多維數組 Flow表示基于數據流圖的計算&#xff0c;實質上是張量在不同節點間的轉化過程。 在TensorFlow中&#xff0c;計算圖中的節點稱為OP&…

Qt圖形界面編程入門(標簽與槽機制習題分享)

標簽對象初始顯示0&#xff0c;每次單擊標簽對象后&#xff0c;其顯示內容就加1&#xff0c;依次變為1、2、3等。 #ifndef DIALOG_H #define DIALOG_H#include <QDialog> #include <QPushButton> //包含命令按鈕類 #include "MyLabel.h"class Dialo…

js中執行到一個if就停止的代碼_Node 中如何引入一個模塊及其細節

在 node 環境中&#xff0c;有兩個內置的全局變量無需引入即可直接使用&#xff0c;并且無處不見&#xff0c;它們構成了 nodejs 的模塊體系: module 與 require。以下是一個簡單的示例const fs require(fs)const add (x, y) > x ymodule.exports add雖然它們在平常使用…

二級MS Office公共基礎知識錯題本(1)

1&#xff0c;順序程序具有順序性、封閉性和可再現性的特點&#xff0c;不具備并發性 2&#xff0c;為了降低算法的空間復雜度&#xff0c;主要應減少輸入數據所占的存儲空間以及額外空間&#xff0c;通常采用壓編存儲技術。 3&#xff0c;樹的總的結點數為樹中所有結點的度數…

c++ file* 句柄泄漏_C++核心指南:P.8 勿泄漏任務資源

P.8: 勿泄漏任務資源原因隨著時間的推移&#xff0c;即使是資源的緩慢增長也會耗盡這些資源的可用性&#xff0c;這對于長時間運行的程序特別重要&#xff0c;但也是負責任的編程行為的基本部分。糟糕的例子void f(char* name){ FILE* input fopen(name, "r"); // .…

數據規范化、實體-聯系圖、狀態轉換圖、層次方框圖、Warnier圖、IPO圖及驗證軟件需求

數據規范化 軟件系統經常使用各種長期保存的信息&#xff0c;這些信息通常以一定方式組織并存儲在數據庫或文件中&#xff0c;為減少數據冗余&#xff0c;避免出現插入異常或刪除異常&#xff0c;簡化修改數據的過程,通常需要把數據結構規范化。 通常用“范式(normal forms)”…

python和c混合編程 gil,如何在python中使用C擴展來解決GIL

I want to run a cpu intensive program in Python across multiple cores and am trying to figure out how to write C extensions to do this. Are there any code samples or tutorials on this?解決方案You can already break a Python program into multiple processes.…

Linux基礎(iptables與firewalld防火墻)

iptables 在早期的Linux系統中&#xff0c;默認使用的是iptables防火墻管理服務來配置防火墻。盡管新型的fierwalld防火墻管理服務已經被投入使用多年&#xff0c;但是大量的企業在生產環境中依然出于各種原因而繼續使用iptables。 策略與規則鏈 防火墻會從上至下的順序來讀…

虛擬跳線軟件干什么用的_瘋狂刷單!用違法軟件生成虛擬手機號,“騎手”半年“刷單”牟利60余萬,百米內竟有萬筆訂單 | 申晨間...

來源&#xff1a;新聞晨報 記者&#xff1a;吳藝璇借助違法軟件生成虛擬手機號碼&#xff0c;利用平臺審核漏洞大量注冊用戶&#xff0c;大量“刷單”騙取平臺的返現和購物補貼&#xff0c;半年內瘋狂刷1.8萬余單&#xff0c;累計牟利60余萬元。近日&#xff0c;在市公安局刑偵…

軟件工程(總體設計①設計過程)

經過需求分析&#xff08;https://blog.csdn.net/weixin_45626468/article/details/115324885&#xff09;階段的工作&#xff0c;系統必選“做什么”已經清楚了&#xff0c;現在是決定“怎樣做”的時候了。 總體設計的基本目的就是回答“概況地說&#xff0c;系統應該如何實現…

ygo游戲王卡組_ACG大科普(7)游戲王

大家是否在小時候接觸過一種卡片類似這種的 這就是今天的主角游戲王。 背景 1996年&#xff0c;《游戲王》漫畫開始在集英社《周刊少年Jump》連載。 1998年&#xff0c;Bandai推出以《游戲王》原作中登場的集換卡牌游戲“M&W”為題材的集換卡牌。 采用Bandai的卡片自動販賣…