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

Qt中connect()函數(shù)及用法詳解

 更新時(shí)間:2024年07月11日 11:42:03   作者:澀即是Null  
connect() 函數(shù)就是Qt 框架中用于將信號(SIGNAL)和槽(SLOT)關(guān)聯(lián)起來的核心函數(shù),本文給大家介紹Qt中connect()函數(shù),感興趣的朋友跟隨小編一起看看吧

一、基本概念

        要想了解connect() 函數(shù),要先知道在Qt中什么是什么是信號(SIGNAL)和槽(SLOT)。

        信號(SIGNAL):指在特定情況下發(fā)射的通知。比如當(dāng)我們點(diǎn)擊了用戶界面的一個(gè)按鈕之后就發(fā)射了一個(gè)信號。

        槽(SLOT):是指對信號進(jìn)行響應(yīng)的函數(shù)。也就是我們點(diǎn)擊了一個(gè)按鈕后我們要實(shí)現(xiàn)的功能。

        那么connect() 函數(shù)就是Qt 框架中用于將信號(SIGNAL)和槽(SLOT)關(guān)聯(lián)起來的核心函數(shù)。

二、用法

1.舊版用法(Qt4和早期Qt5)

connect(sender, SIGNAL(signalName()), receiver, SLOT(slotName()));
  • sender:發(fā)射信號的對象名稱
  • signalName():信號名稱
  • receiver:接收信號的對象名稱,一般情況下為槽函數(shù)所屬對象,寫this即可
  • slotName():槽函數(shù)名稱

示例: 

connect(button, SIGNAL(clicked()), this, SLOT(handleButtonClicked()));

注意: 如果信號與槽函數(shù)帶參數(shù)還需要在函數(shù)括號內(nèi)標(biāo)出。

2.新版用法(推薦)

connect(sender, &SenderClass::signalName, receiver, &ReceiverClass::slotName);

         這里引入了基于函數(shù)指針的語法,使得編譯器可以進(jìn)行更好的類型檢查。但是這里有一個(gè)問題:與舊版的寫法不同的是,信號與槽函數(shù)的參數(shù)怎么辦?

        首先我們知道,在 Qt 的信號與槽機(jī)制中,槽函數(shù)的參數(shù)不能多于信號的參數(shù)。也就是說,信號的參數(shù)可以多于槽的參數(shù),且槽函數(shù)的參數(shù)必須是信號參數(shù)的一個(gè)子集。那么就可以分為如下三種情況:

        1.信號和槽函數(shù)具有相同數(shù)量和類型的參數(shù)。這時(shí)可以直接連接且無需出現(xiàn)函數(shù)參數(shù):

connect(lineEdit, &QLineEdit::textChanged, this, &Widget::do_textChanged);

在上面示例中,信號textChanged(QString)和槽函數(shù)do_textChanged(QString)參數(shù)相同。

        2.信號的參數(shù)多于槽函數(shù)的參數(shù)。槽函數(shù)將忽略信號的多余參數(shù),這個(gè)特性允許你在信號和槽參數(shù)不完全匹配的情況下,仍然能夠正常工作。正常情況下,不推薦把槽函數(shù)設(shè)計(jì)為overload型。

        3.某些信號的參數(shù)有默認(rèn)值。也就是說同一信號的參數(shù)分為有參數(shù)和無參數(shù),如QCheckBox的clicked()信號和clicked(bool)信號。這時(shí)connect()函數(shù)有兩種寫法:

                a.設(shè)置不同名字的槽函數(shù): 

//槽函數(shù)
void do_checked(bool checked);
void do_checked_NoParam();
//connect()函數(shù)
connect(checkBox, &QCheckBox::clicked, this, &Widget::do_checked);
connect(checkBox, &QCheckBox::clicked, this, &Widget::do_checked_NoParam);

                b.使用模板函數(shù)qOverload()來明確參數(shù)類型:

connect(checkBox, &QCheckBox::clicked, this, qOverload<bool>(&Widget::do_checked));
connect(checkBox, &QCheckBox::clicked, this, qOverload<>(&Widget::do_checked));

3.自動(dòng)連接(無需使用connect()函數(shù))

        在構(gòu)建項(xiàng)目時(shí),若勾選了“Generate form”字段,則會生成一個(gè)后綴為“.ui”的文件。

        那么在ui設(shè)計(jì)界面種可以選中一個(gè)對象,右鍵選擇“Go to slot”或者“轉(zhuǎn)到槽”,在彈出的對話框中再選擇信號,那么就會自動(dòng)生成一個(gè)槽函數(shù)。如果槽函數(shù)的名稱符合相應(yīng)的格式,Qt 會在運(yùn)行時(shí)通過setupUi(this)自動(dòng)生成connect()函數(shù)完成連接。

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    //由go to slot生成的槽函數(shù)可以自動(dòng)關(guān)聯(lián)
    ui->setupUi(this);  
    //自定義槽函數(shù)需要手動(dòng)關(guān)聯(lián)
    connect(ui->radioButtonBlack,SIGNAL(clicked()),this,SLOT(do_setFontColor()));
}
//自動(dòng)生成的槽函數(shù)格式:void on_<objectName>_<signalName>(){}
void Widget::on_btnCal_clicked()
{
    ...
}
//手動(dòng)寫的槽函數(shù)
void Widget::do_setFontColor()
{
    ...
}

        當(dāng)然在設(shè)計(jì)一些復(fù)雜功能時(shí),自動(dòng)連接方法就不太適用了。

4.Lambda表達(dá)式(Qt5.4)

        lambda 表達(dá)式提供了一種非常靈活的方式來處理信號。有如下幾個(gè)優(yōu)點(diǎn):

  • 可以直接在連接語句中定義信號處理邏輯,無需在類中定義額外的槽函數(shù)。這在處理簡單邏輯時(shí)尤其方便。
  • 避免為每個(gè)信號處理邏輯定義新的槽函數(shù),減少命名空間污染。
  • 允許你在處理信號參數(shù)時(shí),捕獲外部變量或定義額外的處理邏輯。

基本格式如下:

connect(sender, &SenderClass::signalName, [lambda expression]);

         舉個(gè)栗子對比理解一下:

//方法一:使用槽函數(shù)指針連接
void processData(int value, QString message) {
    if (value > 10) {
        qDebug() << "Value is greater than 10:" << value << ", Message:" << message;
    } else {
        qDebug() << "Value is 10 or less:" << value;
    }
}
QObject::connect(&sender, &SenderClass::signalName, this, &ReceiverClass::processData);
//方法二:使用lambda表達(dá)式連接
QObject::connect(&sender, &SenderClass::signalName, [this](int value, QString message) {
    if (value > 10) {
        qDebug() << "Value is greater than 10:" << value << ", Message:" << message;
    } else {
        qDebug() << "Value is 10 or less:" << value;
    }
});

三、斷開連接disconnect()

1.為什么使用disconnect()

        使用connect()函數(shù)可以關(guān)聯(lián)信號與槽,那么刪除connect()函數(shù)不就可以斷開連接了嗎?

         其實(shí)不然!我們最好使用官方的 disconnect() 函數(shù)來解除信號與槽的連接。原因有如下幾點(diǎn):

a.動(dòng)態(tài)控制信號和槽的連接

        有時(shí)你需要在運(yùn)行時(shí)動(dòng)態(tài)地控制信號和槽的連接。例如,你可能需要在某些情況下連接信號和槽,而在其他情況下斷開它們。在這種情況下,使用 disconnect() 函數(shù)可以讓你在需要時(shí)靈活地?cái)嚅_連接,而不需要修改代碼來刪除 connect() 調(diào)用。

b.保持代碼的結(jié)構(gòu)和可讀性

         connect() 調(diào)用通常在類的構(gòu)造函數(shù)或初始化方法中設(shè)置,表示對象之間的關(guān)系和交互。將連接和斷開連接的邏輯分開可以使代碼更清晰、更具結(jié)構(gòu)性。如果直接刪除 connect() 調(diào)用,代碼邏輯可能會變得混亂且難以維護(hù)。

c. 方便的調(diào)試和維護(hù)

        使用 disconnect() 可以更方便地調(diào)試和維護(hù)代碼。你可以在調(diào)試時(shí)臨時(shí)斷開某些連接,而無需刪除和重新添加 connect() 調(diào)用。這樣可以避免錯(cuò)誤,并更容易地還原代碼。

d. 多次連接和斷開

        在某些情況下,你可能會多次連接和斷開相同的信號和槽。例如,當(dāng)某個(gè)條件發(fā)生變化時(shí),你希望斷開以前的連接并建立新的連接。使用 disconnect() 可以確保你正確地?cái)嚅_之前的連接,而不會遺留下不需要的連接。

2.使用方法

a.解除與一個(gè)發(fā)射者所有信號的連接

disconnect(myObject, nullptr, nullptr, nullptr);
myObject->disconnect();

b.解除與一個(gè)特定信號的所有連接

disconnect(myObject, SIGNAL(mySignal), nullptr, nullptr);
myObject->disconnect(SIGNAL(mySignal));

c.解除與一個(gè)特定接收者的所有連接

disconnect(myObject, nullptr, myReceiver, nullptr);
myObject->disconnect( myReceiver);

d.解除特定的一個(gè)信號與槽的連接

disconnect(lineEdit, &QLineEdit::textChanged, label, &QLabel::setText);

四、細(xì)節(jié)問題

        1. 一個(gè)信號可以連接到多個(gè)槽,所有連接的槽都會在信號發(fā)出時(shí)依次被調(diào)用。

connect(sender, &SenderClass::signalName, receiver1, &ReceiverClass1::slotName);
connect(sender, &SenderClass::signalName, receiver2, &ReceiverClass2::slotName);

        2. 信號和槽機(jī)制是單向的,即信號發(fā)出時(shí)會調(diào)用槽函數(shù),但槽函數(shù)中發(fā)出的信號不會自動(dòng)調(diào)用其他槽函數(shù),除非你明確連接了這些信號和槽。

到此這篇關(guān)于Qt中connect()函數(shù)的文章就介紹到這了,更多相關(guān)Qt connect()函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言由淺入深講解文件的操作下篇

    C語言由淺入深講解文件的操作下篇

    C語言具有操作文件的能力,比如打開文件、讀取和追加數(shù)據(jù)、插入和刪除數(shù)據(jù)、關(guān)閉文件、刪除文件等。與其他編程語言相比,C語言文件操作的接口相當(dāng)簡單和易學(xué)
    2022-04-04
  • C語言switch語句和if用法介紹

    C語言switch語句和if用法介紹

    本文詳細(xì)講解了C語言switch語句和if用法介紹,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • vscode終端中打不開conda虛擬包管理的解決

    vscode終端中打不開conda虛擬包管理的解決

    本文主要介紹了vscode終端中打不開conda虛擬包管理的解決,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • C++實(shí)現(xiàn)LeetCode(191.位1的個(gè)數(shù))

    C++實(shí)現(xiàn)LeetCode(191.位1的個(gè)數(shù))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(191.位1的個(gè)數(shù)),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言實(shí)現(xiàn)線性動(dòng)態(tài)(單向)鏈表的示例代碼

    C語言實(shí)現(xiàn)線性動(dòng)態(tài)(單向)鏈表的示例代碼

    本文主要介紹了C語言實(shí)現(xiàn)線性動(dòng)態(tài)(單向)鏈表的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 全面解析C++中的析構(gòu)函數(shù)

    全面解析C++中的析構(gòu)函數(shù)

    這篇文章主要介紹了C++中的析構(gòu)函數(shù),為C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • php正則表達(dá)式的基本語法總結(jié)

    php正則表達(dá)式的基本語法總結(jié)

    以下是對php正則表達(dá)式的基本語法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下
    2013-10-10
  • C++字符串拼接效率對比(+=、append、stringstream、sprintf)

    C++字符串拼接效率對比(+=、append、stringstream、sprintf)

    這篇文章主要介紹了C++字符串拼接效率對比(+=、append、stringstream、sprintf),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言共用體union作用使用示例教程

    C語言共用體union作用使用示例教程

    這篇文章主要為大家介紹了C語言共用體union作用的使用示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-02-02
  • C語言中system()函數(shù)的用法總結(jié)

    C語言中system()函數(shù)的用法總結(jié)

    system()函數(shù)功能強(qiáng)大。以下小編就為大家介紹一下在C語言中system()函數(shù)的用法。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10

最新評論

麻阳| 牟定县| 望江县| 玉林市| 兴隆县| 水富县| 玉溪市| 襄城县| 芜湖县| 和林格尔县| 水富县| 瑞安市| 巫溪县| 桃园市| 宿州市| 竹溪县| 唐河县| 山东省| 永兴县| 民丰县| 措勤县| 富阳市| 甘南县| 卢氏县| 龙岩市| 连云港市| 靖安县| 西丰县| 禄劝| 齐齐哈尔市| 江城| 武宣县| 新津县| 灵宝市| 莱西市| 卓资县| 道孚县| 定兴县| 渑池县| 曲水县| 曲麻莱县|