【QT 一 | 信號和槽】

Qt5基本模塊

在這里插入圖片描述

Qt Creator 中的快捷鍵

? 注釋:ctrl + /
? 運?:ctrl + R
? 編譯:ctrl + B
? 字體縮放:ctrl + 鼠標滑輪
? 查找:ctrl + F
? 整行移動:ctrl + shift + ?/?
? 幫助?檔:F1
? 自動對齊:ctrl + i;
? 同名之間的 .h 和 .cpp 的切換:F4
? 生成函數聲明的對應定義: alt + enter

認識對象模型(對象樹)

在 Qt 中,對象樹是一種非常重要的概念,用于管理和組織對象之間的關系。以下是對 Qt 對象樹的詳細理解介紹:

1. 對象樹的基本概念

  • 定義:Qt 的對象樹是一種層次化的對象管理機制,基于 QObject 類實現。每個 QObject 對象可以有一個父對象(parent),并且可以擁有多個子對象(children)。
  • 父子關系:當創建一個 QObject 對象時,可以通過構造函數指定一個父對象。如果指定了父對象,那么這個新創建的對象會自動成為父對象的子對象,并被添加到父對象的 children() 列表中。

2. 對象樹的作用

  • 生命周期管理:父對象負責管理其子對象的生命周期。當父對象被銷毀時,其所有子對象也會被自動銷毀。這種機制避免了內存泄漏,同時也簡化了對象的管理。

  • 事件傳播:在 GUI 程序中,事件(如鼠標點擊、鍵盤輸入等)會從父對象向下傳播到子對象。這種機制使得事件處理更加高效和靈活。

  • 組件化管理:對象樹使得 GUI 組件的組織更加清晰。例如,一個窗口(QWidget)可以包含多個按鈕、文本框等子組件。當窗口被銷毀時,所有子組件也會被自動銷毀。

3. 對象樹的實現機制

  • 構造函數中的父對象參數QObject 的構造函數接受一個 QObject* 類型的參數,表示父對象。例如:
    QObject* parent = new QObject();
    QObject* child = new QObject(parent);
    
    在這個例子中,child 的父對象是 parentchild 會被自動添加到 parentchildren() 列表中。
  • children() 方法:每個 QObject 對象都有一個 children() 方法,返回一個包含所有子對象的列表。
  • 自動銷毀機制:當父對象被銷毀時,Qt 會自動調用子對象的析構函數,銷毀所有子對象。

4. 對象樹的使用場景

  • GUI 組件管理:在 Qt 的 GUI 程序中,QWidget 是所有可視組件的基類,它繼承自 QObject。例如:
    QWidget* window = new QWidget();
    QPushButton* button = new QPushButton(window);
    
    在這個例子中,buttonwindow 的子組件。當 window 被銷毀時,button 也會被自動銷毀。
  • 資源管理:對象樹機制不僅適用于 GUI 組件,還可以用于管理其他資源,如文件句柄、網絡連接等。

5. 注意事項

  • 避免循環引用:在使用對象樹時,要避免創建循環引用(即對象 A 是對象 B 的父對象,同時對象 B 也是對象 A 的父對象)。這會導致對象無法正確銷毀,從而引發內存泄漏。
  • 手動管理子對象:雖然對象樹會自動管理子對象的生命周期,但也可以手動刪除子對象。例如:
    QObject* child = new QObject(parent);
    delete child;  // 手動刪除子對象
    
    在這種情況下,子對象會從父對象的 children() 列表中自動移除。

Qt 的對象樹是一種強大的機制,用于管理和組織對象之間的關系。它不僅簡化了內存管理,還使得 GUI 組件的組織更加清晰。通過合理使用對象樹,可以提高代碼的可維護性和可擴展性。
在 Qt 中,盡量在構造的時候就指定parent對象,并且?膽在堆上創建。
在這里插入圖片描述## 信號與槽
如果要使用信號與槽(signal 和 slot)的機制就必須加入Q_OBJECT宏;這個宏不僅用于支持信號與槽機制,還允許 Qt 的元對象系統(Meta-Object System)自動生成一些輔助代碼。

信號的本質就是事件。

  • 如:按鈕單擊、雙擊 ,窗?刷新等。
  • 信號的呈現形式就是函數
  • 信號函數只需要聲明,不需要定義(實現)。
  • 信號函數聲明用 signals 關鍵字修飾

槽(Slot)就是對信號響應的函數。

  • 槽是普通的成員函數,用于處理信號。槽函數可以手動實現,也可以通過 Qt 的機制自動生成。
  • 可以定義在類的任何位置( public、protected 或 private)。
  • 可以具有任何參數,可以被重載,也可以被直接調
    用(但是不能有默認參數
  • 槽函數需要定義(實現)。
  • 槽函數可以與?個信號關聯,當信號被發射時,關聯的槽函數被自動執行。
  • 槽函數用 public slots、protected lots 或者 private slots 修飾。

signals 和 slots 是 Qt 在 C++ 的基礎上擴展的關鍵字

connect函數

在 Qt 中,QObject 類提供了?個靜態成員函數connect(),該函數專門來關聯指定的信號函數和槽函數。
connect函數原型

connect (const QObject *sender,
const char * signal ,
const QObject * receiver ,
const char * method ,
Qt::ConnectionType type = Qt::AutoConnection )

參數說明:
? sender:信號的發送者;
? signal:發送的信號(信號函數);
? receiver:信號的接收者;
? method:接收信號的槽函數;
? type:用于指定關聯方式,默認的關方式為 Qt::AutoConnection,通常不需要手動設定。

自動生成槽函數的機制

  • 步驟
    1. 在 Qt Creator 中,添加一個信號( mySignal(int value)
    2. 右鍵點擊信號或信號聲明。
    3. 選擇 “轉到槽”(Go to Slot)或 “轉到信號”(Go to Signal)。
    4. Qt Creator 會自動生成一個槽函數的聲明和定義,并將其添加到類中。

例如,對于信號 mySignal(int value),Qt Creator 會生成如下代碼:

// 在頭文件中自動生成槽函數聲明
public slots:void on_mySignal(int value);// 在實現文件中自動生成槽函數定義
void MyObject::on_mySignal(int value)
{// 在這里實現槽函數的邏輯
}
  • 自動生成的槽函數
    • 當你在類中聲明信號時,Qt 的元對象系統會自動為這些信號生成默認的槽函數。這些槽函數通常以 on_<SignalName> 的形式命名。
    • 按照這種命名風格格定義的槽函數,會被 Qt ?動的和對應的信號進行連接。
      日常寫代碼,最好還是不要依賴命名規則,而是顯式
      使用 connect 更好。1. connect 可以更清晰直觀的描述信號和槽的連接關系。2. 防止信號或者槽的名字拼寫錯誤導致連接失效.
  • 使用方法
    • 在類的聲明中,添加信號聲明。
    • 在類的實現中,實現自動生成的槽函數。
    • 使用 QObject::connect() 將信號連接到自動生成的槽函數。
通過 Qt 的 Q_INVOKABLE

Q_INVOKABLE 宏可以將普通成員函數標記為可調用的槽函數。雖然這不是嚴格意義上的“自動生成”,但它允許開發者將任意函數作為槽函數使用。

  • 使用方法
    • 在類的聲明中,使用 Q_INVOKABLE 宏標記成員函數。
    • 這些函數可以直接作為槽函數使用。

例如:

class MyObject : public QObject
{Q_OBJECT
public:MyObject(QObject* parent = nullptr);Q_INVOKABLE void mySlotFunction(int value);  // 使用 Q_INVOKABLE 標記signals:void mySignal(int value);
};void MyObject::mySlotFunction(int value)
{qDebug() << "Slot function called with value:" << value;
}// 連接信號和槽
connect(this, &MyObject::mySignal, this, &MyObject::mySlotFunction);

自定義信號函數和槽函數

  1. ?定義信號函數書寫規范
    (1)?定義信號函數必須寫到 “signals” 下;
    (2)返回值為 void,只需要聲明,不需要實現;
    (3)可以有參數,也可以發生重載
  2. ?定義槽函數書寫規范
    (1)早期的 Qt 版本要求槽函數必須寫到 “public slots” 下,但是現在?級版本的 Qt 允許寫到類的 “public” 作用域中或者全局下;
    (2)返回值為 void,需要聲明,也需要實現;
    (3)可以有參數,可以發生重載;
    3、發送信號
    使用 “emit” 關鍵字發送信號。“emit” 是?個空的宏。"emit"其實是可選的,沒有什么含義,只
    是為了提醒開發?員。

關聯函數一定要在發射信號之前
原因是,?先關聯信號和槽,?旦檢測到信號發射之后就會立即執行關聯的槽函數。反之,若先發射信號,此時還沒有關聯槽函數,當信號發射之后槽函數不會響應。

信號與槽的斷開

在這里插入圖片描述
當"connect"函數第三個參數為"this" 時,第四個參數使? Lambda表達式時,可以省略掉 “this”

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

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

相關文章

集成學習方法之隨機森林

隨機森林是一種集成學習算法&#xff0c;它基于決策樹模型&#xff0c;通過構建多個決策樹并將它們的預測結果進行組合&#xff0c;以提高模型的準確性和穩定性。以下是隨機森林的詳細介紹&#xff1a; 原理 隨機森林通過從原始訓練數據中有放回地隨機抽樣&#xff0c;生成多…

react 中,使用antd layout布局中的sider 做sider的展開和收起功能

一 話不多說&#xff0c;先展示效果&#xff1a; 展開時&#xff1a; 收起時&#xff1a; 二、實現代碼如下 react 文件 import React, {useState} from react; import {Layout} from antd; import styles from "./index.module.less"; // 這個是樣式文件&#…

【Java 基礎】-- Java 接口中的 @Public 和 @FunctionalInterface 注解詳解

目錄 Java 接口中的 Public 和 FunctionalInterface 注解詳解 1. 概述 2. Public 注解的作用 3. Public 注解的使用 3.1 基本使用方式 3.2 應用于類和方法 4. FunctionalInterface 注解的作用 4.1 主要作用 4.2 FunctionalInterface 使用示例 4.3 允許默認方法 5. Pu…

go語言環境下載與配置(Windows)

下載 Go下載 - Go語言中文網 - Golang中文社區 建議在D盤中創建文件夾安裝到 D 盤 &#xff0c;方便進行管理&#xff0c;然后進行傻瓜式安裝。 安裝 驗證安裝 go version 安裝成功 配置環境變量 winE --> 右擊此電腦 --> 選擇屬性 --> 高級系統設置 --> 點擊…

nss刷題5(misc)

[HUBUCTF 2022 新生賽]最簡單的misc 打開后是一張圖片&#xff0c;沒有其他東西&#xff0c;分離不出來&#xff0c;看看lsb&#xff0c;紅綠藍都是0&#xff0c;看到頭是png&#xff0c;重新保存為png&#xff0c;得到一張二維碼 掃碼得到flag [羊城杯 2021]簽到題 是個動圖…

OkHttp、Retrofit、RxJava:一文講清楚

一、okHttp的同步和異步請求 Call 是 OkHttp 的核心接口&#xff0c;代表一個已準備好執行的 HTTP 請求。它支持 同步 和 異步 兩種模式&#xff1a; enqueue——>okHttp異步 OkHttpClient client new OkHttpClient();Request request new Request.Builder().url("…

Redis分布式緩存面試題

為什么使用分布式緩存&#xff1f; 1. 提升性能 降低延遲&#xff1a;將數據緩存在離應用更近的地方&#xff0c;減少數據訪問時間。減輕數據庫壓力&#xff1a;緩存頻繁訪問的數據&#xff0c;減少對后端數據庫的請求&#xff0c;提升系統響應速度。 2. 擴展性 水平擴展&a…

基于阿里云PAI平臺快速部署DeepSeek大模型實戰指南

一、DeepSeek大模型&#xff1a;企業級AI應用的新標桿 1.1 為什么選擇DeepSeek&#xff1f; 近期&#xff0c;DeepSeek系列模型憑借其接近GPT-4的性能和開源策略&#xff0c;成為全球開發者關注的焦點。在多項國際評測中&#xff0c;DeepSeek-R1模型在推理能力、多語言支持和…

C++---了解STL

上節學習了模板&#xff0c;那么就得談到C的標準模板庫STL。 C98&#xff1a;以模板方式重寫了C標準庫&#xff0c;引入了STL(標準模板庫)。 1.概念 STL(Standard template Libarary)標準模板庫&#xff1a;是C標準庫的重要組成部分&#xff0c;不僅是一個可復用的組件庫&am…

分享幾款比較常用的接口測試工具

首先&#xff0c;什么是接口呢&#xff1f; 接口一般來說有兩種&#xff0c;一種是程序內部的接口&#xff0c;一種是系統對外的接口。 系統對外的接口&#xff1a;比如你要從別的網站或服務器上獲取資源或信息&#xff0c;別人肯定不會把數據庫共享給你&#xff0c;他只能給你…

Qt layout

文章目錄 Qt layout**關鍵機制****驗證示例****常見誤區****最佳實踐****總結**關鍵點總結&#xff1a;示例代碼說明&#xff1a;結論&#xff1a; Qt layout 在 Qt 中&#xff0c;當調用 widget->setLayout(layout) 時&#xff0c;layout 的父對象會被自動設置為該 widget…

flutter: table calendar筆記

pub dev&#xff1a;table_calendar 3.2.0 我來詳細解釋 TableCalendar 是如何根據不同的 CalendarFormat 來顯示界面的。主要邏輯在 CalendarCore 中實現。 核心邏輯分為以下幾個部分&#xff1a; 頁面數量計算 - _getPageCount 方法根據不同格式計算總頁數&#xff1a; in…

【C++】各個版本新的特性和改進

C 語言自從其誕生以來&#xff0c;經歷了多個版本的更新&#xff0c;每個版本都引入了新的特性和改進&#xff0c;目的是提升語言的表達能力、性能、安全性以及開發效率。下面是各個主要版本&#xff08;從 C98 到 C20&#xff09;的一些關鍵特性。 C98 (1998年) ISO C 標準化…

C++模板與STL七日斬:從工業編程到高效數據管理(工業項目)

模板如何提升工業代碼復用性 實戰項目&#xff1a;創建通用【工業設備容器】模板類 類模板的定義與實例化模板參數默認值 #include <iostream> #include <string> using namespace std;template <typename T string> class IndustrialContainer { priva…

sh腳本把服務器B,服務器C目錄的文件下載到服務器A目錄,添加開機自啟動并且一小時執行一次腳本

腳本邏輯 第一次會下載,第二次比較如果有就不下載 文件已存在&#xff1a; 如果目標目錄中已經存在同名文件&#xff0c;rsync 會比較源文件和目標文件的大小和修改時間。 如果源文件和目標文件的大小和修改時間完全相同&#xff0c;rsync 會跳過該文件&#xff0c;不會重新下載…

云手機如何進行經緯度修改

云手機如何進行經緯度修改 云手機修改經緯度的方法因不同服務商和操作方式有所差異&#xff0c;以下是綜合多個來源的常用方法及注意事項&#xff1a; 通過ADB命令注入GPS數據&#xff08;適用于技術用戶&#xff09; 1.連接云手機 使用ADB工具連接云手機服務器&#xff0c;…

透徹理解:方差、協方差、相關系數、協方差矩陣及其應用

最近看了幾篇跨領域特征對齊方面的經典文獻&#xff0c;學者們搞了很多花樣&#xff0c;如有的提出一階統計特征對齊&#xff0c;有的提出二階統計特征對齊&#xff0c;有的學者提出高階統計特征對齊。 通俗而言&#xff0c;就是在統計特征層面對跨域特征進行對齊&#xff0c;…

Unity基礎學習(二)

二、Mono中的重要內容 1、延遲函數 &#xff08;1&#xff09;延遲函數定義 延遲執行的函數&#xff0c;可以設定要延遲執行的函數和具體延遲的時間 &#xff08;2&#xff09;延遲函數的使用 #region 1、延遲函數//函數&#xff1a;Invoke(函數名/字符串&#xff0c;延遲時…

20250212:ZLKMedia 推流

1:資料 快速開始 ZLMediaKit/ZLMediaKit Wiki GitHub GitHub - ZLMediaKit/ZLMediaKit: WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT server and client framework based on C++11 文檔里面提供了各個系…

Holoens2開發報錯記錄02_通過主機獲取彩色和深度數據流常見錯誤

01.E1696 E1696 無法打開源文件 “stdio.h” 解決方法&#xff1a; 更新一下SDK 1&#xff09;打開Visual Studio Installer&#xff0c;點擊修改 2&#xff09;安裝詳細信息中自己系統對應的SDK&#xff0c;點擊修改即可 02.WinError 10060 方法來源 解決方法&#xff1a…