【QT】概述|對象樹模型|兩種控件模式|信號和槽|lambda

目錄

什么是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);});
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38096.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38096.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38096.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NeXT-Server 手動安裝

38 cd /home 使用 wget 下載你選擇的版本,https://go.dev/dl/ 找到適用于Linux的版本,你可以選擇 .tar.gz 格式的文件以用于Debian系統 39 wget https://go.dev/dl/go1.22.4.linux-amd64.tar.gz 40 tar -C /usr/local -xzf go1.22.4.linux-amd64.tar.gz 42 echo ‘export PAT…

辦理河南公司企業信用等級3A證書流程和條件

企業信用等級3A證書屬于一種榮譽資質&#xff0c;是提升企業公信力和影響力保障的一項資質。信用等級是信用 (資信)評估機構根據企業資信評估結果對企業信用度劃分的等級類別&#xff0c;它反映了企業信用度的高低。AAA信用等級是一種等級劃分。代指企業的信用經過行業、機構評…

零成本搭建個人圖床服務器

前言 圖床服務器是一種用于存儲和管理圖片的服務器&#xff0c;可以給我們提供將圖片上傳后能外部訪問瀏覽的服務。這樣我們在寫文章時插入的說明圖片&#xff0c;就可以集中放到圖床里&#xff0c;既方便多平臺文章發布&#xff0c;又能統一管理和備份。 當然下面通過在 Git…

中藥材圖像識別:中醫與深度學習的融合(目標檢測)

親愛的讀者們&#xff0c;您是否在尋找某個特定的數據集&#xff0c;用于研究或項目實踐&#xff1f;歡迎您在評論區留言&#xff0c;或者通過公眾號私信告訴我&#xff0c;您想要的數據集的類型主題。小編會竭盡全力為您尋找&#xff0c;并在找到后第一時間與您分享。 一、引…

flink的窗口

目錄 窗口分類 1.按照驅動類型分類 1. 時間窗口&#xff08;Time window&#xff09; 2.計數窗口&#xff08;Count window&#xff09; 2.按照窗口分配數據的規則分類 窗口API分類 API調用 窗口分配器器&#xff1a; 窗口函數 增量聚合函數&#xff1a; 全窗口函數…

MySQL高級-MVCC-原理分析(RC級別)

文章目錄 1、RC隔離級別下&#xff0c;在事務中每一次執行快照讀時生成ReadView2、先來看第一次快照讀具體的讀取過程&#xff1a;3、再來看第二次快照讀具體的讀取過程: 1、RC隔離級別下&#xff0c;在事務中每一次執行快照讀時生成ReadView 我們就來分析事務5中&#xff0c;兩…

VBA代碼解決方案第十五講:如何對單元格區域進行高亮顯示

《VBA代碼解決方案》(版權10028096)這套教程是我最早推出的教程&#xff0c;目前已經是第三版修訂了。這套教程定位于入門后的提高&#xff0c;在學習這套教程過程中&#xff0c;側重點是要理解及掌握我的“積木編程”思想。要靈活運用教程中的實例像搭積木一樣把自己喜歡的代碼…

Java中集中常見的算法

以下是對選擇排序、冒泡排序和插入排序的理解及代碼實現 選擇排序&#xff1a; 理解&#xff1a;它通過不斷地從待排序元素中選擇最小&#xff08;或最大&#xff09;元素&#xff0c;并將其放置在已排序序列的一端。 代碼實現&#xff1a; public class SelectionSort {pu…

final、const、readonly關鍵字在不同語言中代表著什么

一、Java 1.被final修飾的類不能被繼承。 2.被final修飾的方法不能被重寫。 被 final 修飾的類中所有的成員方法都會隱式的定義為 final 方法。 若父類中 final 方法的訪問權限為 private &#xff0c;則子類中不能直接繼承該方法。此時可以在子類中定義相同方法名的函數&…

【操作系統期末速成】EP06 | 學習筆記(基于五道口一只鴨)

文章目錄 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;??????2.1 考點十四&#xff1a;同步互斥的基本概念2.2 考點十五&#xff1a;實現臨界區互斥的基本方法2.3 考點十六&#xff1a;信號量的含義及常用信號量 一、前言&#x1f680;&#x1…

品牌推廣的三個階段與核心內容,一篇文章全掌握!

在競爭激烈的市場環境中&#xff0c;品牌推廣是企業成功的關鍵。精心策劃的推廣策略能夠幫助企業在消費者心中樹立獨特的品牌形象&#xff0c;進而促進銷售增長。 作為一家手工酸奶品牌的創始人&#xff0c;目前全國也復制了100多家門店&#xff0c;我理解的品牌推廣分為3個階…

操作系統概論(二)

一、單項選擇題(本大題共20小題&#xff0c;每小題1分&#xff0c;共20分) 在每小題列出的四個備選項中只有一個選項是符合題目要求的&#xff0c;請將其代碼填寫在題后的括號內。錯選、多選或未選均無分。 1&#xff0e;操作員接口是操作系統為用戶提供的使用計算機系統的手…

Vitis IDE 艱難切換--從傳統 Vitis GUI 到 2024.1 統一軟件界面

目錄 1. 簡介 2. 界面展示 2.1 啟動 2.2 Flow Navigator 2.1.1 C Simulation Dialog 2.1.2 C Synthesis 2.1.3 C/RTL Co-simulation 2.1.4 Implementation 2.1.5 Package 3. C Synthesis 詳解 3.1 Classic Configuration Settings 3.1.1 config_array_partition 3…

MySQL進階:存儲過程和函數

存儲過程和函數 1. 簡介2. 創建存儲過程使用MySQL工作臺創建存儲過程 3. 刪除存儲過程4. 參數帶默認值的參數參數驗證輸出參數 5. 變量6. 函數7. 其他約定 1. 簡介 存儲過程三大作用&#xff1a; 儲存和管理SQL代碼&#xff08;置于數據庫中&#xff0c;與應用層分離&#xf…

【力扣 28】找出字符串中第一個匹配項的下標 C++題解(字符串匹配)

給你兩個字符串 haystack 和 needle &#xff0c;請你在 haystack 字符串中找出 needle 字符串的第一個匹配項的下標&#xff08;下標從 0 開始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;則返回 -1 。 示例 1&#xff1a; 輸入&#xff1a;haystack “s…

(13)DroneCAN 適配器節點(二)

文章目錄 前言 2 固件 2.1 基于F103 2.2 基于F303 2.3 基于F431 3 ArduPilot固件DroneCAN設置 3.1 f303-通用設置示例 4 DroneCAN適配器節點 前言 這些節點允許現有的 ArduPilot 支持的外圍設備作為 DroneCAN 或 MSP 設備適應 CAN 總線。這也允許擴展自動駕駛儀硬件的…

隨機文本生成器

目錄 開頭程序程序的流程圖程序打印的效果(不必細看&#xff0c;因為字符太多)例1例2例3 結尾 開頭 大家好&#xff0c;我叫這是我58。看&#xff01;這下面有一個程序。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <random> #includ…

快遞物流倉庫管理系統java項目springboot和vue的前后端分離系統java課程設計java畢業設計

文章目錄 快遞物流倉庫管理系統一、項目演示二、項目介紹三、部分功能截圖四、部分代碼展示五、底部獲取項目源碼&#xff08;9.9&#xffe5;帶走&#xff09; 快遞物流倉庫管理系統 一、項目演示 快遞物流倉庫管理系統 二、項目介紹 語言: Java 數據庫&#xff1a;MySQL 前…

寶塔安裝rabbitMQ實戰

服務器環境說明 阿里云服務器、寶塔、centos7 一、下載erlang 原因&#xff1a;RabbitMQ服務端代碼是使用并發式語言Erlang編寫的&#xff0c;安裝Rabbit MQ的前提是安裝Erlang。 下載地址&#xff1a;http://www.erlang.org/downloads 下載對應的版本&…

山東省著名烈士孫善師孫善帥故居布展喜添新篇

人海信息網山東訊&#xff08;張春兄、馮愛云&#xff09; “……他們以鋼鐵般的意志&#xff0c;堅守共產黨員的使命&#xff0c;他們就是濼口九烈士的孫善師孫善帥兄弟&#xff01;”6月28日&#xff0c;對于山東省著名烈士孫善師孫善帥故居來說&#xff0c;又是一個不平凡的…