久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    qt學習筆記--使用qtcreator開發

     guitarhua 2011-12-16
     

    qt學習筆記--使用qtcreator開發【0831】

    分類: qt 837人閱讀 評論(5) 收藏 舉報

    寫些與Qt4相關的東西

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


     

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

     

    .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中的內容

    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可能讓人有點摸不著頭腦,這是因為qtui相關的類單獨獨立了出來,但類名相同,禁用namespace區別【但是就目前的使用來說,感覺這樣做不怎么好,后面我會解釋原因】

     

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

     

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

     

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

     

    下面來看構造函數和析構函數,其實也就是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使的布局用文件!

     

    現在運行下,會生成ui_mainwindow.h,這個里面會涉及到真正布局用的函數,也就是那個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聲明了幾個構件,具體我就不說了,因為也沒啥可說的,它實現了setupUi函式,也就是前面那個MainWindow中調用的setupUi

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

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

    最后還是看看這段代碼

    namespace Ui {

    class MainWindow: public Ui_MainWindow {};

    } // namespace Ui

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

    來張圖片,再復習下

     

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

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

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


     

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

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

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 精品人妻少妇嫩草AV无码专区 | 成年女人片免费视频播放A| 被拉到野外强要好爽| 亚洲一区二区中文字幕| 波多野结系列18部无码观看AV| 亚洲色大成网站WWW久久| 午夜性色一区二区三区不卡视频| 人妻少妇精品久久久久久| 欧美日韩中文国产一区发布| 亚洲欧美日韩综合久久久| 欧美成人一区二区三区不卡| 三上悠亚久久精品| 国产普通话对白刺激| 无码人妻斩一区二区三区| 18精品久久久无码午夜福利| 亚洲蜜臀av乱码久久| 中文字幕精品亚洲无线码二区| 免费无码又爽又刺激毛片| 国产乱子伦视频在线播放| 香蕉久久一区二区不卡无毒影院| 中文字幕av国产精品| 亚洲AV无码专区亚洲AV桃 | 亚州少妇无套内射激情视频| 国产迷姦播放在线观看| 第一亚洲中文久久精品无码| 日日摸夜夜添狠狠添欧美| 少妇肉麻粗话对白视频| 中文字幕亚洲制服在线看| 欧美人与动欧交视频| 亚洲国产美女精品久久久| 久久精品国产亚洲不AV麻豆| 日韩在线视频线观看一区| 国产精品亚洲LV粉色| 又大又长粗又爽又黄少妇毛片 | 亚洲人妻精品中文字幕| 乱子真实露脸刺激对白| 成人亚欧欧美激情在线观看| 精品国产乱码久久久久APP下载| 欧美熟妇性XXXX欧美熟人多毛| 亚洲大尺度无码专区尤物| 又爽又黄无遮拦成人网站|