1 建立一個關閉按鈕
connect函數的最常用的一般形式:
connect(sender,signal,receiver,slot);
sender:發出信号的對象
siganl:發送對象發出的信号
receiver:接受信号的對象
slot:接收對象在接受到信号後所需要調用的函數(槽函數)
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//建立一個按鈕 點選關閉按鈕
//this->close();
QPushButton *p = new QPushButton("關閉視窗",this);
//設定點選按鈕,會調用視窗的close函數
connect(p,&QPushButton::clicked,this,&QWidget::close);
}
其中的close使用的是this這個接受類下的槽函數。
2 按鈕常用的信号
常用的信号可以在幫助文檔中檢視到。QPushButton的幫助文檔中并無Signal選項,但是在QPushButton繼承的類中,會出現QAbstractButton這個選項,裡面是有Signals的。

3 自定義的槽函數
.cpp檔案中:
#include "widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) : QWidget(parent)
{
button = new QPushButton;
button->setParent(this);
button->setText("列印呵呵");
//注冊信号與槽的連結
//槽函數可以使普通的成員函數,還可以是槽函數
//注意:如果信号沒有參數,那麼槽函數也不能有參數,如果信号有參數,
// 那麼槽函數中可以有參數也可以沒有
connect(button,&QPushButton::clicked,this,&Widget::print);
}
void Widget::print()
{
qDebug()<<"呵呵";
}
Widget::~Widget()
{
}
.h檔案中
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
QPushButton *button;
public slots:
void print();//注意這個函數中是否有參數取決于信号的函數中是否有參數
};
#endif // WIDGET_H
4 自定義的信号
這裡自定義信号以一個例子為原型,進行解釋。
大體實作的結果是:建立一個父視窗和一個子視窗,實作點選按鍵,可以分别隐藏對應的視窗。
下面是代碼實作:
父視窗:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "son_widget.h"
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
Son_widget *sonwindow;
QPushButton *button1;
public slots:
void father_hide();
void son_hide();
};
#endif // WIDGET_H
.cpp
#include "widget.h"
#include "son_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("father");
this->sonwindow = new Son_widget;
sonwindow->show();
button1 = new QPushButton("hide father",this);
connect(button1,&QPushButton::clicked,this,&Widget::father_hide);
connect(sonwindow,&Son_widget::send_singnal,this,&Widget::son_hide);
}
void Widget::father_hide()
{
this->hide();
this->sonwindow->show();
}
void Widget::son_hide()
{
this->show();
this->sonwindow->hide();
}
Widget::~Widget()
{
}
下面是子視窗中的代碼
son_widget.h
#ifndef SON_WIDGET_H
#define SON_WIDGET_H
#include <QWidget>
#include <QPushButton>
class Son_widget : public QWidget
{
Q_OBJECT
public:
explicit Son_widget(QWidget *parent = nullptr);
QPushButton *button2;
signals:
//信号沒有傳回值,可以有參數,信号函數不需要定義,隻需要聲明
void send_singnal(int a);
public slots:
void hide_son_signal();
};
#endif // SON_WIDGET_H
.cpp
#include "son_widget.h"
#include <QPushButton>
#include <widget.h>
Son_widget::Son_widget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("son");
button2 = new QPushButton("hide son",this);
connect(button2,&QPushButton::clicked,this,&Son_widget::hide_son_signal);
}
void Son_widget::hide_son_signal()
{
//點選按鈕的槽函數,發射信号
emit send_singnal(10);
}
信号和槽的注意事項
- 發送者和接受者都是QObjict的子類(當槽函數是全局函數、Lambda表達式時不需要接受者時除外)
- 信号和槽的傳回值都是void
- 信号隻需要申明,不需要實作
- 槽函數需要申明也需要實作
- 使用emit在适當的地方發送信号
- 使用connect()函數連結信号與槽
- 信号和槽要求信号和槽的參數一緻
Lambda表達式在槽中的用法
例如:
1 槽函數可以是一個Lambda表達式
2 Lambda表達式中[]中寫的是=,代表将上面的函數中的局部變量以值傳遞的方式傳到Lambda表達式中
3 Lambda表達式中[]中寫的是&,代表将上面的函數中的局部變量以引用傳遞的方式傳到Lambda表達式中
4 Lambda表達式中[]中寫的是a,代表将上面的函數中的局部變量a以值傳遞的方式傳到Lambda表達式中
5 Lambda表達式中[]中寫的是a,b,代表将上面的函數中的局部變量a,b以值傳遞的方式傳到Lambda表達式中
6 Lambda表達式中[]中寫的是&a,代表将上面的函數中的局部變量a以引用傳遞的方式傳到Lambda表達式中
7 mutable代表可以再Lambda中修改傳入變量的值
8 ->int 代表Lambda表達式傳回的值是一個Int類型