(三)信號與槽

 

 

案列:ide

1.點擊button1改變button2的內容函數

2.點擊主窗口按鈕,顯示子窗口,再經過自定義信號與槽,點擊子窗口,回到主窗口this

3.重載的信號槽spa

4.拓展:3d

  1.信號能夠鏈接信號指針

  2.一個信號能夠鏈接多個槽函數code

  3.多個信號能夠鏈接一個槽函數對象

  4.槽函數能夠使用lambda表達式blog

mianwidget.cppci

#include "mainwidget.h"
#include <QDebug>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    // init
    b1 = new QPushButton("老大", this);
    b1->move(100, 100);

    b2 = new QPushButton;
    b2->setParent(this);
    b2->setText("老二");
    b2->move(200, 200);

    // b1 close window
    // qt 信號和槽他們都是函數
    // 1. 信號只有函數聲明, 不須要函數定義
    // 2. 槽函數據須要聲明也須要定義, 回調函數
    // connect(b1, &QPushButton::pressed, this, &MainWidget::close);

    // 自定義槽函數
    /*
     * 1. 槽函數在Qt5 能夠是任意類成員函數, 全局函數, 靜態函數, lambda表達式(隱式函數)
     * 2. 槽函數須要與信號對相應(返回值, 參數)
     * 3. 信號沒有返回值, 槽函數返回值: void
     * 4. void mysig(int, double, QString);
     *    void myslot(int, double);
     * 5. 槽函數的參數是爲了接受信號傳過來的的數據
     * 6. 槽函數的參數應該是不可以大於信號的參數個數, 能夠少於信號的參數個數
     * 7. 槽函數能夠重載
    */

    connect(b1, &QPushButton::released, this, &MainWidget::slotForMianWidget);


    // b3 顯示子窗口SubWidget  -- subW
    b3 = new QPushButton("軟件園", this);
    b3->resize(100, 50);
    b3->move(200, 200);

    connect(b3, &QPushButton::clicked, this, &MainWidget::slotHideMe);

    // Qt 5 信號槽的使用方法
    void (SubWidget::*MySigSub)() = &SubWidget::sigSub;// 用函數指針來指定接收的信號是帶參數仍是不帶參數     connect(&subW, MySigSub, this, &MainWidget::slotShowMe);

    void (SubWidget::*MysigPlus)(int, QString) = &SubWidget::sigSub;// 用於信號函數發生重載的時候,告訴編譯器調用哪一個函數
    connect(&subW, MysigPlus, this, &MainWidget::slotSubMsg);

    // Q4 信號槽
    // SIGNAL() SLOT() 宏 將函數轉換爲字符串 宏展開預處理的時候不會報錯 //    connect(&subW, SIGNAL(sigSub()), this, SLOT(slotShowMe()));
//    connect(&subW, SIGNAL(sigSub(int , QString)), this, SLOT(ABCDe(bb, aa)));

    // 使用lambda表達式做爲槽函數
    connect(b1, &QPushButton::clicked, this, [=]()
    {
        b2->setText("lambda表達式!!!");
        b3->hide();
    });
}

MainWidget::~MainWidget()
{

}

void MainWidget::slotForMianWidget()
{
    b2->setText("我被老大更名了...");
}

void MainWidget::slotHideMe()
{
    // 隱藏本身
    hide();
    // 顯示軟件園窗口
    subW.show();
}

void MainWidget::slotShowMe()
{
    // 顯示本身
    show();
    // 隱藏軟件園窗口
    subW.hide();
}

void MainWidget::slotSubMsg(int num, QString str)
{
    // QString --> char*
    // string --> char*   .data()
    qDebug() << num << str.toUtf8().data();

}

 

#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 slotForMianWidget();
    void slotHideMe();
    void slotShowMe();
    void slotSubMsg(int num, QString str);

private:
    QPushButton* b1;
    QPushButton* b2;
    QPushButton* b3;    // 顯示子窗口
    // 子窗口對象
    SubWidget subW;

};

#endif // MAINWIDGET_H
mainwidget.h
#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    b1= new QPushButton("中騰", this);
    b1->resize(100, 100);

    setWindowTitle("軟件園窗口");

    resize(400, 600);

    connect(b1, &QPushButton::clicked, this, &SubWidget::myslot);
}

void SubWidget::myslot()
{
    // 發送信號
    emit sigSub();
    emit sigSub(250, "你是二百五!!!");
}
subwidget.cpp

subwidget.h

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>

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


signals:
    // 自定義信號, 必須使用signals 聲明
    void sigSub();
    void sigSub(int , QString);
    /*
     * 1. 能夠有參數
     * 2. 能夠重載
     * 3. 返回值爲void
     * 4. 發送信號: emit + 信號名;
     * emit sigsub();
    */

public slots:
    void myslot();

private:
    QPushButton* b1;
};

#endif // SUBWIDGET_H
相關文章
相關標籤/搜索