Qt學習之路4--簡單計算器介面開發
在之前的學習中我們學習了標籤元件和按鈕元件,標籤用來顯示一個字串,帶有提示性作用,在使用它時需要將標籤物件和父元件繫結在一起;按鈕元件也是一個功能性元件,需要父元件作為容器,它的的作用就是當你按下這個按鈕時會觸發某個操作,和標籤元件一樣,它們都能在父元件中定位。
在今天的開發中需要用到另一種元件,就是QLineEdit文字框,它用來接收使用者的輸入、獲取字串並顯示出來,和QLabel、QPushButton一樣,文字框QLineEdit也是功能性元件,需要父元件作為容器並能夠在父元件上定位。
Qwidget w;//定義父元件
QlineEdit edit(&w);//關聯容器
edit .setAlignment(Qt::AlignRight);//設定資料顯示的對齊方式
edit.move(10, 10);//在父元件中定位
edit.resize(200, 30);//文字框寬200,高30
學習了文字框元件後今天的主題就來了,通過構建一個簡單的計算器介面來鞏固學習的各種元件。其最終成型後的樣子如下圖:
看起來也不復雜,QWidget物件作為整個介面的父元件,裡面包含一個QLineEdit文字框和20個顯示著不同內容的QPushButton按鈕,所有功能元件之間依靠座標系統進行絕對定位。
在正式程式設計之前需要將介面的元件元素的尺寸和元件之間的間隔設計出來。如下圖:
接下來就是實戰了,在介面中我們需要一個QLineEdit物件和20個按鈕物件,並且每個按鈕的顯示內容也不同,為了避免大量重複的定義按鈕物件和設定顯示文字,我們申請兩個指標陣列,QPushButton* button[0]用來儲存按鈕物件,const char* btnText[20]用來儲存顯示到按鈕上的字串。並通過兩層for迴圈將它們定位。
程式碼內容
QWidget* w = new QWidget(NULL, Qt::WindowCloseButtonHint);//其中計算器程式介面不需要最大化和最小化按鈕
QLineEdit* le = new QLineEdit(w);
QPushButton* button[20] = {0};
const char* btnText[20] =//按照介面順序賦值
{
"7", "8", "9", "+", "(",
"4", "5", "6", "-", ")",
"1", "2", "3", "*" , "<-",
"0", ".", "=", "/", "C",
};
le->move(10, 10);
le->resize(240, 30);
le->setReadOnly(true);//文字框不能進行編輯
for(int i=0; i<4; i++)
{
for(int j=0; j<5; j++)
{
button[i*5 + j] = new QPushButton(w);
button[i*5 + j]->resize(40, 40);
button[i*5 + j]->move(10 + (10 + 40)*j, 50 + (10 + 40)*i);//通過之前的設計進行計算位置
button[i*5 + j]->setText(btnText[i*5 + j]);//設定顯示的內容
}
}
w->show();
w->setFixedSize(w->width(), w->height());//固定QWidget視窗大小
}
分析
程式碼片段主要就是一個兩層for迴圈,在迴圈中對每行每列的按鈕進行建立和定位,這依賴於之前對介面的設計。
有人會說在程式裡的一些細節處理所需要的函式是怎麼知道的,其實就是善於利用幫助文件,通過文件可以檢視某個類的所有成員和函式,及它們的功能。
介面程式碼已經已完成了,那麼在windows上跑起來會是個什麼樣子呢?
由於是在windows上進行編譯的,所以它會採用windows的介面風格。
由於Qt是跨平臺的,那麼在不同系統下對同一個Qt程式進行編譯後呈現出來的介面風格就和當前作業系統的風格一致。
再提一個問題,大家有發現程式碼中有new關鍵字卻沒有delete嗎?這是為什麼,既然提到了就肯定不會是忘記了,那是什麼情況呢?
提前告訴大家,這是因為Qt物件採用物件樹的方式管理應用程式中的Qt物件,簡單來說就是Qt存在某種機制使得我們申請的動態資源在不主動釋放的情況下不會導致記憶體洩漏!!!這種機制就是物件樹具體細節我們後面再討論。