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

分析Qt編程習慣 主窗體創建問題

移動開發
分析Qt編程習慣 主窗體創建問題是本文介紹的內容,先來看內容。

本文介紹的是分析Qt編程習慣 主窗體創建問題,要知道,并不是只有初學者才會犯錯。最近發現了一些有意思的問題,值得memo一下。

先來看段代碼:

  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();  

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

這段代碼ms十分標準,非常符合筆者平時寫Qt程序書寫main函數的習慣, 孰料想竟然是個錯誤的習慣,而且問題很嚴重哦。 給個提示:在程序退出時會aborted。

如果還沒想出來是什么問題,嘿嘿,沒關系,看了下面的答案你就明白了。

在這段程序里QApplication實例創建在stack上,生命期是main的大括號內,而mw則通過new創建在heap上,在程序退出時才會被析構。 換句話說,mw的生存期長于application的生存期…..這可是Qt編程的大忌, 因為在Qt中所有的Paint Device都必須要在有QApplication實例的情況下創建和使用。

不過如果把這個程序寫出來運行一下,未必會出現我說的aborted的問題,大多數代碼類似的程序都能安全的運行(這也是為什么用了那么多年的Qt從來沒有注意過這個問題,并且養成了我錯誤的編程習慣。)。這里的trick在于application退出時mw已經被關閉,mw中的所有Paint Device一般都不會被訪問到了, 所以這個錯誤隱藏在很深的陰暗角落, 偷偷地嘲笑我們呢!

要想試驗這個問題也很簡單,把load的參數換成本地文件 test.html, 并把下面的內容寫進test.html就能看到拉:

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

這個html里使用了下拉選單。如果你運行程序并點開該選單,之后退出程序你就會看到Aborted錯誤提示,并打印出錯誤信息:“QWidget: Must construct a QApplication before a QPaintDevice”。

既然提出的問題,當然也要給出解決的方案。 有兩種可行的方法避免該錯誤。 一個當然是糾正一下編程習慣,對mw不要用new的方式創建,改在stack上創建,如下代碼:

  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解決此問題,想辦法讓mw在application之前clean up,那就是用WA_DeleteOnClose屬性。該屬性標示窗體會在close時被析構,這樣就保證不會留存在application析構之后了,是個很好的辦法。

代碼如下:

  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();  

發現問題和解決問題是件很有樂趣的事情,大家不要把時間都浪費在猜測上,要多動手多思考才能進步!

Qt Jambi也存在類似的問題,如果以程序啟動的代碼塊去啟動QApplication,在程序運行過程中,一些資源回收會報出Null指針錯誤,這些錯誤,通過debug,最終都會指向QWidget這個類。當把QApplication啟動的執行程序移出main函數,問題迎刃而解。要多注意細節。

小結:分析Qt編程習慣 主窗體創建問題的內容介紹完了,希望本文對你有所幫助!更多內容請參考編輯推薦。

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-06-23 15:10:39

Qt 窗體

2011-04-13 10:16:41

編程習慣

2011-03-29 12:41:49

編程

2017-09-01 11:01:22

開發編程習慣

2014-03-06 09:43:54

代碼編程習慣

2009-07-24 18:02:46

ASP.NET編程

2015-08-17 10:13:35

ios習慣高效

2011-06-20 16:38:33

Qt QWidget Qt4.5

2020-10-30 07:11:31

C 語言編程

2011-06-28 09:39:31

Qt

2011-06-22 10:12:08

Qt 線程

2020-04-22 10:35:07

編程學習技術

2015-08-20 10:50:33

iOS高效編程習慣

2009-10-14 15:34:29

VB.NET窗體編程模

2011-06-22 09:40:32

QT 模板庫 模板

2009-01-03 14:34:49

ibmdwPHP

2014-09-24 10:18:29

開發者開發習慣

2014-10-13 11:00:14

編程習慣不良開發項目

2009-01-03 10:40:41

PHP編程代碼

2015-04-23 16:28:06

開發項目編程習慣
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕中文字幕 | 久久久久久久久久久一区二区 | 国产综合久久 | 欧美日本高清 | 日本激情一区二区 | 国产午夜精品一区二区 | 国产激情视频网站 | 亚洲精品日韩在线 | h视频免费在线观看 | 精品91久久 | 精品国产乱码久久久久久老虎 | 国产精品久久久久久久久图文区 | 国产亚洲精品久久久久动 | 亚洲精品在线播放 | 日本黄色免费视频 | 日韩在线一区二区三区 | 国产精品国产三级国产aⅴ中文 | 992tv人人草 久久精品超碰 | 天天插天天狠天天透 | 国产免费一区二区 | 久久免费精品 | 亚洲精品美女在线观看 | 久久99深爱久久99精品 | 国产精品欧美一区二区三区不卡 | 欧美a级成人淫片免费看 | 国产一在线观看 | 中文字幕成人av | 中国人pornoxxx麻豆 | 三级av网址 | 免费视频二区 | 毛片网在线观看 | 激情一区 | 日韩在线观看一区二区三区 | 999热视频 | 精品国产伦一区二区三区观看说明 | 国产精品一区二区不卡 | 视频在线一区二区 | 狠狠操天天操 | 色欧美片视频在线观看 | 黄色一级大片视频 | 国际精品鲁一鲁一区二区小说 |