QT的學習(一)

前言:距離上一次摸QT已經快10年了,時光匆匆,現在已經到6.9版本了

一、安裝QT

1.1、下載鏈接

https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/
這是國內鏡像,比官網快很多了,官網那個可以用龜速來形如。

目前已采用在線下載方式,類似visual studio 2022,依稀記得,最開始接觸時,需要下載源代碼,然后自己適配,編譯。

二、計算器

先寫個計算器先熟悉下

  • 功能包含:四則運算,含小數點,可進行浮點數計算,包含括號

  • 界面設計:使用QT的UI工具進行布局
    在這里插入圖片描述

大致如圖所示,由于控件較多,也比較密集,所以采用網格布局(grid layout),然后為每個控件設置信號與對應的槽<=============>Windows下的win32或者MFC的事件與相關回調函數

當然除了在ui界面一個一個設置相關的槽,還可以直接通過代碼來進行設置

//連接信號與槽,對C按鈕使用
connect(ui->clear_Button, &QPushButton::clicked, this, [this](){express.clear();ui->display_LineEdit->setText(express);
});//連接信號與槽,對Del按鈕使用
connect(ui->del_Button, &QPushButton::clicked, this, [this](){if(!express.isEmpty()){express.chop(1);ui->display_LineEdit->setText(express);}
});
  • 核心功能:實現計算器,采用逆波蘭式
      1. 先了解中綴表達式:形如A+B運算符在兩個操作數中間,所以就是中綴表達式,日常生活中使用的就是這種
      1. 后綴表達式:運算符在操作數后面就是,如A B +
      1. 逆波蘭式的核心:就是將中綴表達式轉變為后綴表達式,然后對后綴表達式進行計算
      1. 一般要使用兩個棧,一個棧存放操作數,另外一個棧存放運算符。
      1. 計算終止條件,運算符棧為空,就彈出操作數棧的棧頂元素
        在這里插入圖片描述
//核心代碼如下
// 等號的槽函數
void Widget::on_equval_Button_clicked()
{if(express.isEmpty()){express += '0';ui->display_LineEdit->setText(express);return;}//逆波蘭式進行計算try{//替換掉表達式中的XQString str = express;str.replace('X', '*');//先將中綴表達式轉為后綴表達式QString post_str = infixToPostFix(str);//計算后綴表達式的值double result = calPostFix(post_str);QString temp = QString::number(result, 'g', 10);            //將其轉為10位有效數字ui->display_LineEdit->setText(temp);}catch(...){express = "Error";ui->display_LineEdit->setText(express);}express.clear();
}
// 中綴轉后綴
QString Widget::infixToPostFix(const QString &str)
{QStack<QChar> ops;QString ans = "";auto priority = [](const QChar c)->int{         //需要進行比較運算符的優先級,優先計算優先級高的if(c == '+' || c== '-') return 1;if(c == '*' || c== '/') return 2;return 0;};int len = str.length();for(int i = 0; i < len; ++i){QChar c= str[i];//處理數字和小數點if(c == '.' || c.isDigit()){while(i < len && (str[i] == '.' || str[i].isDigit())){ans += str[i];++i;}i--;        //再回退一格ans += ' ';     //用空格分隔數字}else if(c == '('){ops.push(c);}else if(c == ')'){while(!ops.isEmpty() && ops.top() != '('){ans += ops.top();ops.pop();ans += ' ';}if(!ops.isEmpty() && ops.top() == '('){ops.pop();}}else{          //處理四則運算符while(!ops.isEmpty() && (priority(ops.top()) > priority(c))){ans += ops.top();ops.pop();ans += ' ';}ops.push(c);}}//將剩下的運算符全部彈出while(!ops.isEmpty()){ans += ops.top();ops.pop();ans += ' ';}return ans.trimmed();
}
// 計算后綴表達式的值
double Widget::calPostFix(const QString &str)
{QStack<double> nums;QString num_str;int len = str.length();auto isOperator = [](const QChar& c)->bool{                             if(c == '+' || c == '-' || c == '*' || c == '/')    return true;return false;};for(int i = 0; i < len; ++i){QChar c = str[i];//先處理數字和小數點if(c == '.' || c.isDigit()){num_str.clear();while(i < len && (str[i].isDigit() || str[i] == '.')){num_str += str[i];++i;}i--;bool flag = false;double num = num_str.toDouble(&flag);if(flag){nums.push(num);}}else if(isOperator(c)){//操作如果<2不允許計算if(nums.size() < 2){return 0;}double num_B = nums.top();nums.pop();double num_A = nums.top();nums.pop();double result = 0.0f;switch(c.unicode()){case '+': result = num_A + num_B; break;case '-': result = num_A - num_B; break;case '*': result = num_A * num_B; break;case '/': {if(num_B == 0){return 0;}result = num_A / num_B;}break;}nums.push(result);}}if(nums.isEmpty()){return 0;}return nums.top();
}

之前逆波蘭式說是兩個棧,但這邊優化了下,在中綴轉后綴以及計算后綴時,都分別只使用了一個棧和一個字符串,用字符串模擬棧操作,減少點代碼

三、小結:

3.1. 從代碼中可以看到,對于堆上申請的內存,比如ui,我沒有進行手動釋放內存,難道不怕造成內存泄漏嗎?

    QT擁有自動刪除機制:- 當QT父對象被刪除時,它會自動刪除所有子對象- 只有當對象沒有父對象時,才需要手動delete, 不過大部分對象都會被QT接管,所以不必過分關注,使用`QObject::deleteLater`來進行手動刪除<br>

3.2. 沒使用C++原生的STL容器,string, stack,就連基礎類型char都沒使用,使用的是QT這邊二次封裝的QString,QStack,QChar,這對于不經常寫QT的人來說,確實一下子有點懵,常用的STL算法在QT這邊要變形,比如原生的判斷字符是否是數字,isdigit(c),在QT這邊沒有,而是c.isdigit(), switch表達式不能直接使用QChar,要這樣使用switch(c.unicode())

Code

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

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

相關文章

亞洲數字能源獨角獸的 “安全密碼”:Parasoft為星星充電筑牢軟件防線

當你在充電樁前等待愛車滿電時&#xff0c;是否想過&#xff1a;這看似簡單的充電過程&#xff0c;背后藏著多少軟件代碼的精密協作&#xff1f;作為亞洲數字能源領域的頭部企業&#xff0c;星星充電用 “移動能源網” 連接著千萬用戶與新能源世界&#xff0c;而支撐這一切的&a…

安裝Codex(需要用npm)

查看已經安裝的包 npm list -g --depth0 npm uninstall -g anthropic-ai/claude-code 如果要卸載什么東西 安裝Codex &#xff1a;npm i -g openai/codex https://openai.com/zh-Hant/codex/ 之后登錄gpt賬號&#xff0c;完成后就是下面的樣子

HarmonyOS 開發學習分享:從入門到認證的完整路徑

HarmonyOS 開發學習分享&#xff1a;從入門到認證的完整路徑 大家好&#xff01;我是趙老師&#xff0c;一個深耕鴻蒙生態的開發者。最近剛通過鴻蒙生態賦能資源豐富度建設活動的講師認證&#xff0c;想和大家分享一下 HarmonyOS 開發的學習心得和認證經驗。 我的鴻蒙開發經歷作…

使用Spring Boot DevTools快速重啟功能

背景 在Spring Boot項目中&#xff0c;修改一些簡單的代碼后&#xff0c;每次手動終止并啟動整個項目比較繁瑣且消耗時間。Spring Boot DevTools 提供了開發時的熱重啟功能&#xff0c;使得在開發過程中修改代碼后可以快速生效&#xff0c;而無需手動重啟整個應用&#xff0c;可…

7.4Element Plus 分頁與表格組件

el-pagination el-table 這兩個組件是后臺管理系統中最常用的數據展示與交互組合&#xff0c;通常配合使用實現 分頁加載、排序、篩選、操作 等功能。一、分頁組件 el-pagination用于控制大量數據的分頁展示。? 基本結構<el-paginationv-model:current-page"currentPa…

搭建機器學習模型的數據管道架構方案

本篇文章Designing Data Pipeline Architectures for Machine Learning Models適合對數據管道架構感興趣的讀者&#xff0c;亮點在于詳細解析了傳統數據倉庫、云原生數據湖和現代湖倉這三種架構&#xff0c;幫助理解如何將原始數據轉化為可操作的預測。文中還強調了不同架構的優…

GitHub 熱榜項目 - 日榜(2025-09-06)

GitHub 熱榜項目 - 日榜(2025-09-06) 生成于&#xff1a;2025-09-06 統計摘要 共發現熱門項目&#xff1a;15 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜顯示AI自動化與安全運維為核心趨勢。Bytebot、EvolutionAPI等AI代理項目凸顯自然語言交互和容器化…

Homebrew執行brew install出現錯誤(homebrew-bottles)

問題描述 在使用homebrew安裝軟件時&#xff0c;出現如下報錯&#xff1a; Downloading https://mirrors.aliyun.com/homebrew/homebrew-bottles/bottles-portable-ruby/portable ruby-3.4.5.arm64_big_sur.bottle.tar.gz curl: (22) The requested URL returned error: 404 …

23種設計模式——工廠方法模式(Factory Method Pattern)詳解

?作者簡介&#xff1a;大家好&#xff0c;我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式&#xff0c;持續分享Java技術內容。 &#x1f34e;個人主頁&#xff1a;Meteors.的博客 &#x1f49e;當前專欄&#xff1a;設計模式 ?特色專欄&#xff1a;知識分享 &#x…

NPU邊緣推理識物系統

目錄 NPU邊緣推理識物系統 一、項目簡介 二、硬件介紹 三、軟件設計 1、底層NPU推理代碼 2、應用層QT顯示代碼 四、項目成果展示 NPU邊緣推理識物系統 一、項目簡介 物品分類是計算機視覺的重要技術&#xff0c;本項目的核心是&#xff1a;使用NPU&#xff08;神經網絡…

C# WinForm分頁控件實現與使用詳解

C# WinForm分頁控件實現與使用詳解概述在WinForms應用程序開發中&#xff0c;數據分頁是常見的需求。本文將介紹如何實現一個功能完整的分頁控件&#xff0c;并在窗體中如何使用該控件進行數據分頁展示。分頁控件實現核心屬性與字段public partial class PageControl : UserCon…

高級 ACL 有多強?一個規則搞定 “IP + 端口 + 協議” 三重過濾

一、實驗拓撲及描述 二、實驗需求 1、完成拓撲中各設備的基礎配置&#xff0c;使得全網互通&#xff1b; 2、在上一個需求的基礎上&#xff0c;在路由器上部署高級ACL&#xff0c;使得Client1無法訪問Server的HTTP服務&#xff0c;但是PC1依然能夠訪問服務器及其他節點&#xf…

支持多材質密度設置的金屬重量計算使用指南

傳統手工計算各種型材&#xff08;如鋼管、角鋼、鋼板等&#xff09;的重量繁瑣且容易出錯。 它的體積小巧&#xff0c;不足100KB&#xff0c;運行不占內存&#xff0c;綠色免安裝&#xff0c;雙擊即開&#xff0c;使用便捷。 可計算鋼管、鋼板、型鋼、角鋼等常見型材的重量&a…

在Spring Boot中使用H2數據庫

好處 程序啟動時自動創建數據庫數據表。 使用步驟 引入依賴&#xff1a; <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId&…

Day21_【機器學習—決策樹(2)—ID3樹 、C4.5樹、CART樹】

一、ID3 決策樹1. 核心思想使用信息增益&#xff08;Information Gain&#xff09;作為特征選擇的標準&#xff0c;遞歸地構建決策樹。2. 特征選擇標準信息增益&#xff08;IG&#xff09;&#xff1a;選擇使信息增益最大的特征進行劃分。3. 優點算法簡單&#xff0c;易于理解。…

2025計算機視覺新技術

CLIP / BLIP-3 類「視覺-語言大模型」 ? 是什么&#xff1a;讓網絡自己學會“看圖說話”&#xff0c;zero-shot 就能分類、檢測、檢索。 ? 能干什么&#xff1a;不寫訓練代碼&#xff0c;直接一句中文 prompt 就把商品圖分成 500 類。 ? 落地難度&#xff1a;★☆☆&#xf…

[光學原理與應用-431]:非線性光學 - 能生成或改變激光波長的物質或元件有哪些?

要生成或改變激光波長&#xff0c;可依賴增益介質、非線性光學元件、調諧元件及特殊激光器設計&#xff0c;以下是一些關鍵物質和元件及其作用機制&#xff1a;一、增益介質&#xff1a;波長的“決定者”增益介質是激光器的核心&#xff0c;其原子或分子的能級結構直接決定輸出…

接口權限驗證有哪些方式

接口權限驗證是保障 API 安全的核心機制&#xff0c;常見的方式有以下幾類&#xff0c;適用于不同場景和安全需求&#xff1a; 1. 基于令牌&#xff08;token&#xff09;的驗證 &#xff08;1&#xff09;JWT&#xff08;JSON Web Token&#xff09; 原理&#xff1a; 服務器驗…

Go開發的自行托管代理加速服務:支持Docker與GitHub加速

HubProxy&#xff1a;一站式解決Docker與GitHub訪問難題的輕量級代理服務作為開發者&#xff0c;我們經常遇到這些問題&#xff1a;Docker鏡像拉取速度慢得讓人抓狂&#xff0c;GitHub Release文件下載到一半斷開&#xff0c;或者某些境外容器倉庫完全無法訪問。最近發現的hubp…

用Python打造逼真的照片桌面:從拖拽到交互的完整實現

在這個數字化時代&#xff0c;我們經常需要處理大量的照片和圖片文件。今天我將帶你一步步實現一個功能豐富的照片桌面程序&#xff0c;讓你可以像在真實桌面上擺放照片一樣操作數字圖片。這個程序使用wxPython構建&#xff0c;支持拖拽、調整大小、刪除等交互功能。C:\pythonc…