前言

上個學期由于需要做一個期末大作業,于是決定使用Qt寫一個學生管理系統,如圖,在做這個專案的程序中,對于Qt的信號與槽有了更為深刻的認識(如對本人此專案有想法,可與我聯系),
本文不涉及較深的Qt底層實作,僅談談我個人的理解,
文章目錄
- 前言
- 一、什么是信號與槽
- 1.打電話
- 2.將打電話這一系列動作放到Qt程式當中應該是怎樣的
- 普通信號的傳遞
- 二、信號、槽
- 普通的信號與槽
- 自定義信號與槽
- 準備作業
- 頭檔案成員變數說明
- 流程
- 發送自定義信號
- 接收自定義信號,觸發自定義槽函式
- 自定義信號與槽的關鍵
- 結語
提示:以下是本篇文章正文內容,下面案例可供參考
一、什么是信號與槽
1.打電話
我們知道,現實生活中,每個人幾乎每時每刻都在接收資訊,處理事件,
舉個打電話的例子,
當來電話時,“來電話了”就是一個事件,
也就是說,“來電話了”這個事件發生了,
而你聽到了“電話鈴聲”,這個“電話鈴聲”就相當于一個信號,
于是你“接聽”了它,
這就意味著你接收了“電話聲”這個信號,處理了它并作出回應,回應的方式就是“接聽”,
2.將打電話這一系列動作放到Qt程式當中應該是怎樣的
我們再回味回味,將這一系列動作放到Qt程式當中應該是怎樣的:Qt的事件監聽就相當于人的大腦在接收生活中的資訊,
電話響了本身講就是一個事件,那么我們如何得知事件已經發生呢?當然是通過電話發出的電話鈴聲了,
而這個電話鈴聲就是Qt發出的信號,我們就可以通過connect函式亦或是直接使用事件監聽器去獲取到這個信號(本文僅討論connect函式的情況),然后通過槽函式,我們就可以處理這些信號,做一些文章,
普通信號的傳遞

二、信號、槽
普通的信號與槽
QPushButton* btn = new QPushButton("按鈕1", this);
connect(btn,&QPushButton::clicked,[](){
//CODEBLOCKS
});
當然,如果你查閱了Qt助手會發現,QPushButton繼承于QAbstractButton類,而QAbstractButton類中有一個clicked信號:
void clicked(bool checked = false)會發現它攜帶了一個引數,那么上面的代碼中匿名槽函式怎么沒有攜帶引數呢?難道信號與槽的引數不是一一對應的嗎?
當然是一一對應的,只不過由于這個信號攜帶了默認值,所以這種情況下槽函式可以的引數可以省略,
自定義信號與槽
準備作業
首先我們先定義一個MainWindow視窗(由于我是在Visual Studio2019中撰寫的代碼,所以部分頭檔案于Qt自身有些不一樣,但不影響學習)
請允許我先拋出實作的代碼,然后聽我娓娓道來,
SignalAndSlot.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_SignalAndSlot.h"
#include <qpushbutton.h>
#include <qtextedit.h>
class SignalAndSlot : public QMainWindow
{
Q_OBJECT
public:
SignalAndSlot(QWidget *parent = Q_NULLPTR);
QPushButton* btn;//舉例用的按鈕組件
QTextEdit* editText;//文本編輯框
void init();//初始化組件函式
void sendMySignal();//中間人
void getEditTextContent(QString text);//接收文本訊息的槽函式
private:
Ui::SignalAndSlotClass ui;
signals:
void mySignal(QString msg);//自定義信號
};
在上述頭檔案中,btn與editText為我們的示例組件,init函式用于分配組件的記憶體、簡單布局以及信號與槽函式的系結,
頭檔案成員變數說明
| 成員變數 | 用途 | |
|---|---|---|
| pubilc | btn | 按鈕示例組件 |
| pubilc | editText | 文本編輯框示例組件 |
| pubilc | void init() | 分配組件的記憶體、簡單布局以及信號與槽函式的系結, |
| pubilc | void sendMySignal() | 將系結于按鈕的clicked信號的槽函式,當觸發clicked信號時,發送mySignal信號 |
| pubilc | void getEditTextContent(QString text) | 將系結于mySigal信號的槽函式,當觸發mySignal信號時,獲取到文本鍵框的文本訊息 |
| private | ui | Qt的ui類,用于繪制界面,本文不涉及 |
| signals | void mySignal(QString msg) | 自定義信號 |
SignalAndSlot.cpp
#include "SignalAndSlot.h"
#include <qmessagebox.h>
#pragma execution_character_set("utf-8")
SignalAndSlot::SignalAndSlot(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
init();
}
/*初始化界面及事件系結*/
void SignalAndSlot::init()
{
btn = new QPushButton("按鈕1", this);//一個按鈕
btn->move(200, 0);
editText = new QTextEdit(this);//一個文本編輯框
editText->resize(200, editText->size().height());
connect(btn, &QPushButton::clicked, this, &SignalAndSlot::sendMySignal);//將按鈕clicked信號與sendMySignal函式系結
connect(this, &SignalAndSlot::mySignal, this, &SignalAndSlot::getEditTextContent);//將mySignal這個自定義信號與getEditTextContent函式系結
}
/*發送自定義信號-中間人*/
void SignalAndSlot::sendMySignal()
{
QString text = this->editText->toPlainText();
if (text.isEmpty() == false) {
emit mySignal(text);//如果文本不為空,則將自定義信號發送出去,否則無事發生
}
}
/*獲取文本編輯框訊息-自定義槽函式*/
void SignalAndSlot::getEditTextContent(QString text)
{
if (text.isEmpty() == false) {//如果訊息傳遞過來的值不為空,則提示訊息內容
QMessageBox::information(this, "內容:", text);
}
else {
QMessageBox::warning(this, "Error:", "您還沒輸入內容呢!!!");
}
}
流程
發送自定義信號
connect(btn, &QPushButton::clicked, this, &SignalAndSlot::sendMySignal);//將按鈕clicked信號與sendMySignal函式系結
當我們單擊按鈕,由于使用了connect函式,將clicked信號與sendMySignal()函式進行了系結,
于是單擊按鈕時,由于按鈕被單擊后會觸發clicked信號,通過connect后,sendMySignal()函式將會被執行,
而從上述代碼中可以看到,sendMySignal()函式會獲取文本編輯框的內容,然后判斷文本是否為空,若不為空,則emit mySignal(text);在信號中附加編輯框內容的文本資料,將信號發送出去,
接收自定義信號,觸發自定義槽函式
connect(this, &SignalAndSlot::mySignal, this, &SignalAndSlot::getEditTextContent);//將mySignal這個自定義信號與getEditTextContent函式系結
通過上述代碼,將mySignal與getEditTextContent函式進行了系結,那么一切就可以順其自然的發生了,


由于clicked信號與sendMySignal函式系結,mySignal信號與getEditTextContent函式系結,
當clicked信號觸發后,sendMySignal槽函式將會獲取到文本內容,然后附加到mySignal信號中并發送,而mySignal信號又與getEditTextContent槽函式系結,所以當mySignal信號觸發時,getEditTextContent就會取出信號的文本資料,并用資訊框進行展示,
于是當按鈕按下后,資訊框就會彈出文本編輯框的文本資料,
這就類似于A->B; B->C; 于是可以推出A->C
于是乎,自定義信號與槽的功能就實作了,
自定義信號與槽的關鍵
其實,如果你足夠細心,你應該能夠注意到,無論是現實中的接電話案例還是獲取獲取編輯框的資訊,他們都有一個中間人的角色,而這個中間人就是槽函式sendMySignal,
在接電話案例當中,你的大腦就充當了一個中間人的角色,電話鈴響,意味著事件發生并且你的大腦監聽到了,你選擇了接聽它說明你的大腦通過電話鈴聲做出了回應,作出回應的這個程序就對應著自定義槽的函式的實作,
那么怎么判斷哪個槽函式是中間人呢?
誰轉發的信號,誰就是中間人,
結語
2020 - 996 = 1024
告別996,從1024開始!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/191892.html
標籤:其他
下一篇:markdown基本語法1

