欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Qt信號槽機制

 更新時間:2021年06月23日 11:51:58   作者:進擊的汪sir  
信號槽是 Qt 框架引以為豪的機制之一。本文主要介紹了Qt信號槽機制,具有一定的參考價值,感興趣的小伙伴們可以參考一下

1. 信號和槽概述

信號槽是 Qt 框架引以為豪的機制之一。所謂信號槽,實際就是觀察者模式(發(fā)布-訂閱模式)。當(dāng)某個`事件`發(fā)生之后,比如,按鈕檢測到自己被點擊了一下,它就會發(fā)出一個信號(signal)。這種發(fā)出是沒有目的的,類似廣播。如果有對象對這個信號感興趣,它就會使用連接(connect)函數(shù),意思是,將想要處理的信號和自己的一個函數(shù)(稱為槽(slot))綁定來處理這個信號。也就是說,當(dāng)信號發(fā)出時,被連接的槽函數(shù)會自動被回調(diào)。這就類似觀察者模式:當(dāng)發(fā)生了感興趣的事件,某一個操作就會被自動觸發(fā)。

1.1 信號的本質(zhì)

信號是由于用戶對窗口或控件進行了某些操作,導(dǎo)致窗口或控件產(chǎn)生了某個特定事件,這時候Qt對應(yīng)的窗口類會發(fā)出某個信號,以此對用戶的挑選做出反應(yīng)。

因此根據(jù)上述的描述我們得到一個結(jié)論:信號的本質(zhì)就是事件,比如:

  • 按鈕單擊、雙擊
  • 窗口刷新
  • 鼠標移動、鼠標按下、鼠標釋放
  • 鍵盤輸入

那么在Qt中信號是通過什么形式呈現(xiàn)給使用者的呢?

  • 我們對哪個窗口進行操作, 哪個窗口就可以捕捉到這些被觸發(fā)的事件。
  • 對于使用者來說觸發(fā)了一個事件我們就可以得到Qt框架給我們發(fā)出的某個特定信號。
  • 信號的呈現(xiàn)形式就是函數(shù), 也就是說某個事件產(chǎn)生了, Qt框架就會調(diào)用某個對應(yīng)的信號函數(shù), 通知使用者。

在QT中信號的發(fā)出者是某個實例化的類對象,對象內(nèi)部可以進行相關(guān)事件的檢測。

1.2 槽的本質(zhì)

在Qt中槽函數(shù)是一類特殊的功能的函數(shù),在編碼過程中也可以作為類的普通成員函數(shù)來使用。之所以稱之為槽函數(shù)是因為它們還有一個職責(zé)就是對Qt框架中產(chǎn)生的信號進行處理。

舉個簡單的例子:

女朋友說:“我肚子餓了!”,于是我?guī)コ燥垺?/p>

上邊例子中相當(dāng)于女朋友發(fā)出了一個信號, 我收到了信號并其將其處理掉了。

  • 女朋友 -> 發(fā)送信號的對象, 信號內(nèi)容: 我餓了
  • 我 -> 接收信號的對象并且處理掉了這個信號, 處理動作: 帶她去吃飯

在Qt中槽函數(shù)的所有者也是某個類的實例對象。

1.3 信號和槽的關(guān)系

在Qt中信號和槽函數(shù)都是獨立的個體,本身沒有任何聯(lián)系,但是由于某種特性需求我們可以將二者連接到一起,相當(dāng)于一個綁定,在Qt中我們需要使用QOjbect類中的connect函數(shù)進二者的關(guān)聯(lián)。

QMetaObject::Connection QObject::connect(
    	const QObject *sender, PointerToMemberFunction signal, 
        const QObject *receiver, PointerToMemberFunction method, 
		Qt::ConnectionType type = Qt::AutoConnection);
- 參數(shù):
	- sender: 發(fā)出信號的對象
	- signal: 屬于sender對象, 信號是一個函數(shù), 這個參數(shù)的類型是函數(shù)指針, 信號函數(shù)地址
    - receiver: 信號接收者
	- method: 屬于receiver對象, 當(dāng)檢測到sender發(fā)出了signal信號, 
              receiver對象調(diào)用method方法,信號發(fā)出之后的處理動作
                  
// connect函數(shù)相對于做了信號處理動作的注冊
// 調(diào)用conenct函數(shù)的sender對象的信號并沒有產(chǎn)生, 因此receiver對象的method也不會被調(diào)用
// method槽函數(shù)本質(zhì)是一個回調(diào)函數(shù), 調(diào)用的時機是信號產(chǎn)生之后, 調(diào)用是Qt框架來執(zhí)行的
// connect中的sender和recever兩個指針必須被實例化了, 否則conenct不會成功
connect(const QObject *sender, &QObject::signal, 
        const QObject *receiver, &QObject::method);

1.4 通過實例加深理解

現(xiàn)在要實現(xiàn)一個簡單的功能,就說創(chuàng)建一個按鈕,點擊這個按鈕關(guān)閉窗口

然后思考,這個功能的信號發(fā)出者,信號接受者,以及發(fā)出什么信號,接受信號后怎么做

  • 按鈕: 信號發(fā)出者 -> QPushButton
  • 窗口: 信號的接收者和處理者 -> QWidget
  • 發(fā)出信號:被點擊 -> clicked
  • 槽函數(shù),即如何處理 -> close

現(xiàn)在我們來實現(xiàn)一下

在ui中添加一個button,取名為closeBtn

然后再Mainwindow.cpp 文件中

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
}

MainWindow::~MainWindow()
{
    delete ui;
}

注意這條語句
connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
通過這條語句來實現(xiàn)綁定

現(xiàn)在我們來運行一下

點擊按鈕,窗口關(guān)閉

到此這篇關(guān)于深入理解Qt信號槽機制的文章就介紹到這了,更多相關(guān)Qt信號槽機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • C++?primer超詳細講解關(guān)聯(lián)容器

    C++?primer超詳細講解關(guān)聯(lián)容器

    兩個主要的關(guān)聯(lián)容器為map和set,map中元素是一些關(guān)鍵字—值對,關(guān)鍵字起索引的作用,值則表示與索引相關(guān)聯(lián)的數(shù)據(jù)。set中每個元素只包含一個關(guān)鍵字,set支持高效的關(guān)鍵字查詢操作——檢查一個給定關(guān)鍵字是否在set中
    2022-07-07
  • 淺析C++ new的三種面貌

    淺析C++ new的三種面貌

    這篇文章主要介紹了C++ new的三種面貌,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • C++ 實現(xiàn)自定義類型的迭代器操作

    C++ 實現(xiàn)自定義類型的迭代器操作

    這篇文章主要介紹了C++ 實現(xiàn)自定義類型的迭代器操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C語言實現(xiàn)用戶態(tài)線程庫案例

    C語言實現(xiàn)用戶態(tài)線程庫案例

    下面小編就為大家?guī)硪黄狢語言實現(xiàn)用戶態(tài)線程庫案例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • OpenCV實現(xiàn)馬賽克和毛玻璃濾鏡效果

    OpenCV實現(xiàn)馬賽克和毛玻璃濾鏡效果

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)馬賽克和毛玻璃濾鏡效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++實現(xiàn)LeetCode(19.移除鏈表倒數(shù)第N個節(jié)點)

    C++實現(xiàn)LeetCode(19.移除鏈表倒數(shù)第N個節(jié)點)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(19.移除鏈表倒數(shù)第N個節(jié)點),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟

    CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟

    本文主要介紹了CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C++利用模板實現(xiàn)消息訂閱和分發(fā)功能

    C++利用模板實現(xiàn)消息訂閱和分發(fā)功能

    C++語言支持重載,模板,虛函數(shù)等特性,為編寫高性能可擴展的程序提供了利器。本文就講利用模板實現(xiàn)消息訂閱和分發(fā)功能,感興趣的小伙伴可以了解一下
    2022-12-12
  • C語言 動態(tài)內(nèi)存分配的詳解及實例

    C語言 動態(tài)內(nèi)存分配的詳解及實例

    這篇文章主要介紹了C語言 動態(tài)內(nèi)存分配的詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • C語言實題講解快速掌握單鏈表上

    C語言實題講解快速掌握單鏈表上

    單鏈表是后面要學(xué)的雙鏈表以及循環(huán)鏈表的基礎(chǔ),要想繼續(xù)深入了解數(shù)據(jù)結(jié)構(gòu)以及C語言,我們就要奠定好這塊基石!接下來就和我一起學(xué)習(xí)吧
    2022-04-04

最新評論