【Qt】初識Qt(二)

目錄

  • 一、顯示hello world
    • 1.1 圖形化界面
    • 1.2 寫代碼
  • 二、對象樹
  • 三、使用輸入框顯示hello world
  • 四、使用按鈕顯示hello world

一、顯示hello world

有兩種方式實現hello world:

  • 通過圖形化界面,在界面上創建出一個控件,顯示hello world
  • 通過寫代碼的方式,創建控件,顯示hello world

1.1 圖形化界面

點擊widget.ui文件,進入界面設計。左邊找到Label標簽,鼠標點中拖到框框里面,然后寫hello world
在這里插入圖片描述
注意:框框里面寫了hello world后,在source文件夾的main.cpp和widget.cpp文件內容是沒有變化的,變化的是.ui文件

在這里插入圖片描述
點擊左下角的三角形按鈕,運行:
在這里插入圖片描述

同時在右上角發現,多了一個控件:
在這里插入圖片描述

剛剛我們寫了hello world的內容,ui文件就會在xml中多出來一段代碼,qmake就會在編譯項目的時候,基于這段代碼生成一段C++代碼,然后通過這段C++代碼構建出界面內容(這是自動完成的,不需要手動)

1.2 寫代碼

寫代碼的位置:在widget.cpp文件中

#include "widget.h"
#include "ui_widget.h"
#include <QLabel>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QLabel* label = new QLabel(this);// QLabel label;label->setText("hello world");
}Widget::~Widget()
{delete ui;
}
  • 注意要記得帶上頭文件#include < QLabel>
  • QLabel可以在對堆上創建對象,也可以在棧上創建對象,一般用堆更好些
  • QLabel對象的小括號中的this表示指明父類(Widget w)
  • 對象的方法的setText填入要顯示的文本內容,可以直接用C風格字符串(C格式字符串會隱式構造成QString對象)

由于Qt出現的比較早,當時還沒有C++的標準庫,所以Qt為了自己的開發能夠流暢,也有自己的一套輪子,包括:字符串QString、QVector、QList、QMap等等。但是現在QString和std::string是可以相互轉換的,相比而言,QString稍微好點,因為它內部的已經對于字符編碼做了處理。

運行:
在這里插入圖片描述

二、對象樹

上面的代碼有一些“問題”,在C++中,我們寫代碼new出來的對象最后都要釋放,否則會內存泄漏,可是這里的代碼并沒有顯示去釋放它。

其實在Qt中,不會產生內存泄漏問題,label對象會在合適的時候被析構釋放,之所以能夠被釋放,是因為這個對象被掛到了對象樹上(與參數的this有關)

這個對象樹是一個N叉樹,會把界面上的各種元素(控件對象)組織起來,然后統一進行釋放,合適的時候:窗口關閉

前面說通過new更好,是為了把這個對象的生命周期交給Qt的對象樹進行管理,如果是棧就不行了,可能存在提起釋放問題(出了作用域對象就銷毀了,導致最后要顯示的內容沒有顯示出來)

驗證堆上能夠自動釋放:
這里我們自定義一個MyLabel類,只要MyLabel類的析構函數執行到了,此時窗口就會銷毀,自動把對象樹上的所有對象銷毀

mylabel.h文件:

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>class MyLabel : public QLabel
{
public:// 構造函數使用QWidget*版本的// 這樣才能確保對象加到對象樹上MyLabel(QWidget* parent);~MyLabel();
};#endif // MYLABEL_H

mylabel.cpp文件:

#include "mylabel.h"
#include <iostream>MyLabel::MyLabel(QWidget* parent):QLabel(parent)
{}MyLabel::~MyLabel()
{std::cout << "mylabel已銷毀" << std::endl;
}

widget.cpp文件:

#include "widget.h"
#include "ui_widget.h"
#include "mylabel.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);MyLabel *mylabel = new MyLabel(this);mylabel->setText("hello world");
}Widget::~Widget()
{delete ui;
}

運行:在這里插入圖片描述
出現了亂碼問題。

解決方法:使用Qt提供的qDebug() 工具,可以完成日志打印工作,處理好編碼格式問題

#include "mylabel.h"
#include <iostream>#include <QDebug>MyLabel::MyLabel(QWidget* parent):QLabel(parent)
{}MyLabel::~MyLabel()
{qDebug() << "MyLabel 已銷毀";
}

運行:
在這里插入圖片描述
后續盡量使用qDebug 來打印輸出信息

三、使用輸入框顯示hello world

使用單行編輯框 QLineEdit 完成

兩種方式:界面和代碼

在這里插入圖片描述

代碼:

#include "widget.h"
#include "ui_widget.h"#include <QLineEdit>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QLineEdit* ld = new QLineEdit(this);ld->setText("hello world");
}Widget::~Widget()
{delete ui;
}

在這里插入圖片描述

四、使用按鈕顯示hello world

在這里插入圖片描述
按鈕是可以點擊的,但是需要Qt中的信號槽機制。本質是給按鈕的點擊操作設置一個處理函數,當點擊時,就會執行這個處理函數

代碼:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton, &QPushButton::clicked, this, &Widget::handleClick);
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{// 當按鈕被點擊時,就把按鈕的內容進行替換if(ui->pushButton->text() == QString("hello world")){ui->pushButton->setText("hello qt");}else {ui->pushButton->setText("hello world");}
}

connect函數:

  • ui->pushButton:誰發出信號
  • &QPushButton::clicked:發出什么信號,點擊按鈕就會觸發這個信號
  • &Widget::handleClick:處理函數

別忘了在widget.h文件聲明處理函數:
在這里插入圖片描述
運行,點擊按鈕,內容從hello world變成hello qt,再點擊,從hello qt變成hello world

在這里插入圖片描述

在這里插入圖片描述

下面用代碼的方式來實現按鈕顯示hello world

代碼:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);myp = new QPushButton(this);myp->setText("hello world");connect(myp, &QPushButton::clicked, this, &Widget::handleClick);
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{// 當按鈕被點擊時,就把按鈕的內容進行替換if(myp->text() == QString("hello world")){myp->setText("hello qt");}else {myp->setText("hello world");}
}

在這里插入圖片描述
運行效果與前面一樣

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

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

相關文章

空調制冷量和功率有什么關系?

空調的制冷量和功率是衡量空調性能的兩個核心參數,二者既有區別又緊密相關,以下是具體解析: 1. 基本定義 制冷量(Cooling Capacity)指空調在單位時間內從室內環境中移除的熱量,單位為 瓦特(W) 或 千卡/小時(kcal/h)。它直接反映空調的制冷能力,數值越大,制冷效果越…

【prometheus+Grafana篇】Prometheus與Grafana:深入了解監控架構與數據可視化分析平臺

&#x1f4ab;《博主主頁》&#xff1a;奈斯DB-CSDN博客 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對SQLserver、NoSQL(MongoDB)有了解 &#x1f496;如果覺得文章對你有所幫…

基于n8n的AI應用工作流原理與技術解析

基于n8n的AI應用工作流原理與技術解析 在AI技術深度融入企業數字化轉型的今天&#xff0c;開源工作流自動化工具n8n憑借其靈活的架構和強大的集成能力&#xff0c;成為構建智能自動化流程的核心引擎。本文將從技術原理、AI融合機制、典型應用場景三個維度&#xff0c;解析n8n在…

經濟指標學習(二)

系列文章目錄 文章目錄 系列文章目錄1、市凈率**一、定義與計算****二、核心意義****三、應用場景****四、局限性****五、分類與衍生指標****總結** 2、市銷率**一、定義與計算****二、核心意義****三、優缺點分析****四、適用場景****五、與其他指標的對比****六、實際應用案例…

大語言模型減少幻覺的常見方案

什么是大語言模型的幻覺 大語言模型的幻覺&#xff08;Hallucination&#xff09;是指模型在生成文本時&#xff0c;輸出與輸入無關、不符合事實、邏輯錯誤或完全虛構的內容。這種現象主要源于模型基于概率生成文本的本質&#xff0c;其目標是生成語法合理、上下文連貫的文本&…

CSS 美化頁面(四)

一、浮動float屬性 ?屬性值??描述??適用場景?left元素向左浮動&#xff0c;騰出右側空間供其他元素使用&#xff0c;其他內容會圍繞在其右側?。橫向排列元素&#xff08;如導航菜單&#xff09;、圖文混排布局?。right元素向右浮動&#xff0c;騰出左側空間供其他元素使…

如何將 .txt 文件轉換成 .md 文件

一、因為有些軟件上傳文件的時候需要 .md 文件&#xff0c;首先在文件所在的目錄中&#xff0c;點擊“查看”&#xff0c;然后勾選上“文件擴展名”&#xff0c;這個時候該目錄下的所有文件都會顯示其文件類型了。 二、這時直接對目標的 .txt 文件進行重命名&#xff0c;把后綴…

C++ 迭代器失效詳解:如何避免 vector 操作中的陷阱

目錄 1. 什么是迭代器失效&#xff1f; 2. 哪些操作會導致迭代器失效&#xff1f; 2.1 vector 的插入操作&#xff08;push_back, insert&#xff09; 示例&#xff1a;push_back 導致迭代器失效 如何避免&#xff1f; 2.2 vector 的刪除操作&#xff08;erase, pop_back&…

(EtherCAT 轉 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP協議互轉工業串口網關

型號 協議轉換通信網關 EtherCAT 轉 EtherNet/IP MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 協議轉換網關&#xff0c;為用戶提供兩種不同通訊協議的 PLC 進行數據交互的解決方案&#xff0c;可以輕松容易將 EtherNet/IP 網絡接入 EtherCAT 網絡中&#xff0c;方便…

榕壹云酒水定制系統:基于THinKPHP+MySQL+UniApp打造數字化時代的個性化購酒新體驗

數字化浪潮下的酒水定制新機遇 在消費升級與個性化需求崛起的背景下&#xff0c;傳統酒水行業正面臨數字化轉型的迫切需求。為此&#xff0c;我們團隊基于ThinkPHPMySQLUniApp技術棧&#xff0c;開發了一套榕壹云酒水定制系統&#xff0c;旨在通過數字化手段解決消費者個性化購…

GR00T N1:面向通用類人機器人的開放基礎模型

摘要 通用型機器人需要具備多功能的身體和智能的大腦。近年來&#xff0c;類人機器人的發展在構建人類世界中的通用自主性硬件平臺方面展現出巨大潛力。一個經過大量多樣化數據源訓練的機器人基礎模型&#xff0c;對于使機器人能夠推理新情況、穩健處理現實世界的多變性以及快…

WebRTC實時通話EasyRTC嵌入式音視頻通信SDK,構建智慧醫療遠程會診高效方案

一、方案背景 當前醫療領域&#xff0c;醫療資源分布不均問題尤為突出&#xff0c;大城市和發達地區優質醫療資源集中&#xff0c;偏遠地區醫療設施陳舊、人才稀缺&#xff0c;患者難以獲得高質量的醫療服務&#xff0c;制約醫療事業均衡發展。 EasyRTC技術基于WebRTC等先進技…

深入理解主成分分析(PCA):原理、算法與應用

內容摘要 本文深入剖析主成分分析&#xff08;PCA&#xff09;技術。介紹其通過正交變換簡化數據維度的核心原理&#xff0c;詳細推導基于最小投影距離和最大投影方差的算法過程&#xff0c;總結算法流程步驟。全面分析PCA的優缺點&#xff0c;并對比其與KPCA的差異。同時闡述…

uniapp-商城-25-頂部模塊高度計算

計算高度&#xff1a; 使用computed進行頂部模塊的計算。 總高度&#xff1a;bartotalHeight log 介紹--收款碼這一條目 也就是上一章節的title的高度計算 bodybarheight。 在該組件中&#xff1a; js部分的代碼&#xff1a; 包含了導出的名字&#xff1a; shop-head…

【MCP】第一篇:MCP協議深度解析——大模型時代的“神經連接層“架構揭秘

【MCP】第一篇&#xff1a;MCP協議深度解析——大模型時代的"神經連接層"架構揭秘 一、什么是MCP&#xff1f;二、為什么需要MCP&#xff1f;三、MCP的架構四、MCP與AI交互的原理4.1 ReAct&#xff08;Reasoning Acting&#xff09;模式4.2 Function Calling 模式 五…

李飛飛團隊新作WorldScore:“世界生成”能力迎來統一評測,3D/4D/視頻模型同臺PK

從古老神話中對世界起源的幻想&#xff0c;到如今科學家們在實驗室里對虛擬世界的構建&#xff0c;人類探索世界生成奧秘的腳步從未停歇。如今&#xff0c;隨著人工智能和計算機圖形學的深度融合&#xff0c;我們已站在一個全新的起點&#xff0c;能夠以前所未有的精度和效率去…

[react]Next.js之自適應布局和高清屏幕適配解決方案

序言 閱讀前首先了解即將要用到的兩個包的作用 1.postcss-pxtorem 自動將 CSS 中的 px 單位轉換為 rem 單位按照設計稿尺寸直接寫 px 值&#xff0c;由插件自動計算 rem 值 2.amfe-flexible 動態設置根元素的 font-size&#xff08;即 1rem 的值&#xff09;根據設備屏幕寬度和…

C# 如何比較兩個List是否相等?

簡介 在 C# 里&#xff0c;比較兩個 List 是否相等&#xff0c;需要考慮多個方面&#xff0c;例如列表中的元素順序、元素本身是否相等。下面介紹幾種常見的比較方法&#xff1a; 基本類型比較&#xff08;元素順序必須一致&#xff09; var list1 new List<int> { 1…

【技術派后端篇】Redis分布式鎖:原理、實踐與應用

在當今的高并發系統中&#xff0c;分布式鎖是保障數據一致性和系統穩定性的重要手段。今天&#xff0c;我們就來深入探討一下Redis分布式鎖&#xff0c;揭開它神秘的面紗。 1 本地鎖與分布式鎖的區別 在Java開發的早期階段&#xff0c;我們接觸過synchronized和Lock鎖&#x…

奧比中光tof相機開發學習筆記

針對奧比中光 tof相機&#xff0c;官方提供的資料如下ProcessOn Mindmap|思維導圖 Orbbec SDK Python Wrapper基于Orbbec SDK進行設計封裝&#xff0c;主要實現數據流接收&#xff0c;設備指令控制。下面就其開發適配進行如下總結&#xff1a; &#xff08;1&#xff09;系統配…