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

詳解QT源碼之QT創(chuàng)建窗口程序、消息循環(huán)和WinMain函數

移動開發(fā)
本文介紹的是QT源碼之QT創(chuàng)建窗口程序、消息循環(huán)和WinMain函數的內容,先來看內容!

QT源碼之QT創(chuàng)建窗口程序、消息循環(huán)和WinMain函數是本文要介紹對內容,使用QT也有一段時間了,有的時候需要跟蹤代碼到QT源碼中去查找問題。在這里我將記錄一下我跟蹤QT源碼學習到的一些知識。

我的開發(fā)環(huán)境是VC6.0+QT4.3.3。QT已經不為VC6.0提供addin了,所以有的時候我也會使用EclipseCDT來編寫代碼,因為有了QT for Eclipse的plugin寫代碼會方便一些。

我們在學習QT的時候,接觸的***個程序就是下面的helloworld程序:

  1. view plaincopy to clipboardprint?  
  2. #include <QApplication>     
  3. #include <QPushButton>     
  4.     
  5. int main(int argc, char *argv[])     
  6. {     
  7.     QApplication app(argc, argv);        
  8.     QPushButton hello("Hello world!");     
  9.     hello.resize(100, 30);       
  10.     hello.show();     
  11.     return app.exec();     
  12. }    
  13. #include <QApplication> 
  14. #include <QPushButton> 
  15.  
  16. int main(int argc, char *argv[])  
  17. {  
  18.     QApplication app(argc, argv);   
  19.     QPushButton hello("Hello world!");  
  20.     hello.resize(100, 30);   
  21.     hello.show();  
  22.     return app.exec();  
  23. }  

這個程序的作用很多手冊和文檔都已經講了,講的也都很細致,非常不錯。

但是喜歡鉆研,深入的童鞋也許開始注意了int main(int argc, char *argv[]),這個main函數是標準的main函數,而windows應用程序的入口是winmain函數,而main函數是命令行程序的入口。win下窗口程序都有RegisterClass,和消息循環(huán),QT是如何RegisterClass和創(chuàng)建消息循環(huán)的?

下面我們將來一起學習一下QT的源碼來解釋一下這個main函數和整個窗口程序的創(chuàng)建過程:

設置好路徑后,我們先F10一下,看看這個程序到底是從哪里開始運行的。

程序跳到了\winmain\qtmain_win.cpp文件的WinMain函數中,再看這個文件上面的宏定義:#define main qMain

繼續(xù)看:在WinMain函數中調用了我們自己定義的main函數:int result = main(argc, argv.data());

哇塞,原來如此啊。原來我們寫的main函數是假的。哈哈。

再來看一下QT是如何創(chuàng)建窗體和消息循環(huán)的。

首先我們來到QApplication的構造函數:

  1. QApplication::QApplication(int &argc, char **argv, int _internal)  
  2.     : QCoreApplication(*new QApplicationPrivate(argc, argv, GuiClient))  
  3. { Q_D(QApplication); d->construct(); QApplicationPrivate::app_compile_version = _internal;} 

很明顯,首先調用的是QApplicationPrivate的構造函數。大家注意第三個參數:QApplication::Type type

這事Type類型的定義:enum Type { Tty, GuiClient, GuiServer };

下面是代碼注釋中對Type類型的解釋:

  1. \enum QApplication::Type  
  2.  
  3. \value Tty a console application  
  4. \value GuiClient a GUI client application  
  5. \value GuiServer a GUI server application (for Qt for Embedded Linux) 

當程序運行到hello.show()的時候調用了QWidgetPrivate::create_sys函數。

在這里我們看到調用了類似RegisterClass的函數:QString windowClassName = qt_reg_winclass(q);

這里的q是指向QWidget的指針(我們先忽略掉這里)。

以及包括后面的CreateWindow,ShowWindow等等我們熟悉的WindowsAPI函數

const QString qt_reg_winclass(QWidget *w) 函數的原型是在qapplication_win.cpp中定義的。我們轉到qt_reg_winclass函數的實現中。我們就看到了windows的API函數RegisterClass和窗口消息處理函數:wc.lpfnWndProc        = (WNDPROC)QtWndProc;

我們看一下QtWndProc的實現,原來窗口消息都是在這里進行處理的啊!

至于***一句app.exec(); 調用了QCoreApplication的Exec函數,在這個函數中我們看到了下面創(chuàng)建消息循環(huán)的代碼

  1. QEventLoop eventLoop;  
  2. self->d_func()->in_exec = true;  
  3. int returnCode = eventLoop.exec(); 

在QCoreApplication.cpp中的注釋是這樣解釋的:

  1. The application will enter  
  2. the event loop when exec() is called. exit() will not return  
  3. until the event loop exits, e.g., when quit() is called. 

到這里,main和WinMain函數到底是怎么回事,以及QT是怎么創(chuàng)建窗口消息循環(huán)的,我們已經非常清楚了。

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

2011-06-23 15:32:05

Qt Windows消息

2011-06-23 14:05:32

Qt 事件機制

2011-06-23 15:10:39

Qt 窗體

2011-06-23 13:38:27

QT 元對象 信號

2011-06-23 11:16:39

Qt Excel

2011-06-28 16:18:24

Qt QObject

2011-06-28 13:12:07

Qt 調用 DLL DLL

2011-07-01 13:03:32

QT 線程 串口

2011-04-02 09:17:38

2011-06-23 14:27:48

QT QLibrary 動態(tài)庫

2011-06-30 09:46:01

QT 顯示視頻 linux

2011-06-10 11:05:05

Qt Quick QML

2011-06-23 14:40:13

Qt 信號

2011-06-24 17:38:09

Qt 坐標 事件

2011-06-28 13:38:15

Arm linux QT

2011-06-24 10:05:51

QT 對象 父對象

2011-06-30 10:50:39

Qt OpenCV

2011-06-15 14:38:01

QT 信號

2011-07-05 18:51:51

QT 控件 鼠標

2011-06-29 14:23:08

Qt 串口
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区视频 | 久久久做 | 超碰伊人久久 | 99精品视频在线观看 | 亚洲精品国产一区 | 亚洲黄色在线免费观看 | 天堂影院av | 51ⅴ精品国产91久久久久久 | 久久亚洲国产精品 | 又黄又色 | 国精日本亚洲欧州国产中文久久 | 亚洲午夜三级 | 日韩精品久久久久久 | 天天干.com| 成人av高清 | 中文字幕精品一区二区三区精品 | 一区二区三区四区免费在线观看 | 99久久久久久 | 久久精品欧美一区二区三区不卡 | 久久一| h视频免费在线观看 | 免费色网址 | 狠狠涩 | 精品国产黄色片 | 亚洲精品国产精品国自产在线 | 麻豆一区一区三区四区 | 81精品国产乱码久久久久久 | 亚洲精品国产一区 | 成人国产一区二区三区精品麻豆 | 欧美黑人国产人伦爽爽爽 | 全免费a级毛片免费看视频免 | 国产精品第2页 | 日本不卡免费新一二三区 | 久久久91| 国产日韩欧美一区二区在线播放 | 国产伦精品一区二区三区精品视频 | 91精品国产综合久久福利软件 | 午夜a区| 欧美日韩成人在线观看 | 日韩av免费在线电影 | 一区二区久久 |