一.標准信號與槽函數
有些信號和槽的函數模板都已經被寫好了,只需要調用即可
下面是一個點擊按鈕關閉窗口的程序
.h文件
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> class MyWidget : public QWidget { Q_OBJECT //使用信號與槽的時候需要用到它 public: MyWidget(QWidget *parent = 0); ~MyWidget(); public: QPushButton* pBtn1; }; #endif // MYWIDGET_H
.cpp文件
#include "mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { pBtn1 = new QPushButton(this); //指定父對象,不然按鈕在窗口上是無法正常顯示的 pBtn1->setText("Close");//創建一個關閉窗口的按鈕 pBtn1->move(100,100); //更改按鈕在窗口上的位置 //標准信號與槽函數的使用 connect(pBtn1, &QPushButton::pressed, this, &MyWidget::close); /*pBtn1:信號發出者,為指針類型 *&QPushButton::pressed 信號函數; &發送者的類名:信號名字 *this:信號的接收者 *&Widget::close 槽函數,信號處理函數; &接受的類名::槽函數名稱 */ } MyWidget::~MyWidget() { }
二.自定義槽函數
.h文件
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> class MyWidget : public QWidget { Q_OBJECT //使用信號與槽的時候需要用到它 public: MyWidget(QWidget *parent = 0); ~MyWidget(); public: QPushButton* pBtn1; public: //自定義的槽函數 void mySlot(); }; #endif // MYWIDGET_H
.cpp文件
#include "mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { pBtn1 = new QPushButton(this); //指定父對象,不然按鈕在窗口上是無法正常顯示的 pBtn1->setText("Close");//創建一個關閉窗口的按鈕 pBtn1->move(100,100); //更改按鈕在窗口上的位置 connect(pBtn1, &QPushButton::pressed, this, mySlot); /*自定義槽函數: * QT5:任意的成員函數,普通的全局函數,靜態函數 * 由於信號函數是沒有返回值的,所以槽函數一定也沒有返回值 * 一般在QT5中都是使用成員函數作為槽函數 */ } //成員函數 void MyWidget::mySlot() { this->close(); } MyWidget::~MyWidget() { }
三.自定義信號與槽函數
下面是一個兩個窗口相互切換的程序,點擊主窗口按鈕,切換到子窗口;在子窗口中點擊按鈕,給主窗口發送自定義信號。
mainwidget.h文件
#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(); public: QPushButton* pBtn1; SubWidget subWidget; public: void ShowSubWidget(); void DealSub(); void DealSubWin(int, QString); }; #endif // MAINWIDGET_H
mainwidget.cpp文件
#include "mainwidget.h" #include <QDebug> MainWidget::MainWidget(QWidget *parent) : QWidget(parent) { this->setWindowTitle("主窗口"); pBtn1 = new QPushButton("切換到子窗口", this); pBtn1->move(100, 100); //點擊按鈕,顯示子窗口 connect(pBtn1, &QPushButton::pressed, this, ShowSubWidget); //處理子窗口發送的信號 //不帶參數的信號 void(SubWidget::*funSignal)() = &SubWidget::mySignal; connect(&subWidget, funSignal, this, DealSub); //帶有參數的信號 void(SubWidget::*TestSignal)(int, QString) = &SubWidget::mySignal; connect(&subWidget, TestSignal, this, DealSubWin); } MainWidget::~MainWidget() { } void MainWidget::ShowSubWidget() { subWidget.show(); } void MainWidget::DealSub() { subWidget.hide(); this->show(); } void MainWidget::DealSubWin(int a, QString str) { qDebug() << a; qDebug() << str.toUtf8().data(); }
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: //自定義信號 /*信號沒有返回值,但可以有參數 * 信號就是函數的聲明,只需要聲明,無需定義 * 使用emit mySignal * 信號可以重載 */ void mySignal(); //無參數的信號 void mySignal(int, QString); //有參數的信號 public slots: public: QPushButton* pBtn; public: //自定義槽函數 void sendSlot(); }; #endif // SUBWIDGET_H
subwidget.cpp文件
#include "subwidget.h" SubWidget::SubWidget(QWidget *parent) : QWidget(parent) { this->setWindowTitle("子窗口"); pBtn = new QPushButton("切換到主窗口", this); pBtn->move(100, 100); connect(pBtn, &QPushButton::clicked, this, sendSlot); } void SubWidget::sendSlot() { //當按鈕按下時,子窗口向主窗口發送信號 emit mySignal(); emit mySignal(100, "我是子窗口"); }