自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Qt Creator 出現(xiàn)BUG 解決方法

移動開發(fā)
Qt Creator 出現(xiàn)BUG 解決方法是本文要介紹的內(nèi)容,一般在編程的過程中,總是會遇到BUG,怎么解決呢?先來本文。

 本文介紹的是Qt Creator 出現(xiàn)BUG 解決方法,在友們學(xué)習(xí)的過程中,總是會遇到BUG,為大家推薦本篇文章,先來看本文??戳藘善恼拢瑢τ?strong>Qt Creator的BUG有一定的解釋:

一、最近很多同學(xué)們反映QtCreator編譯問題一堆,這讓我很意外,因?yàn)樵诋?dāng)時(shí),我是花了一杯咖啡的時(shí)間編譯完成然后復(fù)制過去就搞定了。主要分析大家的原因,得出來這些結(jié)論:

1、不熟悉Qt程序的發(fā)布,教程沒寫到編譯好怎么辦,因此就不知道接下去該如何;

2、沒搞清楚Qt SDK和Qt lib關(guān)系,所以對于我在前面把編譯好得qwt庫文件移來移去無法理解,不知道這樣移來移去有什么用

3、編譯qt小程序不怕,但編譯QtCreato這樣的工程就不知道該怎么做了

那接下來就對以上幾個原因一一詳細(xì)說明。

首先是最重要,就是QtCreator的編譯,可以濃縮為以下步驟

1、先下載QtSDK for Windows,然后安裝

2、下載qwt,按照前面的教程編譯

3、下載QtCeator,解壓到任意的英文目錄,打開源碼目錄下的qtcreator.pro,用已有的QtCreator編譯,注意兩點(diǎn),***點(diǎn)是應(yīng)該設(shè)置為release版,第二是只需要編譯即可。

完成這幾步后就可以進(jìn)行發(fā)布,也就是把編譯完成的QtCreator替換掉原來安裝的Qt SDK里的QtCreator,如果只是簡單地復(fù)制過去,肯定缺少DLL文件的提示。簡單的解決辦法就是點(diǎn)擊exe,顯示缺失xxx.dll文件,然后從 盤符:\Qt\2009.03\qt\bin里拷貝過去,當(dāng)能正常打開時(shí),把bin目錄和share復(fù)制到 盤符:\Qt\2009.03下即可。至于環(huán)境變量,既然是傻瓜式,就不用考慮很多,原有的 盤符:\Qt\2009.03\bin目錄下有個qtenv.bat文件,把它保留下來即可。

在完成以上工作后,如果能正常啟動QtCreator,就按照前面的教程把Qwt文件拷貝過去,***就能如愿地在QtCreator設(shè)計(jì)器里看到Qwt部件的出現(xiàn)了。

相信經(jīng)過這樣講解,大家都應(yīng)該能完成qwt的集成,而最重要的是思考下,這樣做的深層次原因,明白這其實(shí)集成了Qt程序發(fā)布,Qt設(shè)計(jì)器插件的集成等知識點(diǎn),真正理解后,方能明白為什么是淺入深出,淺是指簡單地流程,深是指Qt應(yīng)該程序編譯安裝的原理。明白以后,以后再win下發(fā)布程序就變得非常清晰明了。

二、寫些與Qt4相關(guān)的東西

用***的QtCreator選擇GUI的應(yīng)用會產(chǎn)生含有如下文件的工程

Qt Creator 出現(xiàn)BUG 解決方法

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

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

所以呢,還是從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();  

很簡單的樣子

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

其中調(diào)用了個MainWindow并把它show了出來,具體分析下

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

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

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

聲明namespace Ui是因?yàn)橐{(diào)用Ui中的MainWindow,此MainWindow非彼MainWindow,后面涉及的*ui指針會調(diào)用它!

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

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

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

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

構(gòu)造時(shí)在堆上new了個Ui域中的MainWindow,并調(diào)用setupUi,析構(gòu)僅僅是將其delete了,還是很簡單!

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

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

  1. Code  
  2. #ifndef UI_MAINWINDOW_H  
  3. #define UI_MAINWINDOW_H  
  4. #include <QtCore/QVariant> 

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

吼吼,一下子多了不少,但其實(shí)還是很容易的。Ui_MainWindow聲明了幾個構(gòu)件,具體我就不說了,因?yàn)橐矝]啥可說的,它實(shí)現(xiàn)了setupUi函式,也就是前面那個MainWindow中調(diào)用的setupUi。

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

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

***還是看看這段代碼

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

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

來張圖片,再復(fù)習(xí)下

Qt Creator 出現(xiàn)BUG 解決方法

***要說明的有兩點(diǎn),個人感覺是QtCreatorBUG

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

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

Qt Creator 出現(xiàn)BUG 解決方法

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

小結(jié):關(guān)于Qt Creator 出現(xiàn)BUG 解決方法的內(nèi)容介紹完了,希望本文能幫你解決問題,對你有所幫助。

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-07-05 09:44:31

QT Mysql 亂碼

2010-09-02 11:03:48

CSS

2011-07-04 11:09:33

QT BUG

2011-06-30 16:53:18

QT Creator TableWidge

2011-06-21 17:35:11

Qt Creator 編譯

2011-09-01 13:49:07

ubuntudrcom

2011-09-06 16:04:59

Ubuntu

2013-12-12 17:08:27

Linux解決辦法

2010-06-17 11:17:34

裝系統(tǒng)出現(xiàn)Grub

2011-06-17 11:00:18

Qt Linux Ubuntu

2011-05-07 10:05:17

打印機(jī)白條解決方法

2010-01-15 10:31:19

Linux編譯

2011-06-27 09:15:21

QT Creator

2011-06-21 17:45:27

Qt Creator

2014-07-21 08:53:16

Qt Creator

2011-03-18 18:47:34

QtMySQL

2011-11-24 13:27:17

linux服務(wù)器故障排除

2013-06-14 10:48:53

IIS 7

2010-07-06 09:45:08

Sybase

2010-11-08 14:14:12

安裝SQL Serve
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號