QT使用教程之程序編寫
1 最簡(jiǎn)單的Qt小程序
#include "widget.h"#include
int main(int argc, char *argv[]){
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
解釋:
1、Qt系統(tǒng)提供的標(biāo)準(zhǔn)類名聲明頭文件沒有.h后綴 2、Qt一個(gè)類對(duì)應(yīng)一個(gè)頭文件,類名就是頭文件名 3、QApplication應(yīng)用程序類 3.1管理圖形用戶界面應(yīng)用程序的控制流和主要設(shè)置。 3.2是Qt的整個(gè)后臺(tái)管理的命脈它包含主事件循環(huán),在其中來自窗口系統(tǒng)和其它資源的所有事件處理和調(diào)度。它也處理應(yīng)用程序的初始化和結(jié)束,并且提供對(duì)話管理。 3.2對(duì)于任何一個(gè)使用Qt的圖形用戶界面應(yīng)用程序,都正好存在一個(gè)QApplication 對(duì)象,而不論這個(gè)應(yīng)用程序在同一時(shí)間內(nèi)是不是有0、1、2或更多個(gè)窗口。 4a.exec() 程序進(jìn)入消息循環(huán),等待對(duì)用戶輸入進(jìn)行響應(yīng)。這里main()把控制權(quán)轉(zhuǎn)交給Qt,Qt完成事件處理工作,當(dāng)應(yīng)用程序退出的時(shí)候exec()的值就會(huì)返回。在exec()中,Qt接受并處理用戶和系統(tǒng)的事件并且把它們傳遞給適當(dāng)?shù)拇翱诓考?/p>
2窗口屬性修改
2.1確定代碼書寫位置
.pro:用于生成可執(zhí)行文件
main.cpp:主函數(shù)
widget.cpp:類的函數(shù)
一般情況,窗口的屬性和添加控件和對(duì)控件的操作都會(huì)在類的構(gòu)造函數(shù)中書寫。
優(yōu)點(diǎn):可以讓主程序中無多余的代碼,程序閱讀也方便。
widget.h:類和頭文件
2.2確定使用哪些函數(shù)
1、幫助手冊(cè)在哪:
2、幫助手冊(cè)怎么看
索引---》對(duì)應(yīng)的類
類的說明(類的頭文件,組件、基類、派生類)
類的內(nèi)容(函數(shù))
注意:如果函數(shù)在類中未找到,可去其基類中查找。
2.3設(shè)置窗口屬性
//修改窗口的標(biāo)題(第一個(gè)窗口)
this->setWindowTitle("第一個(gè)窗口");
//設(shè)置窗口的大小,設(shè)置完成可以拉伸
this->resize(600,400);
//設(shè)置固定大小,設(shè)置完成不可拉伸 this->setFixedSize(500,500);
2.4如果Qt中文亂碼解決:(注意:改完之后,新建工程亂碼解決)
3按鈕的創(chuàng)建
在Qt程序中,最常用的控件之一就是按鈕了,首先我們來看下如何創(chuàng)建一個(gè)按鈕,兩種創(chuàng)建方式如下:
頭文件:
#include
第一種:
QPushButton * btn = new QPushButton;
//設(shè)置父親
btn->setParent(this);
//設(shè)置文字
btn->setText("德瑪西亞");
//移動(dòng)位置
btn->move(100,100);
第二種:
QPushButton * btn2 = new QPushButton("孫悟空",this);
//重新指定窗口大小
this->resize(600,400);
設(shè)置窗口標(biāo)題:
this->setWindowTitle("第一個(gè)項(xiàng)目");
//限制窗口大小
this->setFixedSize(600,400);
上面代碼中,一個(gè)按鈕其實(shí)就是一個(gè)QPushButton類下的對(duì)象,如果只是創(chuàng)建出對(duì)象,是無法顯示到窗口中的,所以我們需要依賴一個(gè)父窗口,也就是指定一個(gè)父親利用setParent函數(shù)即可,如果想設(shè)置按鈕上顯示的文字利用setText,移動(dòng)按鈕位置用move
對(duì)于窗口而言,我們可以修改左上角窗口的標(biāo)題setWindowTitle,重新指定窗口大小:resize,或者設(shè)置固定的窗口大小setFixedSize;
4對(duì)象模型(對(duì)象樹)
在Qt中創(chuàng)建對(duì)象的時(shí)候會(huì)提供一個(gè)Parent對(duì)象指針,下面來解釋這個(gè)parent到底是干什么的。
1、QObject是以對(duì)象樹的形式組織起來的。 2、當(dāng)你創(chuàng)建一個(gè)QObject對(duì)象時(shí),會(huì)看到QObject的構(gòu)造函數(shù)接收一個(gè)QObject指針作為參數(shù),這個(gè)參數(shù)就是 parent,也就是父對(duì)象指針。 這相當(dāng)于,在創(chuàng)建QObject對(duì)象時(shí),可以提供一個(gè)其父對(duì)象,我們創(chuàng)建的這個(gè)QObject對(duì)象會(huì)自動(dòng)添加到其父對(duì)象的children()列表。 3、當(dāng)父對(duì)象析構(gòu)的時(shí)候,這個(gè)列表中的所有對(duì)象也會(huì)被析構(gòu)。(注意,這里的父對(duì)象并不是繼承意義上的父類!) 這種機(jī)制在 GUI 程序設(shè)計(jì)中相當(dāng)有用。例如,一個(gè)按鈕有一個(gè)QShortcut(快捷鍵)對(duì)象作為其子對(duì)象。當(dāng)我們刪除按鈕的時(shí)候,這個(gè)快捷鍵理應(yīng)被刪除。這是合理的。 4、QWidget是能夠在屏幕上顯示的一切組件的父類。 5、QWidget繼承自QObject,因此也繼承了這種對(duì)象樹關(guān)系。一個(gè)孩子自動(dòng)地成為父組件的一個(gè)子組件。因此,它會(huì)顯示在父組件的坐標(biāo)系統(tǒng)中,被父組件的邊界剪裁。例如,當(dāng)用戶關(guān)閉一個(gè)對(duì)話框的時(shí)候,應(yīng)用程序?qū)⑵鋭h除,那么,我們希望屬于這個(gè)對(duì)話框的按鈕、圖標(biāo)等應(yīng)該一起被刪除。事實(shí)就是如此,因?yàn)檫@些都是對(duì)話框的子組件。 6、當(dāng)然,我們也可以自己刪除子對(duì)象,它們會(huì)自動(dòng)從其父對(duì)象列表中刪除。比如,當(dāng)我們刪除了一個(gè)工具欄時(shí),其所在的主窗口會(huì)自動(dòng)將該工具欄從其子對(duì)象列表中刪除,并且自動(dòng)調(diào)整屏幕顯示。
Qt 引入對(duì)象樹的概念,在一定程度上解決了內(nèi)存問題。
1、當(dāng)一個(gè)QObject對(duì)象在堆上創(chuàng)建的時(shí)候,Qt 會(huì)同時(shí)為其創(chuàng)建一個(gè)對(duì)象樹。不過,對(duì)象樹中對(duì)象的順序是沒有定義的。這意味著,銷毀這些對(duì)象的順序也是未定義的。 2、任何對(duì)象樹中的 QObject對(duì)象 delete 的時(shí)候,如果這個(gè)對(duì)象有 parent,則自動(dòng)將其從 parent 的children()列表中刪除;如果有孩子,則自動(dòng) delete 每一個(gè)孩子。Qt 保證沒有QObject會(huì)被 delete 兩次,這是由析構(gòu)順序決定的。
如果QObject在棧上創(chuàng)建,Qt 保持同樣的行為。正常情況下,這也不會(huì)發(fā)生什么問題。來看下下面的代碼片段:
{
QWidget window;
QPushButton quit("Quit", &window);}
作為父組件的 window 和作為子組件的 quit 都是QObject的子類(事實(shí)上,它們都是QWidget的子類,而QWidget是QObject的子類)。這段代碼是正確的,quit 的析構(gòu)函數(shù)不會(huì)被調(diào)用兩次,因?yàn)闃?biāo)準(zhǔn) C++要求,局部對(duì)象的析構(gòu)順序應(yīng)該按照其創(chuàng)建順序的相反過程。因此,這段代碼在超出作用域時(shí),會(huì)先調(diào)用 quit 的析構(gòu)函數(shù),將其從父對(duì)象 window 的子對(duì)象列表中刪除,然后才會(huì)再調(diào)用 window 的析構(gòu)函數(shù)。
但是,如果我們使用下面的代碼:
{
QPushButton quit("Quit");
QWidget window;
quit.setParent(&window);}
情況又有所不同,析構(gòu)順序就有了問題。我們看到,在上面的代碼中,作為父對(duì)象的 window 會(huì)首先被析構(gòu),因?yàn)樗亲詈笠粋€(gè)創(chuàng)建的對(duì)象。在析構(gòu)過程中,它會(huì)調(diào)用子對(duì)象列表中每一個(gè)對(duì)象的析構(gòu)函數(shù),也就是說, quit 此時(shí)就被析構(gòu)了。然后,代碼繼續(xù)執(zhí)行,在 window 析構(gòu)之后,quit 也會(huì)被析構(gòu),因?yàn)?quit 也是一個(gè)局部變量,在超出作用域的時(shí)候當(dāng)然也需要析構(gòu)。但是,這時(shí)候已經(jīng)是第二次調(diào)用 quit 的析構(gòu)函數(shù)了,C++ 不允許調(diào)用兩次析構(gòu)函數(shù),因此,程序崩潰了。
由此我們看到,Qt 的對(duì)象樹機(jī)制雖然幫助我們?cè)谝欢ǔ潭壬辖鉀Q了內(nèi)存問題,但是也引入了一些值得注意的事情。這些細(xì)節(jié)在今后的開發(fā)過程中很可能時(shí)不時(shí)跳出來煩擾一下,所以,我們最好從開始就養(yǎng)成良好習(xí)慣,在 Qt 中,盡量在構(gòu)造的時(shí)候就指定 parent 對(duì)象,并且大膽在堆上創(chuàng)建。

相關(guān)推薦HOT
更多>>
unity圖集合并成圖片
Unity圖集合并成圖片是一種將多個(gè)小圖片合并成一個(gè)大圖片的技術(shù)。這種技術(shù)在游戲開發(fā)中非常常見,可以有效地減少內(nèi)存占用和提高渲染效率。我們...詳情>>
2023-08-28 18:07:44
unity向量旋轉(zhuǎn)得另一向量
Unity中的向量旋轉(zhuǎn)是一項(xiàng)常見的操作,可以通過使用旋轉(zhuǎn)矩陣或四元數(shù)來實(shí)現(xiàn)。以下是關(guān)于如何在Unity中旋轉(zhuǎn)一個(gè)向量得到另一個(gè)向量的詳細(xì)解釋。在...詳情>>
2023-08-28 18:07:42
unity哪個(gè)版本免費(fèi)
Unity是一款強(qiáng)大的游戲開發(fā)引擎,提供了許多功能和工具,可以幫助開發(fā)者輕松創(chuàng)建高質(zhì)量的游戲。關(guān)于Unity的版本免費(fèi)問題,我將為你詳細(xì)解答。Un...詳情>>
2023-08-28 18:07:42
unity對(duì)象池怎么寫
Unity對(duì)象池是一種常用的優(yōu)化技術(shù),用于管理和重復(fù)利用游戲中的對(duì)象,以減少內(nèi)存分配和銷毀的開銷。在Unity中,可以通過編寫一些代碼來實(shí)現(xiàn)對(duì)象...詳情>>
2023-08-28 18:07:41熱門推薦
unity快捷鍵大全
沸unity圖集合并成圖片
熱unity射線檢測(cè)多個(gè)物體
熱unity向量旋轉(zhuǎn)得另一向量
新unity哪個(gè)版本免費(fèi)
unity富文本字體大小
unity對(duì)象池怎么寫
unity對(duì)象池優(yōu)缺點(diǎn)
unity材質(zhì)球?yàn)槭裁床荒苄薷?/p>
unity碰撞器和觸發(fā)器的區(qū)別
Unity物體移動(dòng)指定距離腳本
unity性能優(yōu)化指標(biāo)
unity開發(fā)常用框架
unity模型中心位置怎么改
快速通道 更多>>
-
課程介紹
點(diǎn)擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習(xí)費(fèi)用
了解課程價(jià)格 -
優(yōu)惠活動(dòng)
領(lǐng)取優(yōu)惠券 -
學(xué)習(xí)資源
領(lǐng)3000G教程 -
師資團(tuán)隊(duì)
了解師資團(tuán)隊(duì) -
實(shí)戰(zhàn)項(xiàng)目
獲取項(xiàng)目源碼 -
開班地區(qū)
查看來校路線