QT+信號有參數與無參數的實現+QT4和QT5在信號和槽使用上的區別


在QT5中,信號有參數和無參數

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>


class SubWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = 0);

    void sendSlot();

signals:
    /*信號必須有singles關鍵字來聲明
     * 信號沒有返回值,但可以有參數
     * 信號就是函數的生命,只需聲明,無需定義
     * 使用:emit mySignal();
    */
    void mySignal();

    void mySignal(int , QString);

public slots:


private:
    QPushButton btn4;
};

#endif // SUBWIDGET_H
#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{

    this->setWindowTitle("波老師");

    this->setFixedSize(360,480);
    btn4.setParent(this);
    btn4.setText("切換到蒼老師");

    //點擊按鈕btn4實現給主窗口發送信號
    connect(&btn4,&QPushButton::clicked,this,&SubWidget::sendSlot);


}


void SubWidget::sendSlot()
{
    emit mySignal();
    emit mySignal(250,"我是子窗口");
}

 

 

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>

#include <QPushButton>

#include "subwidget.h"//自子窗口頭文件

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();

    void mySlot();//自定義的槽函數

    void changeWin();

    void dealWin();

    void subSlot(int a,QString str);
private:
    QPushButton btn1;
    QPushButton *btn2;
    QPushButton btn3;
    SubWidget w;//該對象在主窗口中,子窗口沒有辦法調用,所以需要利用子窗口發送給主窗口消息,進而主窗口進行處理
};

#endif // MAINWIDGET_H

 

 

 

#include "mainwidget.h"

#include <QPushButton>

#include <QDebug>
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{

//    QPushButton btn1;
//    QPushButton btn2;

    btn1.setParent(this);
    btn1.setText("colse");
    btn1.move(100,100);


    btn2 = new QPushButton(this);//指針沒有空間,是需要動態的對其進行空間的分配
    btn2 ->setParent(this);
    btn2 ->setText(" 3 2 1 ");

    connect(&btn1,&QPushButton::pressed,this ,&MainWidget::close);

    /* 對connect的說明:
     * &btn1 :信號發出着,指針類型
     * &QPushButton::pressed:處理信號,  &發送者的類名::信號名字
     * this:信號接收者
     * &MainWidget::close:   槽函數,信號處理函數 &接收者的類名::槽函數名字
    */


    /*自定義槽,說的更加通俗一點,就是普通函數的用法
     * QT5:可以是 任意的成員函數(常用這種方法,直接寫成該類的成員函數),普通全局函數,靜態函數  都可以是槽函數
     * 槽函數需要和信號一致(參數,返回值)
     * 由於信號都是沒有返回值,所以,槽函數一定沒有返回值
    */
    //釋放按鈕btn2實現里面的文本內容發生改變
    connect(btn2,&QPushButton::released,this,&MainWidget::mySlot);//在寫自定義信號槽函數的時候,一定要看發送信號函數的類型,這里released信號的函數是:void QAbstractButton::released()
                                                //即released函數沒有參數,也沒有返回值,槽函數需要和信號一致,也沒有參數和返回值

    //釋放按鈕btn2隱藏按鈕btn1
    connect(btn2,&QPushButton::released,&btn1,&QPushButton::hide);

    //互相切換窗口的小游戲
    this->setFixedSize(360,480);
    this ->setWindowTitle("蒼老師");
    btn3.setParent(this);
    btn3.setText("換到波老師");
    btn3.move(50,50);


    //顯示子窗口
//    w.show();

    //點擊按鈕btn3實現主窗口隱藏,子窗口顯示
    connect(&btn3,&QPushButton::released,this,&MainWidget::changeWin);

    //處理子窗口發送過來的信號
    void (SubWidget::*funSognal)() = &SubWidget::mySignal;
    connect(&w,funSognal,this,&MainWidget::dealWin);
    //處理子窗口發送過來的信號(有參數)
    void (SubWidget::*testSognal)(int ,QString) = &SubWidget::mySignal;
    connect(&w,testSognal,this,&MainWidget::subSlot);
}

//自定義槽函數的實現
void MainWidget::mySlot()
{
    btn2->setText("I LOVE YOU");
}

void MainWidget::changeWin()
{
    //子窗口顯示,
    w.show();
    //本窗口隱藏
    this ->hide();

}
void MainWidget::dealWin()
{
    //子窗口隱藏
    w.hide();
    //本窗口顯示
    this->show();
}

void MainWidget::subSlot(int a,QString str)
{
    qDebug()<<a<<str;
}
MainWidget::~MainWidget()
{

}

當信號函數發生重載的時候,為了不產生二義性,需要使用函數指針的方式進行區分,(這里需要重點掌握指針函數的用法),同時從這種寫法來看,也不難看出其在語法上還是比較難的,在QT4中則沒用這么難,方式如下:

  1)對槽函數聲明public slots:

  2)其最大的優勢是當寫connect中的SIGNAL和SLOT時會自動提示信號的類型,

既然QT4在這個方面那么簡單簡潔,為什么還要用QT5那么難的語法呢(函數指針)?這是因為在QT4中 SIGNAL 和SLOT 將函數名字轉化成字符串  不進行錯誤的檢查,只在運行的時候來提示程序不可行,在大的項目中,代碼量是非常大的,我們還是盡量希望其能夠提示語法的錯誤,不希望最后運行時提示有錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM