最近項目中使用到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(); }
效果: