先記住兩個單詞:signal(信號)、slot(槽)
倉庫位置:https://github.com/Github-Programer/Qt-Notes/tree/master/Qt/03_Signalc/signalc
上次在界面內用代碼做出了一個按鈕,並可以設置其大小、位置,也可以設置窗口的位置、大小,但是這樣玩玩就沒意思了,這按鈕按來按去沒反應,像這些按鈕都是可以有用處的,不過Qt自動給你設置了按鈕按下的樣子
我們需要做的不是靜態界面,而是可以有互動的界面,於是信號與槽隆重登場!
#1首先:信號和槽是什麼?
舉例
- 還記得阿拉丁神燈嗎?要讓燈神出現需要什麼步驟?
阿拉丁神燈->摩擦->神燈->燈神出現
- 假設我需要一個按鈕,要讓窗口關閉那麼順序是,
按鈕->點擊->窗口->關閉
- 信號槽亦是如此,分析一下,阿拉丁神燈 就是信號的發送者,點擊 是動作也可以成爲信號的具體信息,神燈 就是信號的接受者,燈神出現 就是處理信號也叫槽(槽函數)
- 信號槽就是觸發(信號的發送者)什麼之後執行(處理信號)函數(槽)
#2信號槽有什麼優點?
- 鬆散耦合,信號 發送端 和 接收端 本身是沒有關聯的
- 通過
connect
函數連接,使得兩段連接在一起 - 槽也不需要和信號綁定在一起
- 我怎麼覺得Python和這個很像呀?
#3實例:點擊按鈕關閉窗口
首先設計一個按鈕和設置窗口:
- 名稱:btn
- 大小:100x100
- 窗口大小:600x400
其次使用connect函數連接(等會詳細解釋)
connect(btn, &QPushButton::clicked, this, &QWidget::close);
完整代碼:(哦對了,文件名叫做myWidget.cpp)
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QPushButton>
#include <qDebug>
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::myWidget)
{
ui->setupUi(this);
resize(600, 400);
QPushButton * btn = new QPushButton("關閉窗口", this);
btn->resize(100, 100);
btn->move(100, 100);
connect(btn, &QPushButton::clicked, this, &QWidget::close);
}
myWidget::~myWidget() //這應該是析構函數
{
qDebug() << "我的按鈕類析構" << endl;
delete ui; //刪除類時刪除ui
}
文件樹:
#4現在來分析一下connect函數的功能
還是以剛纔的這一句
connect(btn, &QPushButton::clicked, this, &QWidget::close);
1、btn 是我們創建的按鈕實例(對象),就是信號的發送者
2、&QPushButton::clicked
是信號,代表按鈕被按下
你在輸入這一句的時候,提示框顯示的clicked前的圖標是前面帶波浪的遙控器(形容不了)
有這種圖標的就是信號的意思,好了,打開Assistant Qt助手(自帶),找找QPushButton類
這裏並沒有signals,就是QPushButton沒有信號,那麼它是繼承QAbstractButton,於是去這裏看
找到信號了,咱們要的是點擊功能,選擇clicked函數,其中參數就是一個布爾值。點擊綠色部分可以查看詳細介紹
這個clicked函數就是一個信號
3、接受者this,這個就是給自己唄
4、&QWidget::close
槽函數
打開Assistant接着查:
myWidget是咱們自己建立的類,查不着,那麼myWidget的父類是QWidget類,找QWidget!
這個Signals現在沒什麼用,看Public Slot,這裏面有很多功能函數(自帶槽)
我們想讓窗口關閉應該選擇close()函數
你點進去還有函數的詳細介紹
第一句說了,Closes this widget,就是關閉窗口。
#5擴展?
你可以將槽函數拓展一下,不只是關閉窗口,可以點擊按鈕輸出一句話?彈出一個窗口?或者更加新奇!
#6使用UI拖拽?
學會槽函數,你可以漸漸使用UI操作了,點擊.ui文件,進入設計
你可以拖拽一個按鈕,改一個名字,右鍵選擇轉到槽
接着會讓你選擇信號,就選clicked
會進入myWidget.cpp(你們的名字我不知道)新建一個函數
你就寫上QWidget::close();
照樣可以關閉窗口!