最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解c++實現(xiàn)Qt信號和槽機制

 更新時間:2023年08月08日 11:47:04   作者:ccloud11  
信號和槽機制是 Qt 的核心機制,可以讓編程人員將互不相關(guān)的對象綁定在一起,實現(xiàn)對象之間的通信,本文就來深入理解c++實現(xiàn)Qt信號和槽機制,感興趣的可以了解一下

簡介

信號槽機制與Windows下消息機制類似,消息機制是基于回調(diào)函數(shù),Qt中用信號與槽來代替函數(shù)指針,使程序更安全簡潔。

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

信號

當(dāng)對象改變其狀態(tài)時,信號就由該對象發(fā)射 (emit) 出去,而且對象只負責(zé)發(fā)送信號,它不知道另一端是誰在接收這個信號。這樣就做到了真正的信息封裝,能確保對象被當(dāng)作一個真正的軟件組件來使用。

用于接收信號,而且槽只是普通的對象成員函數(shù)。一個槽并不知道是否有任何信號與自己相連接。而且對象并不了解具體的通信機制。

信號與槽的連接

所有從 QObject 或其子類 ( 例如 Qwidget ) 派生的類都能夠包含信號和槽。因為信號與槽的連接是通過 QObject 的 connect() 成員函數(shù)來實現(xiàn)的。

connect(sender, SIGNAL(signal), receiver, SLOT(slot));

其中 sender 與 receiver 是指向?qū)ο蟮闹羔?,SIGNAL() 與 SLOT() 是轉(zhuǎn)換信號與槽的宏。

特點

1、一個信號可以連接多個槽

當(dāng)信號發(fā)射時,會以不確定的順序一個接一個的調(diào)用各個槽。

2、多個信號可以連接同一個槽

即無論是哪一個信號被發(fā)射,都會調(diào)用這個槽。

3、信號直接可以相互連接

發(fā)射第一個信號時,也會發(fā)射第二個信號。4、連接可以被移除

這種情況用得比較少,因為在對象被刪除時,Qt會自動移除與這個對象相關(guān)的所有連接。語法如下:

disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));

觀察者模式

定義

觀察者模式(又被稱為發(fā)布-訂閱(Publish/Subscribe)模式,屬于行為型模式的一種,它定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)變化時,會通知所有的觀察者對象,使他們能夠自動更新自己。

觀察者模式結(jié)構(gòu)圖

在觀察者模式中有如下角色:

1、Subject:抽象主題(抽象被觀察者),抽象主題角色把所有觀察者對象保存在一個集合里,每個主題都可以有任意數(shù)量的觀察者,抽象主題提供一個接口,可以增加和刪除觀察者對象。
2、ConcreteSubject:具體主題(具體被觀察者),該角色將有關(guān)狀態(tài)存入具體觀察者對象,在具體主題的內(nèi)部狀態(tài)發(fā)生改變時,給所有注冊過的觀察者發(fā)送通知。
3、Observer:抽象觀察者,是觀察者者的抽象類,它定義了一個更新接口,使得在得到主題更改通知時更新自己。
4、ConcrereObserver:具體觀察者,實現(xiàn)抽象觀察者定義的更新接口,以便在得到主題更改通知時更新自身的狀態(tài)。

實現(xiàn)簡單的信號和槽

為什么要說觀察者模式呢?因為Qt的信號和槽就是基于這種設(shè)計模式來進行設(shè)計的。通過信號和槽將對發(fā)送者信號感興趣的對象連接起來,當(dāng)發(fā)送者的信號發(fā)送的時候,就會對這個列表進行遍歷,這種方式類似于廣播,不關(guān)心用戶是否收到,只是進行發(fā)送而已。下面是實現(xiàn)方式。

#include <iostream>
#include <vector>
using namespace std;
//槽函數(shù)類
template <class TParam>
class SlotBase
{
public:
    virtual void slotFuntion(TParam) = 0;
    virtual ~SlotBase() = default;
};
template <class TReceiver,class TParam>
class Slot:public SlotBase<TParam>
{
private:
    TReceiver *m_preveiver;
    void (TReceiver::*m_func)(TParam);
public:
    Slot(TReceiver * reveiver,void(TReceiver::*func)(TParam))
    {
        m_preveiver = reveiver;
        m_func = func;
    }
    void slotFuntion(TParam param) override
    {
        (m_preveiver->*m_func)(param);
    }
};
//信號類
template <class TParam>
class Signal
{
private:
    std::vector<SlotBase<TParam> *> signal_vector;
public:
    template <class TReceiver>
    void addSlot(TReceiver *reveiver,void(TReceiver::*func)(TParam))
    {
        signal_vector.push_back(new Slot(reveiver,func));
    }
    void operator()(TParam param)
    {
        for(SlotBase<TParam> *p:signal_vector)
        {
            p->slotFuntion(param);
        }
    }
};
//兩個測試的接受信號類
class Receiver1
{
public:
    void func1(int param)
    {
        std::cout<<"這是Receiver1類中方法,參數(shù)為"<<param<<endl;
    }
};
class Receiver2
{
public:
    void func2(int param)
    {
        std::cout<<"這是Receiver2類中方法,參數(shù)為"<<param<<endl;
    }
};
class SendObj
{
public:
    Signal<int> valueChanged;
public:
    void testSend(int value)
    {
        valueChanged(value);
    }
};
#define connect(send,signal,reveiver,slot) send->signal.addSlot(reveiver,slot)
int main()
{
    SendObj *send=new SendObj;
    Receiver1 *r1 = new Receiver1;
    Receiver2 *r2 = new Receiver2;
    connect(send,valueChanged,r1,&Receiver1::func1);
    connect(send,valueChanged,r2,&Receiver2::func2);
    send->testSend(100);
    return 0;
}

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

相關(guān)文章

  • VC創(chuàng)建圓角dialog的實現(xiàn)方法

    VC創(chuàng)建圓角dialog的實現(xiàn)方法

    這篇文章主要介紹了VC創(chuàng)建圓角dialog的實現(xiàn)方法,結(jié)合實例形式分析了圓角dialog對話框的創(chuàng)建步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2016-08-08
  • C語言?超詳細順序表的模擬實現(xiàn)實例建議收藏

    C語言?超詳細順序表的模擬實現(xiàn)實例建議收藏

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關(guān)系由它們的存儲順序自然表示
    2022-03-03
  • C++實現(xiàn)回文串判斷的兩種高效方法

    C++實現(xiàn)回文串判斷的兩種高效方法

    文章介紹了兩種判斷回文串的方法:解法一通過創(chuàng)建新字符串來處理,解法二在原字符串上直接篩選判斷,兩種方法都使用了雙指針法,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2025-03-03
  • C/C++實現(xiàn)監(jiān)控目錄文件變化

    C/C++實現(xiàn)監(jiān)控目錄文件變化

    ReadDirectoryChangesW是Windows操作系統(tǒng)提供的一個函數(shù),用于監(jiān)視目錄的變化,本文主要為大家介紹了如何使用ReadDirectoryChangesW實現(xiàn)監(jiān)控目錄文件變化,需要的可以參考下
    2023-11-11
  • C語言中的逗號運算符詳解

    C語言中的逗號運算符詳解

    在C語言中逗號“,”也是一種運算符,稱為逗號運算符,其功能是把兩個表達式連接起來組成一個表達式,?稱為逗號表達式,這篇文章主要介紹了C語言中的逗號運算符,需要的朋友可以參考下
    2022-11-11
  • C語言實現(xiàn)外賣管理系統(tǒng)

    C語言實現(xiàn)外賣管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)外賣管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • MATLAB實現(xiàn)五子棋游戲(雙人對戰(zhàn)、可悔棋)

    MATLAB實現(xiàn)五子棋游戲(雙人對戰(zhàn)、可悔棋)

    這篇文章主要為大家詳細介紹了MATLAB實現(xiàn)五子棋游戲,可以進行雙人對戰(zhàn)、也可悔棋,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 淺析stl序列容器(map和set)的仿函數(shù)排序

    淺析stl序列容器(map和set)的仿函數(shù)排序

    有序的stl容器在工程中應(yīng)用什么方便和廣泛,但是當(dāng)我們需要自己的排序的時候,可以用仿函數(shù)來設(shè)置它
    2013-09-09
  • C語言中0數(shù)組\柔性數(shù)組的使用詳解

    C語言中0數(shù)組\柔性數(shù)組的使用詳解

    這篇文章主要給大家介紹了關(guān)于C語言中0數(shù)組\柔性數(shù)組使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • C++中地圖按鍵排序?qū)崿F(xiàn)示例

    C++中地圖按鍵排序?qū)崿F(xiàn)示例

    這篇文章主要為大家介紹了C++中地圖按鍵排序?qū)崿F(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07

最新評論

泾阳县| 区。| 贡山| 长岛县| 探索| 洪泽县| 神农架林区| 武宣县| 南平市| 兴山县| 巴东县| 嵩明县| 香格里拉县| 年辖:市辖区| 徐州市| 宿州市| 桃江县| 宁津县| 德保县| 双峰县| 静安区| 喀喇沁旗| 满洲里市| 漳平市| 鹿泉市| 仲巴县| 大埔区| 施甸县| 临邑县| 共和县| 望城县| 盐池县| 兰溪市| 门头沟区| 平果县| 灌南县| 张家川| 苍南县| 宁城县| 从化市| 腾冲县|