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

Qt信號(hào)與槽知識(shí)點(diǎn)總結(jié)歸納

 更新時(shí)間:2022年12月28日 16:20:21   作者:就要?宅在家  
信號(hào)和槽是一種高級(jí)接口,應(yīng)用于對(duì)象之間的通信,它是QT的核心特性,下面這篇文章主要給大家介紹了關(guān)于Qt信號(hào)與槽知識(shí)點(diǎn)總結(jié)歸納的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一.含義與使用

(一).含義

信號(hào)與槽是qt中一種常用的通信手段。發(fā)送方發(fā)送信號(hào),接收方通過(guò)槽進(jìn)行接收并完成具體任務(wù)。

簡(jiǎn)單來(lái)講,就是通過(guò)發(fā)送一個(gè)函數(shù)(信號(hào)),接收方通過(guò)另一個(gè)函數(shù)(槽)完成任務(wù)。

(二).connect使用

用法上,通過(guò)connect函數(shù)進(jìn)行連接。

connect(發(fā)送方地址,信號(hào)函數(shù),接收方地址,槽函數(shù));

比如我們舉如下例子:

通過(guò)點(diǎn)擊按鈕實(shí)現(xiàn)關(guān)閉窗口。

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::myWidget)
{
    ui->setupUi(this);
    but = new QPushButton("close", this);
    but->move(200, 200);
    //將按鈕clicked信號(hào)函數(shù)與QWidget類的close槽函數(shù)連接
    connect(but, &QPushButton::clicked, this, &QWidget::close);
}

當(dāng)我們進(jìn)行點(diǎn)擊窗口操作時(shí),執(zhí)行clicked函數(shù)進(jìn)而觸發(fā)close關(guān)閉窗口。

如果使用的信號(hào)函數(shù)或槽函數(shù)有重載情況,那么這樣直接通過(guò)地址傳函數(shù)就 不可能了,因?yàn)闊o(wú)法區(qū)別參數(shù)。

此時(shí)需要使用函數(shù)指針完成指定重載版本的調(diào)用。

舉例如下:

A* pa = new A;
B* pb = new B;
void(A::*APtr)(QString) = &A::funcA;
void(B::*BPtr)(QString) = &B::funcB;
//指定調(diào)用參數(shù)為QString的重載版本
connect(pa, APtr, pb, BPtr);

在使用connect時(shí)有幾點(diǎn)需要注意:

1.信號(hào)函數(shù)與槽函數(shù)的參數(shù)類型必須匹配,且信號(hào)函數(shù)參數(shù)個(gè)數(shù)可以比槽函數(shù)多,但絕對(duì)不能少。

2.一個(gè)信號(hào)函數(shù)可以連接多個(gè)槽函數(shù)

3.多個(gè)信號(hào)函數(shù)可以連接同一個(gè)槽函數(shù)

QT4之下的版本不支持這種connect形式,只能通過(guò)如下形式使用:

connect( 發(fā)送方地址,SIGNAL( 信號(hào)函數(shù)(參數(shù)) ),接收方地址,SLOT( 槽函數(shù)(參數(shù)) ) );

SIGNAL和SLOT是宏,編譯時(shí)會(huì)將信號(hào)函數(shù)和槽函數(shù)用字符串替換,并且不會(huì)判斷參數(shù)是否相互匹配,因此只要不是Qt版本問(wèn)題,并不推薦使用這種方式。

使用disconnect可以斷開信號(hào)與槽的連接,參數(shù)與connect一致。 

(三).信號(hào)函數(shù)

如果我們自定義信號(hào)函數(shù),有幾點(diǎn)需要注意:

1.信號(hào)函數(shù)需要使用signals關(guān)鍵字聲明

class A : public QObject
{
    Q_OBJECT
public:
    explicit A(QObject *parent = nullptr);
 
signals://以下均為信號(hào)函數(shù)
    void funcA();
    void funcA(QString str);
};

2.信號(hào)函數(shù)不能定義,只用聲明即可。

3.返回值為void

4.可帶參數(shù),可重載

5.可以使用emit關(guān)鍵字主動(dòng)釋放信號(hào)觸發(fā)槽函數(shù)。

void test{
    emit A()->funcA();//使用無(wú)參版本
}

(四).槽函數(shù)

自定義槽函數(shù)也有幾點(diǎn)需要注意:

1.可聲明為類的任意成員函數(shù)(一般為public),較早版本必須在public slots關(guān)鍵字下聲明。

2.返回類型為void

3.可帶參數(shù),可重載

4.可以使用lambda表達(dá)式替換

二.示例

我們寫一個(gè)程序,按鈕按下時(shí)打開一個(gè)窗口同時(shí)按鈕顯示“close”,再次按下關(guān)閉窗口按鈕變成“open”。

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::myWidget)
{
    ui->setupUi(this);
    //設(shè)置窗口
    setFixedSize(500, 500); 
    //設(shè)置按鈕
    but = new QPushButton("open", this);
    but->move(200, 200);
    but->setCheckable(true);//如果使用toggled必須先使用該函數(shù),clicked亦可。
 
    mw = new QWidget;//窗口
    mw->setWindowTitle("Gap");//窗口名
    //使用lambda表達(dá)式代替槽函數(shù)
    connect(but, &QPushButton::toggled, this, [&]()mutable{
        if(but->text() == "open"){
            mw->show();
            but->setText("close");
 
        }
        else{
            mw->close();
            but->setText("open");
 
        }
    });
 
    //定義一個(gè)按鈕end,按下直接關(guān)閉myWidget窗口退出程序
    QPushButton* end = new QPushButton("end", this);
    but->move(100, 200);
    connect(end, &QPushButton::clicked, this, &QWidget::close);
}

總結(jié)

到此這篇關(guān)于Qt信號(hào)與槽知識(shí)點(diǎn)總結(jié)歸納的文章就介紹到這了,更多相關(guān)Qt信號(hào)與槽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 反射機(jī)制詳解及實(shí)例代碼

    C++ 反射機(jī)制詳解及實(shí)例代碼

    這篇文章主要介紹了C++ 反射機(jī)制詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C語(yǔ)言實(shí)現(xiàn)數(shù)字游戲

    C語(yǔ)言實(shí)現(xiàn)數(shù)字游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 利用Matlab制作一款狗頭翻牌子小游戲

    利用Matlab制作一款狗頭翻牌子小游戲

    本文將用Matlab制作一個(gè)狗頭翻牌子的小游戲,就是點(diǎn)擊一個(gè)牌子時(shí),該牌子和周圍四個(gè)牌子也會(huì)相應(yīng)發(fā)生變化,想辦法讓所有牌子都在同一面即為游戲勝利。感興趣的可以跟隨小編學(xué)習(xí)一下
    2022-03-03
  • C語(yǔ)言實(shí)現(xiàn)點(diǎn)餐系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)點(diǎn)餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C語(yǔ)言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放

    C語(yǔ)言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放

    這篇文章主要介紹了C語(yǔ)言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Linux vmstat命令實(shí)戰(zhàn)詳細(xì)解析

    Linux vmstat命令實(shí)戰(zhàn)詳細(xì)解析

    這個(gè)命令是我查看Linux/Unix最喜愛(ài)的命令,一個(gè)是Linux/Unix都支持,二是相比top,我可以看到整個(gè)機(jī)器的CPU,內(nèi)存,IO的使用情況,而不是單單看到各個(gè)進(jìn)程的CPU使用率和內(nèi)存使用率(使用場(chǎng)景不一樣)
    2013-09-09
  • C++的深淺拷貝和寫時(shí)拷貝你了解嗎

    C++的深淺拷貝和寫時(shí)拷貝你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++的深淺拷貝和寫時(shí)拷貝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C++控制臺(tái)實(shí)現(xiàn)密碼管理系統(tǒng)

    C++控制臺(tái)實(shí)現(xiàn)密碼管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++控制臺(tái)實(shí)現(xiàn)密碼管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語(yǔ)言實(shí)現(xiàn)超市計(jì)價(jià)收款系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)超市計(jì)價(jià)收款系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)超市計(jì)價(jià)收款系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解C++基礎(chǔ)——類繼承

    詳解C++基礎(chǔ)——類繼承

    這篇文章主要介紹了C++類繼承,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論