
當建立 QGridLayout 排版物件 (object) 後,利用 addWidget() 方法加入小工具物件時,第一個參數 (parameter) 為小工具物件,其後兩個參數為小工具在視窗中的座標,若需要佔用多個格子,例如向右延伸多格,就得提供更多的參數。
我們設置一個 GUIDemo 專案,標頭檔 GUIDemo.h 如下
#ifndef GUIDEMO_H
#define GUIDEMO_H
#include <QWidget>
class QLabel;
class QLineEdit;
class QPushButton;
class GUIDemo : public QWidget {
Q_OBJECT
public:
GUIDemo(QWidget *parent = 0);
private:
QLabel *display;
QLineEdit *inputField;
QLineEdit *outputField;
QPushButton *newButton;
QPushButton *loadButton;
QPushButton *saveButton;
QPushButton *encodeButton;
QPushButton *decodeButton;
QPushButton *clearButton;
QPushButton *copyButton;
};
#endif
/* 《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名:GUIDemo.h
功能:示範 C++ 程式
作者:張凱慶
時間:西元 2012 年 10 月 */這裡把十個小工具設計成 GUIDemo 的變數成員 (variable member) ,這是因為這些小工具會與使用者的鍵盤輸入或滑鼠點擊產生反應。其他還有兩個 QLabel ,也就是放在 inputField 與 outputField 之前 Input: 與 Output: ,因為與使用者操作無關,所以我們在建構子 (constructor) 中再建立就可以了。
實作檔 GUIDemo.cpp 如下
#include <QtGui>
#include "GUIDemo.h"
GUIDemo::GUIDemo(QWidget *parent) : QWidget(parent) {
QLabel *input = new QLabel(tr("Input:"));
QLabel *output = new QLabel(tr("Output:"));
display = new QLabel(tr("something happened"));
inputField = new QLineEdit;
outputField = new QLineEdit;
outputField->setReadOnly(true);
newButton = new QPushButton(tr("New"));
loadButton = new QPushButton(tr("Load"));
saveButton = new QPushButton(tr("Save"));
encodeButton = new QPushButton(tr("Encode"));
decodeButton = new QPushButton(tr("Decode"));
clearButton = new QPushButton(tr("Clear"));
copyButton = new QPushButton(tr("Copy"));
QGridLayout *layout = new QGridLayout;
layout->addWidget(input, 0, 0);
layout->addWidget(inputField, 0, 1, 1, 6, 0);
layout->addWidget(output, 1, 0);
layout->addWidget(outputField, 1, 1, 1, 6, 0);
layout->addWidget(newButton, 2, 0);
layout->addWidget(loadButton, 2, 1);
layout->addWidget(saveButton, 2, 2);
layout->addWidget(encodeButton, 2, 3);
layout->addWidget(decodeButton, 2, 4);
layout->addWidget(clearButton, 2, 5);
layout->addWidget(copyButton, 2, 6);
layout->addWidget(display, 3, 0, 1, 7, 0);
setLayout(layout);
setWindowTitle(tr("GUIDemo"));
}
/* 《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名:GUIDemo.cpp
功能:示範 C++ 程式
作者:張凱慶
時間:西元 2012 年 10 月 */我們先看到第 11 行
outputField->setReadOnly(true);
由於我們不想要使用者在 outputField 輸入任何資料,因此建立完 outputField 呼叫 setReadOnly() ,將其設定成唯讀狀態。
然後看到 addWidget() 的部份,左上角第一格座標為 (0, 0) ,也就是第一橫列第一直行的位置,而第一橫列第一直行的座標為 (0, 1) ,第二橫列第一直行的座標為 (1, 0) ,第二橫列第二直行的座標為 (1, 1) ,餘下可類推
layout->addWidget(input, 0, 0);
layout->addWidget(inputField, 0, 1, 1, 6);
layout->addWidget(output, 1, 0);
layout->addWidget(outputField, 1, 1, 1, 6);
layout->addWidget(newButton, 2, 0);
layout->addWidget(loadButton, 2, 1);
layout->addWidget(saveButton, 2, 2);
layout->addWidget(encodeButton, 2, 3);
layout->addWidget(decodeButton, 2, 4);
layout->addWidget(clearButton, 2, 5);
layout->addWidget(copyButton, 2, 6);
layout->addWidget(display, 3, 0, 1, 7);當格數需要跨越多行時,就需要額外提供三個參數,例如 display 在第四橫列第一直行,因此第二個參數為 3 ,第三個參數為 0 ,第四個參數為垂直延伸格數,此處為 1 ,第五個參數為水平延伸格數,此處為 7
layout->addWidget(display, 3, 0, 1, 7);
概念很簡單吧! GUIDemo 專案的 main.cpp 如下
#include <QtGui>
#include "GUIDemo.h"
int main(int argv, char **args)
{
QApplication app(argv, args);
GUIDemo demo;
demo.show();
return app.exec();
}
/* 《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名:main.cpp
功能:示範 C++ 程式
作者:張凱慶
時間:西元 2012 年 10 月 */編譯執行結果如下

好了, GUI 的外觀做出來了,可是按鈕還是沒反應呀!這是因為我們還沒設定 SIGNAL 與 SLOT 。
| 中英文術語對照 | |
|---|---|
| 格子 | grid |
| 小工具 | widget |
| 物件 | object |
| 參數 | parameter |
| 變數成員 | variable member |
| 建構子 | constructor |
您可以繼續參考
GUI 篇
相關目錄
回 C++ 入門指南
回 C++ 教材目錄
回首頁
參考資料
Qt Developer Network
Layout Management
沒有留言:
張貼留言