詳解Qt中信號與槽,附加實例

先記住兩個單詞:signal(信號)、slot(槽)
倉庫位置:https://github.com/Github-Programer/Qt-Notes/tree/master/Qt/03_Signalc/signalc


上次在界面內用代碼做出了一個按鈕,並可以設置其大小、位置,也可以設置窗口的位置、大小,但是這樣玩玩就沒意思了,這按鈕按來按去沒反應,像這些按鈕都是可以有用處的,不過Qt自動給你設置了按鈕按下的樣子
在這裏插入圖片描述
我們需要做的不是靜態界面,而是可以有互動的界面,於是信號與槽隆重登場!

#1首先:信號和槽是什麼?

信號槽是 Qt 框架引以爲豪的機制之一。所謂信號槽,實際就是觀察者模式。當某個事件發生之後,比如,按鈕檢測到自己被點擊了一下,它就會發出一個信號(signal。這種發出是沒有目的的,類似廣播。如果有對象對這個信號感興趣,它就會使用連接(connect)函數,意思是,將想要處理的信號和自己的一個函數(稱爲槽(slot))綁定來處理這個信號。也就是說,當信號發出時,被連接的槽函數會自動被回調。這就類似觀察者模式:當發生了感興趣的事件,某一個操作就會被自動觸發。

舉例

  • 還記得阿拉丁神燈嗎?要讓燈神出現需要什麼步驟?阿拉丁神燈->摩擦->神燈->燈神出現
  • 假設我需要一個按鈕,要讓窗口關閉那麼順序是,按鈕->點擊->窗口->關閉
  • 信號槽亦是如此,分析一下,阿拉丁神燈 就是信號的發送者點擊動作也可以成爲信號的具體信息神燈 就是信號的接受者燈神出現 就是處理信號也叫槽(槽函數)
  • 信號槽就是觸發(信號的發送者)什麼之後執行(處理信號)函數(槽)

在這裏插入圖片描述

#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();照樣可以關閉窗口!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章