成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分析Qt編程習(xí)慣 主窗體創(chuàng)建問(wèn)題

移動(dòng)開(kāi)發(fā)
分析Qt編程習(xí)慣 主窗體創(chuàng)建問(wèn)題是本文介紹的內(nèi)容,先來(lái)看內(nèi)容。

本文介紹的是分析Qt編程習(xí)慣 主窗體創(chuàng)建問(wèn)題,要知道,并不是只有初學(xué)者才會(huì)犯錯(cuò)。最近發(fā)現(xiàn)了一些有意思的問(wèn)題,值得memo一下。

先來(lái)看段代碼:

  1. #include <QApplication> 
  2. #include <QWebView> 
  3. #include <QUrl> 
  4. int main(int argc, char* argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     QWebView* mw = new QWebView;  
  8.     mw->show();  
  9.     mw->load(QUrl("http://www.cuteqt.com/blog"));  
  10.     return a.exec();  

大家看得出這段代碼中的問(wèn)題嗎?(呵呵,不要告訴我是cuteqt不能訪問(wèn)哦~)

這段代碼ms十分標(biāo)準(zhǔn),非常符合筆者平時(shí)寫Qt程序書(shū)寫main函數(shù)的習(xí)慣, 孰料想竟然是個(gè)錯(cuò)誤的習(xí)慣,而且問(wèn)題很嚴(yán)重哦。 給個(gè)提示:在程序退出時(shí)會(huì)aborted。

如果還沒(méi)想出來(lái)是什么問(wèn)題,嘿嘿,沒(méi)關(guān)系,看了下面的答案你就明白了。

在這段程序里QApplication實(shí)例創(chuàng)建在stack上,生命期是main的大括號(hào)內(nèi),而mw則通過(guò)new創(chuàng)建在heap上,在程序退出時(shí)才會(huì)被析構(gòu)。 換句話說(shuō),mw的生存期長(zhǎng)于application的生存期…..這可是Qt編程的大忌, 因?yàn)樵赒t中所有的Paint Device都必須要在有QApplication實(shí)例的情況下創(chuàng)建和使用。

不過(guò)如果把這個(gè)程序?qū)懗鰜?lái)運(yùn)行一下,未必會(huì)出現(xiàn)我說(shuō)的aborted的問(wèn)題,大多數(shù)代碼類似的程序都能安全的運(yùn)行(這也是為什么用了那么多年的Qt從來(lái)沒(méi)有注意過(guò)這個(gè)問(wèn)題,并且養(yǎng)成了我錯(cuò)誤的編程習(xí)慣。)。這里的trick在于application退出時(shí)mw已經(jīng)被關(guān)閉,mw中的所有Paint Device一般都不會(huì)被訪問(wèn)到了, 所以這個(gè)錯(cuò)誤隱藏在很深的陰暗角落, 偷偷地嘲笑我們呢!

要想試驗(yàn)這個(gè)問(wèn)題也很簡(jiǎn)單,把load的參數(shù)換成本地文件 test.html, 并把下面的內(nèi)容寫進(jìn)test.html就能看到拉:

  1. <form> 
  2. <select id="headertest"> 
  3. <option>Item1</option> 
  4. <option>Item2</option> 
  5. <option>Item3</option> 
  6. </select> 
  7. </form>  

這個(gè)html里使用了下拉選單。如果你運(yùn)行程序并點(diǎn)開(kāi)該選單,之后退出程序你就會(huì)看到Aborted錯(cuò)誤提示,并打印出錯(cuò)誤信息:“QWidget: Must construct a QApplication before a QPaintDevice”。

既然提出的問(wèn)題,當(dāng)然也要給出解決的方案。 有兩種可行的方法避免該錯(cuò)誤。 一個(gè)當(dāng)然是糾正一下編程習(xí)慣,對(duì)mw不要用new的方式創(chuàng)建,改在stack上創(chuàng)建,如下代碼:

  1. #include <QApplication> 
  2. #include <QWebView> 
  3. #include <QUrl> 
  4. int main(int arg, char* argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     QWebView mw;  
  8.     mw.show();  
  9.     mw.load(QUrl("http://www.cuteqt.com/blog"));  
  10.     return a.exec();  

另外還可以用Qt提供的API解決此問(wèn)題,想辦法讓mw在application之前clean up,那就是用WA_DeleteOnClose屬性。該屬性標(biāo)示窗體會(huì)在close時(shí)被析構(gòu),這樣就保證不會(huì)留存在application析構(gòu)之后了,是個(gè)很好的辦法。

代碼如下:

  1. #include <QApplication> 
  2. #include <QWebView> 
  3. #include <QUrl> 
  4. int main(int arg, char* argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     QWebView* mw = new QWebView;  
  8.     mw->show();  
  9.     mw->setAttribute(Qt::WA_DeleteOnClose);  
  10.     mw->load(QUrl("http://www.cuteqt.com/blog"));  
  11.     return a.exec();  

發(fā)現(xiàn)問(wèn)題和解決問(wèn)題是件很有樂(lè)趣的事情,大家不要把時(shí)間都浪費(fèi)在猜測(cè)上,要多動(dòng)手多思考才能進(jìn)步!

Qt Jambi也存在類似的問(wèn)題,如果以程序啟動(dòng)的代碼塊去啟動(dòng)QApplication,在程序運(yùn)行過(guò)程中,一些資源回收會(huì)報(bào)出Null指針錯(cuò)誤,這些錯(cuò)誤,通過(guò)debug,最終都會(huì)指向QWidget這個(gè)類。當(dāng)把QApplication啟動(dòng)的執(zhí)行程序移出main函數(shù),問(wèn)題迎刃而解。要多注意細(xì)節(jié)。

小結(jié):分析Qt編程習(xí)慣 主窗體創(chuàng)建問(wèn)題的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!更多內(nèi)容請(qǐng)參考編輯推薦。

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-23 15:10:39

Qt 窗體

2011-04-13 10:16:41

編程習(xí)慣

2011-03-29 12:41:49

編程

2009-07-24 18:02:46

ASP.NET編程

2017-09-01 11:01:22

開(kāi)發(fā)編程習(xí)慣

2014-03-06 09:43:54

代碼編程習(xí)慣

2011-06-20 16:38:33

Qt QWidget Qt4.5

2015-08-17 10:13:35

ios習(xí)慣高效

2020-10-30 07:11:31

C 語(yǔ)言編程

2011-06-28 09:39:31

Qt

2011-06-22 10:12:08

Qt 線程

2009-10-14 15:34:29

VB.NET窗體編程模

2020-04-22 10:35:07

編程學(xué)習(xí)技術(shù)

2015-08-20 10:50:33

iOS高效編程習(xí)慣

2011-06-22 09:40:32

QT 模板庫(kù) 模板

2009-01-03 10:40:41

PHP編程代碼

2015-04-23 16:28:06

開(kāi)發(fā)項(xiàng)目編程習(xí)慣

2009-10-14 15:20:21

VB.NET窗體指針

2011-06-13 16:51:19

Qt Socket

2011-06-10 12:44:09

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 青青草原精品99久久精品66 | 91精品麻豆日日躁夜夜躁 | 国产精品1区2区 | 久久久精品网 | 久久精品国产亚洲一区二区 | 在线国产视频观看 | 日韩电影中文字幕 | 久久伦理中文字幕 | 日韩在线大片 | 精品久久九 | 国产91视频免费 | 亚洲精品v | 精品一区精品二区 | 欧美一区二区免费 | 2019中文字幕视频 | 一级毛片在线播放 | 日韩免费看视频 | 国产日韩欧美一区二区 | 日韩精品 | 韩三级在线观看 | 亚洲精品三级 | 精品欧美乱码久久久久久 | 国产精品久久久久久久久久 | 欧美色成人 | 亚洲一区二区中文字幕在线观看 | 久久成人免费视频 | 欧美在线一区二区三区四区 | 日本高清不卡视频 | 成年网站在线观看 | 日韩一区二区三区在线播放 | 一区二区三区国产精品 | 欧美最猛黑人 | 免费黄色片在线观看 | 999观看免费高清www | 国产精品黄色 | 欧美专区在线 | 最新午夜综合福利视频 | 国产一区二区观看 | 日韩中文在线视频 | 久草99 | 国产精品久久久久久久久久久久久久 |