QT從console程式到到視窗程式之實踐
我們都知道,在QT中基於Qobject的視窗有兩類,QWidget和QWindow,當然,這兩類下又有QDialog,QWidget,QMainWindow,QSplashScreen,QMidSubWindow,QDesktopWidget五個類。
這裡,我們來看看QMainWindow。
為探究console與視窗程式的不同,我們從一個console程式開始,通過比較異同來逐漸實現視窗程式。
首先我們建立一個console程式,看其中的程式碼:
#include <QCoreApplication> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); return a.exec(); }
我們發現這裡沒有任何Widget的痕跡,而建立一個正常的視窗程式,至少會有Form或者Dialog或者Window的字眼和類出現。
這裡我們來修改一下,為console程式增加一個Form:
按照預設的引數,直接下一步
新增完成,我們程式碼進行修改,增加剛才的form類的標頭檔案,並且宣告變數例項顯示出來:
#include <QCoreApplication> #include <form.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Form frm frm.show(); return a.exec(); }
編譯時第一個錯誤來了: error: QWidget: No such file or directory
出現這個錯誤,主要是無法找到Widget相關的庫文及其路徑配置,所以我們在Pro檔案中,修改QT-=gui,為QT+=widgets即可解決:
同時,在form的標頭檔案中增加標頭檔案集合QtWidgets
此時編譯,我們會遇到第二個錯誤,說Cannot create a QWidget without QApplication
這個時候,錯誤很明顯,很容易解決,那就是說我們的Form沒有QAPPlication的支援是不能執行的。在main檔案中修改標頭檔案集或者增加#include ,同時將main函式中的QCoreApplication修改為QApplication再次執行則不會出錯了,程式碼如下:
//#include <QCoreApplication>
#include <QApplication>
#include <form.h>
int main(int argc, char *argv[])
{
// QCoreApplication a(argc, argv);
QApplication a(argc, argv);
Form frm;
frm.show();
return a.exec();
}
雖然沒有錯誤了,但會有一個遺憾,那就是不在執行的時候先會顯示一個黑框,也就是後臺程式的執行環境。如何去掉它呢,將Pro檔案中的兩行config登出掉即可:
如此,我們可以得到正確的執行結果了,如下圖:
細心的夥伴會發現,這個時候,我們的視窗標題是form,而不是我們主程式的標題Untitle2,那麼如何恢復主程式的標題呢?這裡就要用到QMainWindow了,我們都知道QMainWindow的作用就是提供一個視窗顯示的框架(包括選單欄,標題欄,狀態列,工具欄,否則就無法成為一個比較完備的程式介面)。在主函式中增加如下程式碼:
#include <QApplication>
#include <form.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Form *frm=new Form();
QMainWindow window;
window.setCentralWidget(frm);
window.resize(frm->width(), frm->height()); //確保主框架能夠全面匹配from的大小
window.show();
return a.exec();
}
這樣,我們看到,程式的標題就是untitled2了,執行結果如下:
總結提煉:
本文通過改裝的方式實踐了一次窗體程式的實現。從而理清了QApplication與窗體之間的關係。沒有它窗體程式就不能執行。為何會這樣呢?我們來看看QApplication它的淵源即刻明白。
1、QApplication、QGuiApplication、QCoreApplication三者之間的關係:
QCoreApplication用於non-GUI的應用程式(不需要依賴QtGui庫),QApplication用於包 含GUI的應用程式(需要用到QtGui庫)。
QApplication繼承了QGuiApplication類,而QGuiApplication繼承了QCoreApplication類, 而QCoreApplication又繼承QObject的,而QObject就是QT中最基本的基類,也就是QT的根基。
2、QApplication的作用:
QApplication 類管理GUI程式的控制流和主設定。QApplication 包含主事件迴圈,所有來自視窗系統和其他源的事件將被處理和分配。它也處理程式的初始化,析構和提供會話管理。對於非GUI的用QCoreApplication 代替QApplication,它不依賴QtGui庫。qApp是一個全域性的指標,指向QApplication的物件。
相比VC而言,在QT中將一個console程式改裝為窗體程式更容易吧!
希望對小夥伴們有所幫助!