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

Qt帶參數(shù)的信號(hào)和槽函數(shù)舉例詳解

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

前言

在前面的文章中,我們已經(jīng)了解了Qt自帶的信號(hào)和槽函數(shù)以及自定義的信號(hào)和槽函數(shù),但是這些都是沒有帶參數(shù)的,其實(shí)信號(hào)和槽函數(shù)是可以帶有參數(shù)的。

1. 帶參數(shù)的信號(hào)和槽

Qt的信號(hào)和槽也是支持帶有參數(shù)的,同時(shí)也支持重載。

此處我們要求,信號(hào)函數(shù)的參數(shù)列表要和對(duì)應(yīng)連接的槽函數(shù)參數(shù)列表一致。當(dāng)信號(hào)觸發(fā)時(shí),調(diào)用槽函數(shù)的時(shí)候,信號(hào)函數(shù)的實(shí)參就能被傳遞到槽函數(shù)的形參當(dāng)中。

1.2 參數(shù)匹配的信號(hào)和槽函數(shù)

下面我回寫一個(gè)程序,程序的功能是通過兩個(gè)按鈕來傳遞參數(shù)人窗口的標(biāo)題發(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調(diào)用");
}

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

頭文件:

#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

當(dāng)信號(hào)函數(shù)和槽函數(shù)參數(shù)匹配時(shí),并不會(huì)發(fā)生什么,那么現(xiàn)在讓我們來看看參數(shù)不匹配的情況下是怎么樣的吧。

1.2 參數(shù)不匹配的信號(hào)和槽

參數(shù)不匹配的情況可以分為三種:

  • 槽函數(shù)的參數(shù)數(shù)量大于信號(hào)函數(shù)的參數(shù)數(shù)量但參數(shù)類型相同
  • 信號(hào)函數(shù)的參數(shù)數(shù)量大于槽函數(shù)的參數(shù)數(shù)量但參數(shù)類型相同
  • 信號(hào)函數(shù)和槽函數(shù)的參數(shù)數(shù)量相同但參數(shù)類型不同
    下面開始逐個(gè)講解

1.2.1 槽函數(shù)參數(shù)數(shù)量大于信號(hào)函數(shù)

#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調(diào)用");
}

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

#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

可以看到,編譯器報(bào)錯(cuò)了,這也就說明了槽函數(shù)參數(shù)數(shù)量大于信號(hào)函數(shù)是不可以的。

1.2.2 信號(hào)函數(shù)參數(shù)數(shù)量大于槽函數(shù)

#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調(diào)用","");
}

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

可以正常運(yùn)行,也就表明信號(hào)函數(shù)的參數(shù)個(gè)數(shù)超過槽函數(shù)的參數(shù)個(gè)數(shù)參數(shù)個(gè)數(shù)是可以正常使用的,但是反過來就是不行,槽函數(shù)的參數(shù)個(gè)數(shù)大于信號(hào)函數(shù)的參數(shù)個(gè)數(shù),無法編譯通過。

個(gè)數(shù)的不一致,槽函數(shù)就會(huì)按照參數(shù)的順序拿到信號(hào)的前N個(gè)參數(shù),確保槽函數(shù)的每個(gè)之都是有值。

思考下,為什么會(huì)這樣呢?又為什么不要求參數(shù)的個(gè)數(shù)嚴(yán)格一致呢?

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

1.2.3 信號(hào)函數(shù)和槽函數(shù)的參數(shù)類型不同

會(huì)報(bào)錯(cuò)~

帶有參數(shù)的信號(hào)要求信號(hào)的參數(shù)和槽函數(shù)的參數(shù)類型是一致的。

2.知識(shí)補(bǔ)充

2.1 Q_OBJECT

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

使用ALT加右鍵點(diǎn)擊

就可以看到里面的內(nèi)容了,實(shí)際上這里還可以再進(jìn)一步展開,最終會(huì)得到一系列很復(fù)雜的代碼。

2.1 信號(hào)槽多對(duì)多

所謂的信號(hào)槽,終究要解決的問題就是響應(yīng)用戶的操作。

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

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

一個(gè)事件只能對(duì)應(yīng)一個(gè)處理函數(shù),一個(gè)處理函數(shù)也只能對(duì)應(yīng)到一個(gè)事件上。

就比如網(wǎng)頁開發(fā)中的JS,網(wǎng)頁開發(fā)中響應(yīng)用戶操作,主要就是掛回調(diào)函數(shù)。

而Qt專門搞了一個(gè)單獨(dú)的connect來完成信號(hào)槽的連接

Qt信號(hào)槽的設(shè)計(jì),理想很美好,現(xiàn)實(shí)很骨感

該機(jī)制主要的效果就是:

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

3. 總結(jié)

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

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

相關(guān)文章

最新評(píng)論

保靖县| 黄浦区| 那曲县| 纳雍县| 马龙县| 资中县| 清镇市| 宜兰县| 赫章县| 澎湖县| 越西县| 社会| 泗洪县| 子洲县| 杭锦后旗| 扶沟县| 廊坊市| 全南县| 丹巴县| 江安县| 新乡县| 漾濞| 和平区| 平度市| 鸡东县| 衡阳市| 雅江县| 永德县| 孟村| 鄂温| 呼图壁县| 汝州市| 鄂尔多斯市| 桃江县| 黄骅市| 西盟| 广平县| 唐河县| 舒城县| 广平县| 贵德县|