QT開(kāi)發(fā)應(yīng)用程序的歡迎界面實(shí)例
主界面啟動(dòng)太慢,通常要10秒以上,所以想加個(gè)歡迎界面,等程序加載好再顯示主界面。
主界面(類名為MainWindow)啟動(dòng)慢的原因是構(gòu)造函數(shù)需要執(zhí)行大量初始化的工作。
創(chuàng)建了Welcome類作為歡迎界面,開(kāi)始的思路是,在main函數(shù)中先創(chuàng)建Welcome類的對(duì)象,然后show(),對(duì)于主界面,在構(gòu)造函數(shù)將要返回時(shí)調(diào)用自己的show()方法,并且調(diào)用welcome的close()。但是歡迎界面總是只出現(xiàn)邊框,不顯示內(nèi)容,并且窗體的背景也是虛的。
原因分析:
在QT中,窗體的各種事件的分發(fā)是由QApplication來(lái)完成的,在main函數(shù)中,最后一行代碼是調(diào)用QApplication對(duì)象的exec()方法,這個(gè)方法執(zhí)行后,整個(gè)應(yīng)用程序的事件才能被分發(fā)處理,但是在main函數(shù)中,創(chuàng)建MainWindow實(shí)例的時(shí)候,總是會(huì)等待MainWindow的構(gòu)造函數(shù)執(zhí)行完,才會(huì)執(zhí)行到QApplication對(duì)象的exec()方法,所以在此之前歡迎界面的事件是不被響應(yīng)的,paintEvent()函數(shù)不會(huì)得到執(zhí)行,所以也就不會(huì)正常顯示出來(lái)了,當(dāng)MainWindow的構(gòu)造函數(shù)執(zhí)行完成,QApplication對(duì)象能夠處理事件分發(fā)時(shí),也不需要?dú)g迎界面顯示了,可以直接顯示主界面了。
只能想辦法讓MainWindow的構(gòu)造函數(shù)立即返回,初始化的工作留在后續(xù)處理。但是誰(shuí)來(lái)調(diào)用初始化的工作代碼呢,welcome類的構(gòu)造函數(shù)也不能去調(diào)用它,否則一樣會(huì)很慢才能顯示出來(lái)。我的辦法是使用QTimer定時(shí)很短一段時(shí)間,自動(dòng)觸發(fā)初始化代碼的執(zhí)行,這樣不占用構(gòu)造函數(shù)的執(zhí)行時(shí)間,讓QApplication能夠盡快工作起來(lái)。
一下是簡(jiǎn)略代碼:
main.cpp
int main(int argc, char *argv[]) { QApplication app(argc, argv); //...其他代碼 WelcomeWindow *welcome=new WelcomeWindow(); MainWindow w(welcome); return app.exec(); }
MainWindow的構(gòu)造函數(shù)
this->welcome=welcome; if(welcome != 0){ welcome->show(); timerInit=new QTimer(); timerInit->setInterval(100); timerInit->setSingleShot(true);//設(shè)置Timer只觸發(fā)一次 timerInit->start(); connect(timerInit, SIGNAL(timeout()), SLOT(init())); }else{ init(); }
MainWindow的init()函數(shù)(將原構(gòu)造函數(shù)的初始化代碼放到init()里了)
if(welcome!=0){ welcome->close(); delete welcome; this->show(); }
以上這篇QT開(kāi)發(fā)應(yīng)用程序的歡迎界面實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Qt圖形圖像開(kāi)發(fā)之曲線圖模塊QCustomplot庫(kù)生成靜態(tài)、動(dòng)態(tài)曲線詳細(xì)教程圖解
- Qt圖形圖像開(kāi)發(fā)之高性能曲線圖模塊QCustomplot庫(kù)詳細(xì)使用方法與實(shí)例(支持動(dòng)、靜曲線圖)
- Qt學(xué)習(xí)教程之對(duì)話框消失動(dòng)畫效果
- Qt學(xué)習(xí)教程之表格控件螞蟻線詳解
- Qt 使用Poppler實(shí)現(xiàn)pdf閱讀器的示例代碼
- Qt實(shí)現(xiàn)保存、瀏覽、預(yù)覽、打印功能的示例代碼
- QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時(shí)通信實(shí)例
- 在QT5中實(shí)現(xiàn)求兩個(gè)輸入值的和并輸出(實(shí)例)
- QT網(wǎng)絡(luò)編程UDP下C/S架構(gòu)廣播通信(實(shí)例講解)
- 淺談Qt中使用CEF的幾個(gè)要點(diǎn)(Windows下)
- 深入理解Qt中各種消息框?qū)υ捒虻氖褂?/a>
- Qt實(shí)現(xiàn)FTP的上傳和下載的實(shí)例代碼
- Qt如何設(shè)置窗口屏幕居中顯示以及設(shè)置大小
- Qt圖形圖像開(kāi)發(fā)之曲線圖表庫(kù)QChart編譯安裝詳細(xì)方法與使用實(shí)例
相關(guān)文章
C++利用eigen庫(kù)實(shí)現(xiàn)求歐拉角
這篇文章主要為大家詳細(xì)介紹了C++如何利用eigen庫(kù)自帶的matrix.eulerAngles()函數(shù)實(shí)現(xiàn)求歐拉角,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下2023-11-11C語(yǔ)言動(dòng)態(tài)內(nèi)存分配的詳解
這篇文章主要介紹了C語(yǔ)言動(dòng)態(tài)內(nèi)存分配的詳解的相關(guān)資料,這里提供了實(shí)現(xiàn)方法整理和出現(xiàn)錯(cuò)誤的解決辦法,需要的朋友可以參考下2017-07-07C語(yǔ)言中字符串和數(shù)字的相互轉(zhuǎn)換實(shí)現(xiàn)代碼
以下是對(duì)C語(yǔ)言中字符串和數(shù)字的相互轉(zhuǎn)換實(shí)現(xiàn)代碼進(jìn)行了分析介紹,需要的朋友可以參考下2013-07-07C語(yǔ)言算法積累加tag的循環(huán)隊(duì)列
這篇文章主要為大家介紹了C語(yǔ)言算法積累加tag的循環(huán)隊(duì)列的解題思路,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06