目錄
什么是QT
特點?
QT程序?
main函數
QT按鈕
純代碼模式
圖形化模式?
對象樹模型
信號和槽?
連接與斷開
自動連接
?斷開連接
信號的發射?
lambda表達式?
基本語法?
捕獲列表?
Lambda表達式用于信號與槽的連接
?例如
?
什么是QT
Qt是一個跨平臺的C++圖形用戶界面應用程序框架。
在QT中,一個函數對應著一個相對應的頭文件,文件和函數名相同;
當然了,有的頭文件也會隱式包含了其它頭文件,所以有些函數不需要特意去包含相對應的頭文件?
特點?
- 跨平臺,幾乎支持所有的平臺
- 接口簡單,容易上手,學習QT框架對學習其他框架有參考意義。
- 一定程度上簡化了內存回收機制
- 開發效率高,能夠快速的構建應用程序。
- 有很好的社區氛圍,市場份額在緩慢上升。
- 可以進行嵌入式開發。?
QT程序?
main函數
QT按鈕
QT控件的創建,一般有兩種方式:
- 通過圖形化的方式,在界面上創建出一個控件,顯示設置文本。
- 通過純代碼的方式,通過編寫代碼,在界面上創建控件,顯示設置文本。
純代碼模式
通過代碼創建按鈕,指定掛到對象樹上,方便日后的資源釋放
通過按鈕對象來調用不同的方法函數來實現不同功能
?
????????如果只是創建出對象,是無法顯示到窗口中的,所以我們需要依賴一個父窗口,也就是指定一個父親。(按鈕也是繼承于QWidget,也屬于窗口)。?
圖形化模式?
用圖形化模式創建一個按鈕,只需要在ui文件內,選擇需要的控件拖拽到窗口區即可。
當然,后續還可以添加qrc文件來達到更好的效果。
?
對象樹模型
?在Qt中,當一個對象被創建時,可以指定其父對象。
QObject是Qt里邊絕大部分類的根類
QObject對象之間是以對象樹的形式組織起來的。
- ?當兩個QObject(或子類)的對象建立了父子關系的時候。子對象就會加入到父對象的一個成員變量叫children(孩子)的list(列表)中。
- 當一個父對象被銷毀時,它的所有子對象也會被自動銷毀,從而釋放它們占用的資源。
????????對象樹確保的是先釋放?節點的內存, 后釋放?節點的內存. ?析構函數的調?順序則不?定遵守上述要求. 因此看到?節點的析構執?順序反?在?節點析構順序 之后.
注: 調?析構函數和釋放內存并?是同?件事。
信號和槽?
信號和槽是實現對象間通信的一種機制;
對象在發生信號后,另一個對象可以連接信號到自己的槽函數上,響應。
信號(signals):
- 信號是Qt中的一種特殊函數,它在特定事件發生時被發射(emit)。
- 信號可以攜帶參數,這些參數在信號發射時傳遞給連接的槽函數。
槽(Slots):
- 槽是Qt中的一種特殊成員函數,可以連接到信號上。
- 槽函數可以有參數,也可以沒有參數。如果有參數,這些參數必須與連接的信號的參數匹配。
連接與斷開
自動連接
信號和槽是自動連接的;
兩種方式連接:
- 在Qt Designer中,可以通過拖動信號到槽來自動創建連接。
- 也可以在代碼中使用?QObject::connect?函數來手動創建連接。
?
?斷開連接
使用?QObject::disconnect?函數來斷開信號和槽之間的連接。
斷開連接可以防止槽函數在不需要的時候被調用。
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//信號源是 圖形化按鈕 關閉后 誰來處理 怎么處理connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handclicked);
}
//手動添加 處理圖形化pushbutton1槽函數
void Widget::handclicked()
{this->setWindowTitle("標題修改成標題1");qDebug()<<"handclicked1";
}void Widget::handclicked2()
{//切換原來槽信號后,this->setWindowTitle("標題修改為2");qDebug()<<"handclicked2";
}void Widget::on_pushButton_2_clicked()
{//1.先斷開pushButton原來的 信號槽//如果沒有 disconnect, 就會構成 一個信號綁定了兩個槽函數. 觸發信號的時候, 兩個槽函數都會執行.disconnect(ui->pushButton,&QPushButton::clicked,this,&Widget::handclicked);//2.重新綁定信號槽connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handclicked2);
}
信號的發射?
信號的發射是通過調用 emit 關鍵字實現的。
// myclass.hsignals: // 信號聲明部分void mySignal(int value); // 自定義信號,參數為int類型
// myclass.cpp
#include "myclass.h"void MyClass::someMethod()
{int value = 10;emit mySignal(value); // 發射信號,并傳遞一個int值
}
#include <QApplication>
#include "myclass.h"class Receiver : public QObject
{Q_OBJECTpublic slots:void receiveValue(int value) // 對應的槽函數{qDebug() << "Received value:" << value;}
};
lambda表達式?
??C++11中的Lambda表達式用于定義匿名的函數對象,以簡化編程工作。
基本語法?
[捕獲列表](參數列表) -> 返回類型 { 函數體 }
[capture-list] (parameters) -> return-type { body; }
- capture-list(捕獲列表): 定義了lambda函數體中可以訪問的外部變量。可以是空的,或者使用[&]捕獲所有外部變量的引用,[=]捕獲所有外部變量的值,或者明確指定個別變量,如[x, &y]表示按值捕獲x,按引用捕獲y。
- parameters(參數列表): 類似于常規函數的參數列表,可以為空。
- -> return-type(返回類型): 可選,明確指定lambda函數的返回類型。如果不寫,則編譯器會根據函數體推導返回類型。
- body(函數體): 包含了lambda表達式執行的具體代碼。?
捕獲列表?
?[=]:以傳值方式捕獲所有局部變量。
[&]:以引用方式捕獲所有局部變量。
[變量]:捕獲特定變量,可以使用=或&指定捕獲方式。
Lambda表達式用于信號與槽的連接
QObject::connect(sender, &SenderClass::signalName, [=]() {// Lambda表達式內的代碼
});
?例如
#include "widget.h"
#include "ui_widget.h"#include<QPushButton>
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//lanbda的使用QPushButton* button = new QPushButton(this);button->setText("按鈕");button->move(200,200);//鏈接connect(button,&QPushButton::clicked,this,[=](){qDebug()<<"lambda被執行";this->setWindowTitle("我是窗口標題");this->move(100,100);});
}
?