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

Qt帶參數的信號和槽函數舉例詳解

 更新時間:2025年03月14日 10:28:27   作者:Yui_  
信號槽的設計旨在實現控件和處理邏輯的解耦合,但在實際開發(fā)中,一對一的關系更為常見,這篇文章主要介紹了Qt帶參數的信號和槽函數的相關資料,需要的朋友可以參考下

前言

在前面的文章中,我們已經了解了Qt自帶的信號和槽函數以及自定義的信號和槽函數,但是這些都是沒有帶參數的,其實信號和槽函數是可以帶有參數的。

1. 帶參數的信號和槽

Qt的信號和槽也是支持帶有參數的,同時也支持重載。

此處我們要求,信號函數的參數列表要和對應連接的槽函數參數列表一致。當信號觸發(fā)時,調用槽函數的時候,信號函數的實參就能被傳遞到槽函數的形參當中。

1.2 參數匹配的信號和槽函數

下面我回寫一個程序,程序的功能是通過兩個按鈕來傳遞參數人窗口的標題發(fā)生改變。

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(this,&Widget::mySignal,this,&Widget::handle);
}

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

void Widget::handle(QString s)
{
    this->setWindowTitle(s);
}


void Widget::on_pushButton_clicked()
{
    emit mySignal("被按鈕1調用");
}

void Widget::on_pushButton_2_clicked()
{
    emit mySignal("被按鈕2調用");
}

頭文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QString>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
signals:
    void mySignal(QString s);
public slots:
    void handle(QString s);

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

當信號函數和槽函數參數匹配時,并不會發(fā)生什么,那么現在讓我們來看看參數不匹配的情況下是怎么樣的吧。

1.2 參數不匹配的信號和槽

參數不匹配的情況可以分為三種:

  • 槽函數的參數數量大于信號函數的參數數量但參數類型相同
  • 信號函數的參數數量大于槽函數的參數數量但參數類型相同
  • 信號函數和槽函數的參數數量相同但參數類型不同
    下面開始逐個講解

1.2.1 槽函數參數數量大于信號函數

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(this,&Widget::mySignal,this,&Widget::handle);
}

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

void Widget::handle(QString s1,QString s2)
{
    this->setWindowTitle(s1);
}


void Widget::on_pushButton_clicked()
{
    emit mySignal("被按鈕1調用");
}

void Widget::on_pushButton_2_clicked()
{
    emit mySignal("被按鈕2調用");
}

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QString>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
signals:
    void mySignal(QString s1);
public slots:
    void handle(QString s1,QString s2);

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

可以看到,編譯器報錯了,這也就說明了槽函數參數數量大于信號函數是不可以的。

1.2.2 信號函數參數數量大于槽函數

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(this,&Widget::mySignal,this,&Widget::handle);
}

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

void Widget::handle(QString s)
{
    this->setWindowTitle(s);
}


void Widget::on_pushButton_clicked()
{
    emit mySignal("被按鈕1調用","");
}

void Widget::on_pushButton_2_clicked()
{
    emit mySignal("被按鈕2調用","");
}

可以正常運行,也就表明信號函數的參數個數超過槽函數的參數個數參數個數是可以正常使用的,但是反過來就是不行,槽函數的參數個數大于信號函數的參數個數,無法編譯通過。

個數的不一致,槽函數就會按照參數的順序拿到信號的前N個參數,確保槽函數的每個之都是有值。

思考下,為什么會這樣呢?又為什么不要求參數的個數嚴格一致呢?

如果我們要求參數的個數完全一致,就意味著信號綁定到槽函數的要求變高了,換言之當下的規(guī)則允許信號和槽函數之間的綁定更加的靈活,更多的信號可以綁定到這個槽函數上了。

1.2.3 信號函數和槽函數的參數類型不同

會報錯~

帶有參數的信號要求信號的參數和槽函數的參數類型是一致的。

2.知識補充

2.1 Q_OBJECT

Qt中如果要讓某個類能夠使用信號槽,必須要在類最開始的地方,寫下Q_OBJECT宏

使用ALT加右鍵點擊

就可以看到里面的內容了,實際上這里還可以再進一步展開,最終會得到一系列很復雜的代碼。

2.1 信號槽多對多

所謂的信號槽,終究要解決的問題就是響應用戶的操作。

信號槽,其實在GUI開發(fā)的各種框架中是一個比較"有特色"的存在。

大部分的GUI開發(fā)框架都是一對一的存在

一個事件只能對應一個處理函數,一個處理函數也只能對應到一個事件上。

就比如網頁開發(fā)中的JS,網頁開發(fā)中響應用戶操作,主要就是掛回調函數。

而Qt專門搞了一個單獨的connect來完成信號槽的連接

Qt信號槽的設計,理想很美好,現實很骨感

該機制主要的效果就是:

  • 解耦合,把觸發(fā)用戶操作的控件和處理對應用戶的操作邏輯解耦合。
  • 多對多的效果:一個信號可以connect到多個槽函數上,一個槽函數,也可以被多個信號connect。
    那么什么是多對多呢?
    以選課為例,一個學生可以選擇多門課,一門課可以被多名學生選擇這種。
    多對多真的實用嗎?
    答案是否定的,在實際的開發(fā)過程中,隨著大家的經驗越來越多,其實在GUI開發(fā)的過程中,多對多就是一個偽需求,實際的開發(fā)中很少用到,絕大情況下一對一就夠用了。
    所以一些新的圖形化開發(fā)框架,很少有再繼續(xù)支持這種多對多的了~

3. 總結

本文我們了解了帶參數的信號和槽函數,得知了槽函數會接受到來自信號的參數。且這個參數也是有要求的,信號函數的參數個數可以大于槽函數的參數個數,但是類型必須相同。

到此這篇關于Qt帶參數的信號和槽函數的文章就介紹到這了,更多相關Qt帶參數信號和槽函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言實現單元測試的示例詳解

    C語言實現單元測試的示例詳解

    單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。這篇文章主要為大家介紹了C語言實現單元測試的方法,需要的可以參考一下
    2022-09-09
  • C++關于字符的接收與輸出操作示例

    C++關于字符的接收與輸出操作示例

    這篇文章主要介紹了C++關于字符的接收與輸出操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • C語言模擬實現掃雷游戲

    C語言模擬實現掃雷游戲

    這篇文章主要為大家詳細介紹了C語言模擬實現掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C語言從猜數字游戲中理解數據結構

    C語言從猜數字游戲中理解數據結構

    猜數字是興起于英國的益智類小游戲,起源于20世紀中期,一般由兩個人或多人玩,也可以由一個人和電腦玩。游戲規(guī)則為一方出數字,一方猜,今天我們來用這個游戲案例理解數據結構
    2022-04-04
  • Microsoft?Visual?C++進行調試的方法實現

    Microsoft?Visual?C++進行調試的方法實現

    VS功能極其強大,使用極其便利,本文主要介紹了Microsoft?Visual?C++進行調試的方法實現,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • C語言通過二分查找實現猜數字游戲

    C語言通過二分查找實現猜數字游戲

    這篇文章主要為大家詳細介紹了在C語言中如何通過二分查找思想編寫一個簡單的猜數字游戲,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-02-02
  • C語言詳解格式控制符scanf與printf的輸入輸出

    C語言詳解格式控制符scanf與printf的輸入輸出

    這篇文章主要介紹了C語言格式控制符中輸入scanf()和輸出printf()的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2022-04-04
  • C語言熱門考點結構體與內存對齊詳解

    C語言熱門考點結構體與內存對齊詳解

    在掌握基本的結構體使用后,我們在面試和大型比賽中常常會遇到一個熱門考點:結構體內存對齊,也就是計算結構體大小。接下來請跟著筆者一起來學習這塊知識點吧
    2021-10-10
  • Visual Studio中scanf函數報錯的幾種解決方法

    Visual Studio中scanf函數報錯的幾種解決方法

    本文主要介紹了Visual Studio中scanf函數報錯的幾種解決方法,文中通過圖文示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • c語言實現數組循環(huán)左移m位

    c語言實現數組循環(huán)左移m位

    這篇文章主要介紹了c語言實現數組循環(huán)左移m位,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論