一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Qt中Ui名字空間以及setupUi函數(shù)的原理和實現(xiàn)

 e3399 2012-05-28

Qt中Ui名字空間以及setupUi函數(shù)的原理和實現(xiàn)

分類: QT 642人閱讀 評論(0) 收藏 舉報

用最新的QtCreator選擇GUI的應用會產(chǎn)生含有如下文件的工程


 

下面就簡單分析下各部分的功能。

 

.pro文件是供qmake使用的文件,不是本文的重點【不過其實也很簡單的】,在此不多贅述。

所以呢,還是從main開始,

  1. #include <QtGui/QApplication>  
  2. #include "mainwindow.h"  
  3. int main(int argc, char *argv[])  
  4. {  
  5. QApplication a(argc, argv);  
  6. MainWindow w;  
  7. w.show();  
  8. return a.exec();  
  9. }  

很簡單的樣子

QApplication a(argc, argv)和a.exec()可以理解為載入了Qt的架構,跑Qt的程序都要有此部,就不多說了。

其中調用了個MainWindow并把它show了出來,具體分析下

下面是mainwindow.h中的內(nèi)容

  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3. #include <QtGui/QMainWindow>  
  4. namespace Ui  
  5. {  
  6. class MainWindow;  
  7. }  
  8. class MainWindow : public QMainWindow  
  9. {  
  10. Q_OBJECT  
  11. public:  
  12. MainWindow(QWidget *parent = 0);  
  13. ~MainWindow();  
  14. private:  
  15. Ui::MainWindow *ui;  
  16. };  
  17. #endif // MAINWINDOW_H  

開始的namespace Ui可能讓人有點摸不著頭腦,這是因為qt把ui相關的類單獨獨立了出來,但類名相同,禁用namespace區(qū)別【但是就目前的使用來說,感覺這樣做不怎么好,后面我會解釋原因】

 

聲明namespace Ui是因為要調用Ui中的MainWindow,此MainWindow非彼MainWindow,后面涉及的*ui指針會調用它!

 

關于Q_OBJECT就不說了,Qt中與signal和slot相關的類都要這么聲明下。

 

仔細看出了構造,析構就沒啥了,只有那么個*ui!不過現(xiàn)在如果運行下,也只會生成個窗體而已。

 

下面來看構造函數(shù)和析構函數(shù),其實也就是mainwindow.c

  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3. MainWindow::MainWindow(QWidget *parent)  
  4. : QMainWindow(parent), ui(new Ui::MainWindow)  
  5. {  
  6. ui->setupUi(this);  
  7. }  
  8. MainWindow::~MainWindow()  
  9. {  
  10. delete ui;  
  11. }  

構造時在堆上new了個Ui域中的MainWindow,并調用setupUi,析構僅僅是將其delete了,還是很簡單!

 

正如前面所述Qt很好的把ui分離了出去,前面圖中的那個.ui文件就是讓QtDesigner使的布局用文件!

 

現(xiàn)在運行下,會生成ui_mainwindow.h,這個里面會涉及到真正布局用的函數(shù),也就是那個Ui域中的MainWindow.下面具體看一下,

  1. #ifndef UI_MAINWINDOW_H  
  2. #define UI_MAINWINDOW_H  
  3. #include <QtCore/QVariant>  
  4. #include <QtGui/QAction>  
  5. #include <QtGui/QApplication>  
  6. #include <QtGui/QButtonGroup>  
  7. #include <QtGui/QHeaderView>  
  8. #include <QtGui/QMainWindow>  
  9. #include <QtGui/QMenuBar>  
  10. #include <QtGui/QStatusBar>  
  11. #include <QtGui/QToolBar>  
  12. #include <QtGui/QWidget>  
  13. QT_BEGIN_NAMESPACE  
  14. class Ui_MainWindow  
  15. {  
  16. public:  
  17. QMenuBar *menuBar;  
  18. QToolBar *mainToolBar;  
  19. QWidget *centralWidget;  
  20. QStatusBar *statusBar;  
  21. void setupUi(QMainWindow *MainWindow)  
  22. {  
  23. if (MainWindow->objectName().isEmpty())  
  24. MainWindow->setObjectName(QString::fromUtf8("MainWindow"));  
  25. MainWindow->resize(600, 400);  
  26. menuBar = new QMenuBar(MainWindow);  
  27. menuBar->setObjectName(QString::fromUtf8("menuBar"));  
  28. MainWindow->setMenuBar(menuBar);  
  29. mainToolBar = new QToolBar(MainWindow);  
  30. mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));  
  31. MainWindow->addToolBar(mainToolBar);  
  32. centralWidget = new QWidget(MainWindow);  
  33. centralWidget->setObjectName(QString::fromUtf8("centralWidget"));  
  34. MainWindow->setCentralWidget(centralWidget);  
  35. statusBar = new QStatusBar(MainWindow);  
  36. statusBar->setObjectName(QString::fromUtf8("statusBar"));  
  37. MainWindow->setStatusBar(statusBar);  
  38. retranslateUi(MainWindow);  
  39. QMetaObject::connectSlotsByName(MainWindow);  
  40. // setupUi  
  41. void retranslateUi(QMainWindow *MainWindow)  
  42. {  
  43. MainWindow->setWindowTitle(QApplication::translate("MainWindow""MainWindow", 0, QApplication::UnicodeUTF8));  
  44. Q_UNUSED(MainWindow);  
  45. // retranslateUi  
  46. };  
  47. namespace Ui {  
  48. class MainWindow: public Ui_MainWindow {};  
  49. // namespace Ui  
  50. QT_END_NAMESPACE  
  51. #endif // UI_MAINWINDOW_H  

吼吼,一下子多了不少,但其實還是很容易的。Ui_MainWindow聲明了幾個構件,具體我就不說了,因為也沒啥可說的,它實現(xiàn)了setupUi函式,也就是前面那個MainWindow中調用的setupUi。

但是要說明的是QMetaObject::connectSlotsByName函式會自動連接相應名稱的信號與槽,但要注意它連接的是傳入的MainWindow及其子構件【不是子類】,注意前邊ui->setupUi(this)中傳入的this,也就是非ui域中的MainWindow,所以如果要聲明signal和slot時還是要在非ui域的MainWindow中來聲明,然后通過ui->xxx的形式來與GUI產(chǎn)生交互!如果我們在QtDesiner中拖放一個按鈕然后點擊go to slot就很容易印證這一點。

retranslateUi則會為ui中的構件命名,具體也不在此多說。

最后還是看看這段代碼

  1. namespace Ui {  
  2.   
  3. class MainWindow: public Ui_MainWindow {};  
  4.   
  5. // namespace Ui  

前面非Ui域中的MainWindow的*ui指向的是Ui域中的MainWindow,而Ui域中的MainWindow出了繼承了Ui_MainWindow之外,內(nèi)部一貧如洗!【有點繞口了】

來張圖片,再復習下

 

最后要說明的有兩點,個人感覺是QtCreator的BUG,

其一是如果自己定制控件,并且想在內(nèi)置的designer中載入,win下用mingw是不可行的,因為sdk套件中的designer是用微軟的編譯器編譯的,當然也有個比較方便的解決的辦法,就是把qtcreator的源碼下來,用現(xiàn)有的creator再編譯一遍,然后覆蓋過去就行了。

其二也是前面提到的,兩個同名的MainWindow僅用Ui域來區(qū)分,雖然感覺這樣做從設計上來說是很美的,但調試時卻會有些許的問題,總之在creator中調試不能識別正確的域,具體見下圖例


 

像上面這張圖this實際上應該指向的是Ui域中的MainWindow【this其實指向的是MainWindow,它并不知是哪個域的MainWindow,再往下展開就錯誤的指向了Ui域】,但調試的數(shù)據(jù)區(qū)指向了Ui域中的MainWindow,當然也不是沒有解決的辦法,你可以手工將Ui域中的MainWindow改下名就可以獲得正確的調試信息了,只是這樣做稍顯麻煩,而且再度運行qmake后可能還要重新修改。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    麻豆最新出品国产精品| 亚洲高清中文字幕一区二区三区| 日本女优一色一伦一区二区三区 | 成人免费视频免费观看| 亚洲中文字幕综合网在线| 国产一区二区三区免费福利| 色小姐干香蕉在线综合网| 精品香蕉一区二区在线| 国产又大又猛又粗又长又爽| 欧美黑人黄色一区二区| 91亚洲精品综合久久| 香港国产三级久久精品三级| 欧美国产极品一区二区| 东京干男人都知道的天堂| 亚洲熟女熟妇乱色一区| 精品人妻少妇二区三区| 好吊日视频这里都是精品| 中文字幕一区久久综合| 在线观看中文字幕91| 91久久精品中文内射| 亚洲国产精品肉丝袜久久| 久草热视频这里只有精品| 国产精品欧美激情在线播放| 一区二区三区精品人妻| 丁香七月啪啪激情综合| 国产av大片一区二区三区| 亚洲国产精品久久琪琪| 蜜臀人妻一区二区三区| 熟女中文字幕一区二区三区| 国产成人精品视频一区二区三区| 五月婷婷六月丁香亚洲| 欧美野外在线刺激在线观看| 国产精品日本女优在线观看| 欧洲一区二区三区蜜桃| 精品亚洲香蕉久久综合网| 日本一级特黄大片国产| 91欧美日韩国产在线观看| 一区二区日本一区二区欧美| 尹人大香蕉一级片免费看| 老外那个很粗大做起来很爽| 后入美臀少妇一区二区|