在VS2008中使用Qt編程


一、安裝所需軟件
           1.   下載安裝VS2008;
           2.   下載qt-win-opensource-4.7.0-vs2008.exe,並安裝。這里我們假設安裝在C:\Qt4.7.0下;
           3.   下載qt-vs-addin-1.1.7.exe,並安裝。
            這三個軟件安裝好后,在VS的菜單界面上就會出現"QT"選項了。
 
 二、環境配置
         1.   用VS新建一個win32控制台應用程序,我們假設工程名為:Hello。
         2.   選擇工具->選項->項目和解決方案->VC++目錄。
               (1)  選擇“可執行文件”,在里面添加:C:\Qt4.7.0\bin;
               (2)  選擇“包含文件”,在里面添加:C:\Qt4.7.0\include;   C:\Qt4.7.0\include\Qt;   
                      C:\Qt4.7.0\include\QtCore;   C:\Qt4.7.0\include\QtGui
               (3)  選擇“庫文件”,在里面添加:C:\Qt4.7.0\lib;
 
三、開始編程 (這里舉一個簡單的例子)
         1.     選擇菜單上的“QT”選項- >“Launch Designer” ,啟動designer : 放入一個“label”,內容
                 寫為:helloQT。然后保存為Hello.ui,再將它添加到源文件中。
                 右擊“Hello.ui”->“屬性”->“自定義生成步驟”:
                             命令行:uic.exe Hello.ui -o HelloUi.h
                             輸出:HelloUi.h
                             附加依賴項:uic.exe; Hello.ui
                 然后,點擊“確定”。這時再右擊“Hello.ui”,選擇“編譯”,則會生成HelloUi.h。
                 將它添加到工程 中。
         2.   在Hello.cpp中編寫代碼如下:

 
 
 
         
  1. #include "stdafx.h"  
  2. #include "HelloUi.h"  
  3. #include <QtGui/QApplication> 
  4. #include <QtGui/QMainWindow> 
  5.  
  6. int _tmain(int argc, _TCHAR* argv[])  
  7. {  
  8.     QApplication app(argc,argv);  
  9.     QMainWindow *dlg=new QMainWindow();  
  10.     Ui::Form ui;  
  11.     ui.setupUi(dlg);  
  12.     dlg->show();  
  13.     return app.exec();  
         3.   選擇“項目”,“Hello屬性”,“配置屬性”:
               (1)  “常規”:選擇“字符集”為“使用多字節字符集”;
               (2)  “調試”:填寫“環境”值為:PATH=C:\Qt4.7.0\bin;
                              填寫“合並環境”值為:是;
               (3)  “鏈接器”:進入“常規”選項,填寫“附加庫目錄”為:C:\Qt4.7.0\lib;
                                進入“輸入”選項,填寫“附加依賴項”為:qtcore4.lib qtgui4.lib
                               (注意,這兩個庫之間為空格,不能寫逗號)
四、  信號與槽

信號與槽的使用,需要用到moc(即meta object compiler)。
    這是因為:當要在GUI中用到信號與槽,就需在.h文件中的類里寫入Q_OBJECT宏。而任何含有Q_Object的類都必須使用Qt的moc工具生成對應的cpp文件,然后在項目里面包含這個cpp,編譯才能成功,否則會出錯鏈接錯誤,如下。
    總結:
    1) Qt中的元對象系統是用來處理對象間通訊的信號/槽機制、運行時的類型信息和動態屬性系統。
    2) moc讀取C++源文件(應該是.h頭文件吧)。如果它發現其中包含一個或多個類的聲明中含有Q_OBJECT宏,它就會給含有Q_OBJECT宏的類生成另一個含有元對象代碼的C++源文件。這個生成的源文件可以被類的源文件包含(#include)到或者和這個類的實現一起編譯和連接。

    下面開始編程:
    A 編寫 main.cpp


 
 
 
         
  1. #include "stdafx.h"  
  2. #include <QtGui/QApplication>   
  3. #include "hello.h"  
  4.  
  5. int _tmain(int argc, _TCHAR* argv[])  
  6. {  
  7.     QApplication app(argc,argv);        
  8.     Widget w;  
  9.     w.show();  
  10.     return app.exec();    
  11. }

 

   B 編寫 hello.h


 
 
 
         
  1. #ifndef WIDGET_H  
  2. #define WIDGET_H  
  3. #include <QWidget>  
  4. #include <stdio.h>  
  5.  
  6. namespace Ui {  
  7.     //class Widget;  //1 把Widget換成Form (共3處)  
  8.     class Form;  
  9. }  
  10.  
  11. class Widget : public QWidget {  
  12.     Q_OBJECT  
  13. public:  
  14.     Widget(QWidget *parent = 0);  
  15.     ~Widget();  
  16.  
  17. protected:  
  18.     void changeEvent(QEvent *e);  
  19.  
  20. private:  
  21.     //Ui::Widget *ui; //2 把Widget換成Form (共3處)  
  22.     Ui::Form *ui;  
  23. public slots:  
  24.     void on_pushButton_clicked(void);  
  25.  
  26. };  
  27.  
  28. #endif // WIDGET_H 

   C 編寫 hello.cpp


 
 
 
         
  1. #include "stdafx.h"  
  2. #include "hello.h"  
  3. #include "ui_hello.h"  
  4. //#include "moc_hello.cpp"   //不是頭文件,不可以加此句  
  5.  
  6. Widget::Widget(QWidget *parent) :  
  7.     QWidget(parent),  
  8.     //ui(new Ui::Widget)  //3 把Widget換成Form (共3處)  
  9.     ui(new Ui::Form)  
  10. {  
  11.     ui->setupUi(this);  
  12. }  
  13.  
  14. Widget::~Widget()  
  15. {  
  16.     delete ui;  
  17. }  
  18.  
  19. void Widget::changeEvent(QEvent *e)  
  20. {  
  21.     QWidget::changeEvent(e);  
  22.     switch (e->type()) {  
  23.     case QEvent::LanguageChange:  
  24.         ui->retranslateUi(this);  
  25.         break;  
  26.     default:  
  27.         break;  
  28.     }  
  29. }  
  30.  
  31. void Widget::on_pushButton_clicked(void)  
  32. {  
  33.     ui->label->setText("liangbing8612.blog.51cto.com");  
  34.     printf("liangbing8612.blog.51cto.com");  

    D 制作.ui文件,並生成ui_hello.h
    打開designer,拖入一個pushButton,一個label。保存為hello.ui。然后生成ui_hello.h,並添加到項目的源文件中。

    編譯運行,則出現如下錯誤:
錯誤 1 error LNK2001: 無法解析的外部符號 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject(void)const " (?metaObject@Widget@@UBEPBUQMetaObject@@XZ)  
錯誤 2 error LNK2001: 無法解析的外部符號 "public: virtual void * __thiscall Widget::qt_metacast(char const *)" (?qt_metacast@Widget@@UAEPAXPBD@Z)  
錯誤 3 error LNK2001: 無法解析的外部符號 "public: virtual int __thiscall Widget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Widget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
錯誤 4 fatal error LNK1120: 3 個無法解析的外部命令  
    
    這是因為在源文件中沒有添加上moc_hello.cpp文件。
    解決方法:右擊hello.h,選擇“自定義生成步驟”,“常規”
    命令行:moc.exe hello.h -o moc_hello.cpp
    輸出:moc_hello.cpp
    附加依賴項:moc.exe hello.h
    確定,然后,右擊hello.h,選擇 “編譯”,則在文件夾中生成moc_hello.cpp,再將其添加到源文件中。
   
    然后,運行程序,出現錯誤:
    錯誤  fatal error C1010: 在查找預編譯頭時遇到意外的文件結尾。是否忘記了向源中添加“#include "stdafx.h"”? 
    則在moc_hello.cpp文件的開頭添加上:#include "stdafx.h"。
    然后,再運行。仍然出現上面錯誤。這是因為當運行程序,又重新生成了moc_hello.cpp文件(這個新的文件的開頭顯然是沒有#include "stdafx.h"),覆蓋了已經修改過的文件。
    解決方法:右擊hello.h,選擇“自定義生成步驟”,“常規”
    清空“命令行” “輸出” “附加依賴項” 里對應的內容。這樣在運行程序時就不會再生成新的moc_hello.cpp文件了。然后確定。
 
    這樣再次運行程序,可以成功運行。運行結果如圖。

 

trackback: http://liangbing8612.blog.51cto.com/2633208/471849 
                 http://liangbing8612.blog.51cto.com/2633208/596269


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM