QT學習日記一

  1. 創建QT文件步驟在這里插入圖片描述
    在這里插入圖片描述

這是創建之后widget.cpp和widget.h文件的具體代碼解釋,也是主要操作的文件,其中main.cpp不用操作,ui則是圖形化操作界面,綜合使用時,添加一個元件要注意重編名和編譯一下,才能在widget這類文件中提示出來

//widget.h
#ifndef WIDGET_H            // 如果沒有定義WIDGET_H宏,則定義它。這個宏防止頭文件被多次包含。
#define WIDGET_H            // 定義WIDGET_H宏。#include <QWidget>          // 包含Qt庫中的QWidget類的頭文件。QWidget是所有UI對象的基類。QT_BEGIN_NAMESPACE          // 開始Qt命名空間的定義。
namespace Ui { class Widget; } // 前向聲明Ui命名空間中的Widget類。這個類是由Qt Designer生成的,用于管理UI。
QT_END_NAMESPACE            // 結束Qt命名空間的定義。class Widget : public QWidget  // 定義Widget類,繼承自QWidget類。
{Q_OBJECT               // 這是一個Qt宏,啟用Qt的信號和槽機制。public:Widget(QWidget *parent = nullptr); // 構造函數,接受一個父窗口指針,默認值為nullptr(空指針)。~Widget();                         // 析構函數,銷毀Widget對象。
//可以在這里聲明信號槽函數,不過要添加關鍵字public slot:,類同publicprivate:Ui::Widget *ui;        // 指向Ui::Widget對象的指針,用于管理用戶界面。
};#endif // WIDGET_H         // 結束WIDGET_H宏的條件編譯。
//widget.cpp
#include "widget.h"          // 包含當前類的頭文件,這個文件中定義了Widget類的聲明和成員函數原型。
#include "ui_widget.h"       // 包含由Qt用戶界面設計工具(Qt Designer)生成的頭文件,這個文件中定義了Ui::Widget類,負責UI元素的布局和定義。Widget::Widget(QWidget *parent): QWidget(parent)       // 調用父類QWidget的構造函數,并將父窗口指針parent傳遞給它。父窗口指針用于指定當前窗口的父窗口。, ui(new Ui::Widget)    // 分配內存,創建一個新的Ui::Widget對象,并將其指針賦值給成員變量ui。Ui::Widget類由Qt Designer生成,用于管理窗口小部件的布局和控件。
{ui->setupUi(this);      // 調用Ui::Widget類的setupUi方法,初始化用戶界面。這會將設計器中定義的UI元素(如按鈕、標簽等)設置到當前Widget對象中。//ui上的操作元件大多也在這里使用,比如connect
}Widget::~Widget()
{delete ui;              // 在析構函數中刪除ui指針指向的Ui::Widget對象,釋放其占用的內存,防止內存泄漏。
}
//在此處定義widget類中的函數

一、log輸出

  1. 在Qt中進行log輸出, 一般不使用c中的printf, 也不是使用C++中的cout, Qt框架提供了專門用于日志輸出的類, 頭文件名為 QDebug
  2. qDebug(), qWarning(), qInfo(), 和 qCritical()是用于日志記錄調試輸出的函數。它們分別用于不同級別的日志記錄,幫助開發者在不同場景下記錄和調試信息。
  • qDebug():用于開發階段的調試信息,不重要的詳細信息。
  • qWarning():用于警告信息,表示有潛在問題,但不一定是致命的。
  • qInfo():用于一般信息,常規運行時的狀態信息。
  • qCritical():用于嚴重錯誤信息,表示重大問題或異常。
    在這里插入圖片描述
  • 默認情況下日志信息是不會打印到終端窗口的, 如果想要實現這樣的效果, 必須在項目文件中添加相關的屬性信息----->打開項目文件(*.pro)找到配置項 config, 添加 console 控制臺屬性----->CONFIG += c++11 console

二、幫助

  • 將光標放在函數上,按 F2+FN 會跳轉到 函數的定義。
  • 將光標放在函數上,按 Shift + F2+FN 會跳轉到函數的聲明(如果在頭文件中聲明)。
  • 將光標放在函數上,按 Ctrl + Shift + U 會查找函數在項目中的所有使用情況。
  • 將光標放在函數上,按 F1 +FN會打開Qt幫助窗口,顯示 函數 的詳細文檔。

三、QT中的信號槽

  1. 在Qt中,信號和槽機制是一種用于對象之間通信的方式,特別適用于事件驅動的編程。信號和槽機制允許一個對象發送信號并且其他對象響應這些信號,即使它們對彼此一無所知。這種機制比傳統的回調函數更靈活、更容易使用。
  2. 信號和槽機制的內部工作原理
  • 元對象系統(MOC)
    當您定義一個包含信號和槽的類時,Qt的元對象系統(MOC)會生成一些額外的代碼。這些代碼負責實現信號和槽的機制。MOC會為每個信號生成一個唯一的整數ID,并創建一個包含信號和槽信息的表。
  • 連接信號和槽
    當您調用connect函數時,Qt會將信號和槽的連接信息存儲在QObject的內部數據結構中。每個QObject對象都有一個指向QMetaObject的指針,QMetaObject包含了該對象的所有元數據信息,包括信號和槽的連接信息。
  • 發射信號
    信號被發射時,Qt會查找與該信號連接的所有槽,并依次調用它們。對于同一線程中的連接,槽函數會立即被調用。對于跨線程的連接,信號會被放入接收者所在線程的事件隊列中,等待事件循環調度執行。
  • 事件隊列
    Qt使用事件隊列和事件循環來管理跨線程的信號和槽連接。當跨線程信號被發射時,信號會被封裝成一個事件,并放入接收者線程的事件隊列中。接收者線程的事件循環會處理這些事件,并調用相應的槽函數。
  1. 連接信號和槽的函數connect()函數
函數原型(老舊的)QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));- sender:發出信號的對象的指針
- SIGNAL(signal()):發送者的信號。signal()是發送者類中的信號名稱。()內的參數可以再一次細分信號類型。
- receiver:接收者對象指針。表示在當前的類里面
- SLOT(slot()):接收者的槽函數,使用SLOT宏來指定接收者類中的槽函數。slot()是接收者類中的槽函數名稱。()內的參數可以再一次細分信號類型。
-------------------------------------------------------------------------------------------
connect函數相對于做了信號處理動作的注冊
調用conenct函數的sender對象的信號并沒有產生, 因此receiver對象的method也不會被調用
connect中的sender和recever兩個指針必須被實例化了, 否則conenct不會成功

在這里插入圖片描述

  • 在Qt中,槽函數是用于響應信號的函數。槽函數可以是任何符合簽名要求的成員函數、全局函數或靜態函數。它們在某些事件(由信號發射)發生時被調用。例如btnLogClickedSlotFun()就是自定義的槽函數。
  • 信號函數:clicked()、pressed()、released(),分別是點擊,按下持續,釋放
  1. 自定義信號和自定義槽函數
自定義信號的要求和注意事項:信號是類的成員函數
返回值必須是 void 類型
信號的名字可以根據實際情況進行指定
參數可以隨意指定, 信號也支持重載
信號需要使用 signals 關鍵字進行聲明, 使用方法類似于public等關鍵字
信號函數只需要聲明, 不需要定義(沒有函數體實現)
在程序中發射自定義信號: 發送信號的本質就是調用信號函數
習慣性在信號函數前加關鍵字: emit, 但是可以省略不寫
emit只是顯示的聲明一下信號要被發射了, 沒有特殊含義
底層 emit == #define emit自定義槽函數的要求
槽函數必須是類的成員函數:
槽函數必須是繼承自 QObject 的類的成員函數,不能是全局函數。槽函數必須標記為 slots 或使用 Q_SLOT 關鍵字:
在類定義中,槽函數需要使用 slots 或 Q_SLOT 關鍵字標記。例如:public slots:void mySlotFunction();槽函數的參數類型和數量必須與信號匹配:
槽函數的參數類型和數量必須與連接的信號一致。例如,如果信號的簽名是 void signal(int, QString),那么槽函數的簽名也應該是 void slot(int, QString)。槽函數的訪問權限可以是 public、protected 或 private:
槽函數可以是 public、protected 或 private,這取決于類的設計和訪問控制需求。
確保信號和槽的參數類型和順序一致。如果不匹配,編譯器不會報錯,但運行時連接將失敗,信號和槽之間不會通信。
槽函數的執行時間應盡量短,不要在槽函數中執行長時間阻塞的操作,因為這可能會阻塞事件循環,導致用戶界面無響應。
如果不再需要信號和槽之間的連接,可以使用 disconnect 函數斷開它們。可以斷開特定的信號和槽,也可以斷開對象之間所有的信號和槽。小竅門(在連接處加上dis即可)

在這里插入圖片描述
5. 一個信號可以連接多個槽函數, 發送一個信號有多個處理動作,槽函數的執行順序是隨機的, 和connect函數的調用順序沒有關系,一個槽函數可以連接多個信號, 多個不同的信號, 處理動作是相同的

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

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

相關文章

生產者消費者模型和線程同步問題

文章目錄 線程同步概念生產者消費者模型條件變量使用條件變量喚醒條件變量 阻塞隊列 線程同步概念 互斥能保證安全,但是僅有安全不夠,同步可以更高效的使用資源 生產者消費者模型 下面就基于生產者消費者來深入線程同步等概念: 如何理解生產消費者模型: 以函數調用為例: 兩…

[高頻 SQL 50 題(基礎版)]第一千七百五十七題,可回收且低脂產品

題目&#xff1a; 表&#xff1a;Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | low_fats | enum | | recyclable | enum | ---------------------- product_id 是該表的主鍵&#xff08;具有唯…

SQLite 命令行客戶端 + HTA 實現簡易UI

SQLite 命令行客戶端 HTA 實現簡易UI SQLite 客戶端.hta目錄結構參考資料 僅用于探索可行性&#xff0c;就只實現了 SELECT。 SQLite 客戶端.hta <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; cha…

C語言 | Leetcode C語言題解之第226題翻轉二叉樹

題目&#xff1a; 題解&#xff1a; struct TreeNode* invertTree(struct TreeNode* root) {if (root NULL) {return NULL;}struct TreeNode* left invertTree(root->left);struct TreeNode* right invertTree(root->right);root->left right;root->right le…

LeetCode加油站(貪心算法/暴力,分析其時間和空間復雜度)

題目描述 一.原本暴力算法 最初的想法是&#xff1a;先比較gas數組和cost數組的大小&#xff0c;找到可以作為起始點的站點(因為如果你起始點的油還不能到達下一個站點&#xff0c;就不能作為起始點)。當找到過后&#xff0c;再去依次順序跑一圈&#xff0c;如果剩余的油為負數…

從數據倉庫到數據湖(下):熱門的數據湖開源框架

文章目錄 一、前言二、Delta Lake三、Apache Hudi四、Apache Iceberg五、Apache Paimon六、對比七、筆者觀點八、總結八、參考資料 一、前言 在上一篇從數據倉庫到數據湖(上)&#xff1a;數據湖導論文章中&#xff0c;我們簡單講述了數據湖的起源、使用原因及其本質。本篇文章…

Rust入門實戰 編寫Minecraft啟動器#4下載資源

首發于Enaium的個人博客 首先我們需要添加幾個依賴。 model { path "../model" } parse { path "../parse" } reqwest { version "0.12", features ["blocking", "json"] } file-hashing { version "0.1&quo…

Xshell 和寶塔有啥區別

Xshell 和寶塔是兩種不同類型的工具&#xff0c;具有以下顯著區別&#xff1a; 1. 功能和用途 Xshell&#xff1a;主要是一款用于遠程連接服務器的終端模擬軟件。它允許用戶通過 SSH 協議安全地連接到遠程服務器&#xff0c;并在終端中執行命令&#xff0c;進行服務器的管理和…

AI論文作圖——如何表示模型參數凍結狀態

一、LOGO &#x1f525; win10win11 ?? win10win11 二、注意事項&#xff1a; 根據電腦系統&#xff0c;選擇對應的版本。 參考&#xff1a; 【AI論文作圖】如何表示模型參數凍結狀態&#xff1f;

對稱加密和非對稱加密解析

目錄 一、對稱加密二、非對稱加密三、總結 對稱加密和非對稱加密是兩種主要的加密技術&#xff0c;它們在數據安全領域扮演著重要角色。 一、對稱加密 基本原理&#xff1a;對稱加密使用同一個密鑰進行加密和解密。這意味著如果A用某個密鑰加密了信息發送給B&#xff0c;那么B…

Redis數據庫筆記

一、 認識NoSQL SQLNoSQL數據結構結構化非結構化(鍵值類型(Redis)文檔類型(MongoDB)列類型(HBase)Graph類型(Neo4j))數據關聯關聯的無關聯查詢方式SQL查詢非SQL事務特性ACIDBASE存儲方式磁盤內存擴展性垂直水平使用場景數據結構固定;相關業務對數據安全性、一致性要…

【C++中resize和reserve的區別】

1. resize的用法 改變當前容器內含有元素的數量&#xff08;size()&#xff09;比如&#xff1a; vector<int> vct;int num vct.size();//之前的元素個數為num vct.resize(len);//現在的元素個數為len如果num < len &#xff0c;那么容器vct新增len - num個元素&am…

8-選擇靜態或共享庫

在本節中&#xff0c;我們將展示如何使用BUILD_SHARED_LIBS變量來控制add_library()的默認行為&#xff0c;并允許控制如何構建沒有顯式類型的庫(STATIC、SHARED、MODULE或OBJECT)。 要做到這一點&#xff0c;我們需要將BUILD_SHARED_LIBS添加到頂級的CMakeLists.txt中。我…

神經網絡中的激活函數

目錄 一、什么是激活函數&#xff1a;二、如何選擇激活函數&#xff1a;1.Sigmoid激活函數&#xff1a;2.線性激活函數&#xff1a;3.ReLU激活函數&#xff1a; 一、什么是激活函數&#xff1a; 激活函數是神經網絡中的一種函數&#xff0c;它在神經元中起到了非線性映射的作用…

最新 Kubernetes 集群部署 + flannel 網絡插件(保姆級教程,最新 K8S 版本)

資源列表 操作系統配置主機名IP所需插件CentOS 7.92C4Gk8s-master192.168.60.143flannel-cni-plugin、flannel、coredns、etcd、kube-apiserver、kube-controller-manager、kube-proxy、 kube-scheduler 、containerd、pause 、crictlCentOS 7.92C4Gk8s-node01192.168.60.144f…

gitee上傳和下載idea項目的流程

環境&#xff1a;idea2022 一、上傳項目 1、在gitee中新建一個倉庫。 2、打開所要上傳的項目的文件夾&#xff0c;點擊Git Bash&#xff0c;生成.git文件夾。 3、在idea中打開所要上傳的項目&#xff0c;在控制臺的Terminal菜單中&#xff0c;輸入git add . (注意&#xf…

安防綜合管理/視頻匯聚平臺EasyCVR視頻監控存儲技術:高效穩定的視頻數據保障方案

隨著科技的飛速發展&#xff0c;視頻監控已成為現代社會不可或缺的一部分。無論是城市治安、交通管理&#xff0c;還是商業安保、家庭監控&#xff0c;視頻監控都發揮著至關重要的作用。而在這背后&#xff0c;視頻監控存儲技術則是確保監控數據得以長期保存、高效檢索和可靠利…

「C++系列」C++ 修飾符類型

文章目錄 一、C 修飾符類型1. 訪問修飾符&#xff08;Access Modifiers&#xff09;2. 存儲類修飾符&#xff08;Storage Class Specifiers&#xff09;3. 類型修飾符&#xff08;Type Modifiers&#xff09;4. 函數修飾符 二、C 修飾符類型-案例1. 訪問修飾符案例2. 存儲類修飾…

精講:java之多維數組的使用

一、多維數組簡介 1.為什么需要二維數組 我們看下面這個例子&#xff1f;“ 某公司2022年全年各個月份的銷售額進行登記。按月份存儲&#xff0c;可以使用一維數組。如果改寫為按季度為單位存儲怎么辦呢&#xff1f; 或許現在學習了一維數組的你只能申請四個一維數組去存儲每…

【福利】代碼公開!咸魚之王自動答題腳本

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 微信或QQ打開咸魚之王小程序&#xff0c;進入答題界面&#xff0c;運行main.py。期間不要動鼠標。 可自行更改代碼來適配自己的需求~ 可以按照示例圖片…