QT自定義信號和槽

最近項目中使用到QT,在此記錄一下QT的核心,信號與槽:ide

 QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)函數

sender:信號發出者ui

signal:發送信號this

receiver:信號接收者spa

method:信號處理者3d

新建一個QT窗口,在窗口上放一個按鈕,點擊按鈕而後關閉窗口code

SignalAndSlot.hblog

#include <QtWidgets/QWidget>
#include "ui_SignalAndSlot.h"
#include <QPushButton>

class SignalAndSlot : public QWidget
{
    Q_OBJECT

public:
    SignalAndSlot(QWidget *parent = Q_NULLPTR);

private:
    QPushButton b1;

private:
    Ui::SignalAndSlotClass ui;
};

SignalAndSlot.cppget

#include "SignalAndSlot.h"

SignalAndSlot::SignalAndSlot(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    b1.setParent(this);
    b1.setText(QStringLiteral("關閉"));//QStringLiteral解決VS中文亂碼
    b1.move(100, 100);

    connect(&b1, &QPushButton::released, this, &SignalAndSlot::close);
}

 

 

一. 槽函數:it

QT5:任意的成員函數,普通全局函數,靜態函數
     槽函數須要和信號一致(參數,返回值)
     因爲信號沒有返回值,因此槽函數必定沒有返回值

咱們自定義槽函數
void closeWidget(); //自定義槽函數
//槽函數裏執行關閉操做
void SignalAndSlot::closeWidget() 
{
     close();
}

.....

connect(&b1, &QPushButton::released, this, &SignalAndSlot::closeWidget);//自定義槽函數

二.自定義信號實例

 咱們實現兩個窗口互相切換,在主創中新建一個按鈕,叫切換到子窗口(這個過程是子窗口顯示,主窗口隱藏), 新建一個QT子窗口,子窗口上有一個按鈕叫切換到主窗口(子窗口隱藏,主窗口顯示);

1.新建子窗口

 

 

 

 

 

 

 

 

 2.在主窗口中定義SubWidget窗口成員變量和主窗口的切換函數

 

 

 

 

 

 這樣實現,就能夠從主窗口切換到子窗口。

3.從子窗口切換到主窗口

在子窗口定義信號和發送信號的槽函數

SubWidget.h

#include <QWidget>
#include "ui_SubWidget.h"

class SubWidget : public QWidget
{
    Q_OBJECT

public:
    SubWidget(QWidget *parent = Q_NULLPTR);
    ~SubWidget();

signals:
    /*
    * 信號必須有signals 關鍵字來聲明
    * 信號沒有返回值,但能夠有參數
    * 信號就是函數聲明,只需聲明,無須實現
    * 使用:emit mysignal();
    * 信號能夠重載
    */
    void MySignal();

public:
    void SendSignal();//發送信號的槽

private:
    Ui::SubWidget ui;
};

SubWidget.cpp

#include "SubWidget.h"
#include <QPushButton>


SubWidget::SubWidget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    QPushButton* pChange = new QPushButton(this);
    pChange->setText(QStringLiteral("切換到主窗口"));
    pChange->move(100, 0);

    connect(pChange, &QPushButton::released, this, &SubWidget::SendSignal);//點擊按鈕,槽函數觸發一個信號

}

SubWidget::~SubWidget()
{
}

void SubWidget::SendSignal()
{
    emit MySignal();
}

4.在主窗口裏面處理這個自定義信號

 

 

 

....

connect(&sub, &SubWidget::MySignal, this, &SignalAndSlot::DealSubSignal);
}


void SignalAndSlot::DealSubSignal()
{
    show();
    sub.hide();
}

效果:

相關文章
相關標籤/搜索