## 7.4 常見內建(built in)對話框的使用
內建對話框又被稱為是標準對話框。Qt 提供了一整套內置的窗口部件和常用對話框, 如文件選擇、字體選擇、顏色選擇、消息提示對話框等,它們為應用程序提供了與本地平臺 一致的觀感,可以滿足大多數情況下的使用需求。Qt 對這些標準對話框都定義了相應的 類,使用者可以很方便的使用它們。標準對話框在軟件設計過程中使經常需要使用的,必須 熟練掌握。
下面我們首先介紹 QInputDialog 、QColorDialog、QFontDialog、、QMessageBox 這 幾種標準對話框的使用要領,然后再通過一個實例做示范。
### 7.4.1 標準輸入框(QInputDialog)
本小節講解如何使用標準輸入框。在 Qt 中,構建標準輸入框通常使用 QinputDialog 類。QInputDialog 類提供了一種簡單方便的對話框來獲得用戶的單個輸入信息。目前 Qt 提 供了 4 種數據類型的輸入,可以是一個字符串、一個 int 類型數據、一個 double 類型數據 或者是一個下拉列表框的條目。此外,一般情況下在輸入框的附近應該放置一個標簽窗口部 件,告訴用戶需要輸入什么樣的值。一個標準輸入框的樣子如圖 7-18 所示。
經常使用的方法有 4 個:getText(),getInt(), getDouble()和 getItem(),它們都 是 QInputDialog 類的靜態方法,使用起來也非常簡便,請看下面的示例代碼。
```
bool ok;
QString text = QInputDialog::getText(this, tr("User Name"),
tr("Please input new name"), QLineEdit::Normal,
QDir::home().dirName(), &ok);
if (ok && !text.isEmpty())
{
textLabel->setText(text);
}
```
這段代碼將彈出一個對話框請用戶輸入 "User name"的值,如圖 7-18 所示。如果用戶按下 OK 按鈕,則 ok 的值將為 true,反之將為 false。

圖 7-18 標準輸入框
### 7.4.2 標準顏色對話框(QColorDialog)
標準顏色選擇對話框被用來為應用程序指定顏色。比如,在一個繪圖應用程序中選擇 畫刷的顏色等。一個典型的標準顏色對話框如圖 7-19 所示。

圖 7-19 典型的標準顏色對話框
我們經常使用 QColorDialog 類的靜態方法 getColor()來創建標準顏色選擇對話框。在 其中除了為用戶提供了顏色選擇面板外,還可以允許用戶選擇不同的透明度的顏色。
在使用 QColorDialog 類之前,需要引入其頭文件聲明。
```
#include <QColorDialog>
```
getColor()方法有兩種原型,第一種如下:
```
QColor QColorDialog::getColor ( const QColor & initial, QWidget * parent,
const QString & title,ColorDialogOptions options = 0 ) [static]
```
該方法以 parent 為父窗體,以 initial 為默認顏色,以 title 為窗口標題(如果不指 定的話,將顯示為"Select Color")創建一個模態的顏色對話框,允許用戶選擇一個字體,并將其返回。如果用戶點擊了【Cancel】按鈕,則返回一個非正常值。這可以通過 bool QColor::isValid () const 方法來校驗,如果字體正常則返回值為 ture;反之則返回 false。
另外,通過配置不同的 options 參數能夠對顏色對話框的觀感進行定制。 options 的取 值來自枚舉值 QColorDialog::ColorDialogOption,它也是 Qt4.5 以后引入的,其含義如表 7-2 所示。
表 7-2 枚舉值 QColorDialog::ColorDialogOption 的含義
| 常量 | 值 | 說明 |
| --- | --- | --- |
| QColorDialog::ShowAlphaChannel | 0x00000001 | 允許用戶選擇顏色的 alpha 值 |
| QColorDialog::NoButtons | 0x00000002 | 不顯示 OK 和 Cancel 按鈕 |
| QColorDialog::DontUseNativeDialog | 0x00000004 | 使用 Qt 的標準顏色對話框。比如在 Mac OS X 系統中不使用 Apple 的原 生顏色面板 |
實際中最為常用的是下面這種,它是第一種原型的重載版本。
```
QColor QColorDialog::getColor ( const QColor & initial =
Qt::white, QWidget * parent = 0 ) [static]
```
一個創建標準顏色對話框的示例代碼如下:
```
QColor color = QColorDialog::getColor(Qt::green, this);
if(color.isValid())
{
colorLabel->setText(color.name());
colorLabel->setPalette(QPalette(color));
colorLabel->setAutoFillBackground(true);
}
```
第 1 句創建標準顏色選擇對話框。
第 2 句判斷顏色是否有效。
第 3 句設置 colorLabel 顯示的文本是用戶從標準顏色對話框中選擇的顏色的名字。
第 4 句通過 setPalette()方法設置 colorLabel 的調色板信息。setPalette()方法經常用于此 種場合。
第 5 句也很重要,setAutoFillBackground()方法用于設置窗體能夠自動填充背景。
### 7.4.3 標準字體對話框(QFontDialog)
標準字體對話框為用戶選擇字體提供了便捷的途徑。 其常見的情形如圖 7-20 所示。

圖 7-20 標準字體對話框
通常有兩種方式創建字體對話框,一種是使用 QFontDialog 類的構造函數,一種是使用 QFontDialog 類的靜態方法 getFont()。在使用 QFontDialog 類之前,應加入其頭文件聲明:
```
#include <QFontDialog>
```
1\.構造函數第一種原型
```
QFontDialog::QFontDialog ( QWidget * parent = 0 )
```
它將創建一個標準的字體對話框。其中 parent 參數默認即是上下文環境中的父窗口。
這之后可以使用 setCurrentFont()方法來指定初始的字體。該方法是 Qt4.5 以后引進的,一個 示例代碼如下:
```
QFontDialog fontDlg;
fontDlg.setCurrentFont( QFont(“Times”,12) );
```
2\.構造函數第二種原型
```
QFontDialog::QFontDialog ( const QFont & initial, QWidget * parent = 0 )
```
它將使用 parent 作為父窗體,使用 initial 作為默認選擇的字體來創建一個標準的字體對話框。該方法是 Qt4.5 以后引進的。一個示例代碼如下:
```
QFontDialog fontDlg(QFont(“Times”,12),this);
```
3\.使用靜態方法 getFont()
它有 6 種原型,最為常用的是
```
QFont QFontDialog::getFont ( bool * ok, const QFont & initial, QWidget * parent,
const QString & title,FontDialogOptions options ) [static]
```
它創建一個模態的字體選擇框,并把用戶選擇的字體作為返回值。
如果用戶點擊了【OK】按鈕,被用戶選擇的字體就會被返回。如果用戶按下了【Cancel】按鈕,那么 initial 將被返回。
它的各個參數的含義是這樣的,parent 指定了字體對話框的父窗口,title 是該字體對話 框的標題欄顯示的內容,initial 是對話框建立時初始選擇的字體。如果 ok 是非空的,當用 戶選擇了【OK】按鈕時,它將被置為 true,當用戶選擇了【Cancel】按鈕時,它將被置為 false。一個示例代碼如下:
```
bool ok;
QFont font = QFontDialog::getFont(&ok, QFont("Times", 12), this);
if (ok)
{
// font is set to the font the user selected
}
else
{
// the user canceled the dialog; font is set to the initial
// value, in this case Times, 12.
}
```
這段代碼調用 getFont()方法時,對 title 和 options 參數使用了默認值。
也可以使用下面示例的代碼直接在某個窗口部件內部使用字體對話框。當用戶按下【OK】按鈕時,被選中的字體將被使用,當用戶按下 【Cancel】按鈕時,將仍然使用原來 的字體。
```
myWidget.setFont(QFontDialog::getFont(0, myWidget.font()));
```
小貼士:在字體對話框運行期間,不要刪除 parent 指定的父窗口。如果你想這么做的話,就不要使用 getFont()方法來創建字體對話框,而是使用它的構造函數來實現。
下面一種原型也會經常用到,它同樣也是 QFontDialog 類的靜態方法:
```
QFont QFontDialog::getFont ( bool * ok, QWidget * parent = 0 ) [static]
```
它以 parent 為父窗體創建一個模態的字體對話框,并且返回一個字體。如果用戶點擊了【OK】按鈕,則被選中的字體將被返回,并且 ok 參數將被置成 true;如果用戶點擊了【Cancel】按鈕,則 Qt 默認字體將被返回,ok 參數將被置成 false。
一個創建標準字體對話框的示例代碼如下:
```
bool ok;
QFont font = QFontDialog::getFont(&ok, this);
if (ok)
{
// font is set to the font the user selected
}
else
{
// the user canceled the dialog; font is set to the default
// application font, QApplication::font()
}
```
這里同樣注意,在使用該方法創建的字體對話框運行期間,不要刪除其父窗體。
### 7.4.4 標準消息對話框(QMessageBox)
在程序開發中,經常會遇到各種各樣的消息框來給用戶一些提示或提醒, Qt 提供了 QMessageBox 類來實現此項功能。在使用 QMessageBox 類之前,應加入其頭文件聲明:
```
#include <QMessageBox>
```
Question 消息框、Information 消息框、Warning 消息框和 Critical 消息框的用法大同小異,這些消息框一般都包含一條提示信息、一個圖標以及若干個按鈕,它們的作用都是給用 戶提供一些提醒或一些簡單的詢問。按圖標的不同可以區分為表 7-3 所示的 4 個級別。

表 7-3 預定義圖標的含義
通常有兩種方法可以用來創建標準消息對話框。一種是采用 “基于屬性的”API,一種是 使用 QMessageBox 的靜態方法。這兩種方法各有所長,使用靜態方法是比較 容易的,但是缺乏靈活性,并且針對用戶給出的提示信息不夠豐富 ,并且不能自定義消息對話框里面的按鈕提示信息。因此,“基于屬性的”API 的方法更值得推薦。
1\. 基于屬性的 API 方法 這種方法的要領如下。
第 1 步,創建一個 QMessageBox 的實例
第 2 步,設置必要的屬性信息,通常只需設置 message text 屬性即可。 第 3 步,調用 exec()方法顯示這個消息框。
下面是一段示例代碼。
```
QMessageBox msgBox;
msgBox.setText(tr("The document has been modified."));
msgBox.exec();
```

圖 7-21 顯示一個提示框
這將創建一個提示框,如圖 7-21 所示。上面只有一個 OK 按鈕,用戶必須點擊它才能 使該對話框消失,從而結束對話,并且消除模態對話框對交互的阻塞。
2\. 使用 QMessageBox 類的靜態方法 這種方法使用起來比較簡單,一句程序就可以實現,下面 這段示例代碼是從下一節中的例子里面來的:
```
QMessageBox::StandardButton reply;
reply = QMessageBox::critical(this, tr("QMessageBox::critical()"),
MESSAGE,
QMessageBox::Abort | QMessageBox::Retry | QMessageBox::Ignore);
if (reply == QMessageBox::Abort)
{
criticalLabel->setText(tr("Abort"));
}
else if (reply == QMessageBox::Retry)
{
criticalLabel->setText(tr("Retry"));
}
else
{
criticalLabel->setText(tr("Ignore"));
}
```
第 1 句聲明一個 QMessageBox::StandardButton 類型變量, QMessageBox::StandardButton 是一個枚舉量,它包含了 QMessageBox 類默認提供的按 鈕提示信息,如 OK、Help、Yes、No、Abort、Retry、Ignore 等。
第 2 句調用 QMessageBox 的靜態方法 QMessageBox::critical()創建一個 critical 類型 的消息對話框,上面一些提示信息和三個按鈕,其效果如圖 7-22 所示。

圖 7-22 使用靜態方法創建標準消息對話框
第 3-8 句則是根據用戶選擇的按鈕不同而把返回值賦給對應的標簽部件的文本顯示。
### 7.4.5 實例:標準對話框的使用
下面以一個實例來說明上面這些內置對話框的使用方式和它們之間的區別。本實例主要包含了 7 種類型的消息框,包括 Question 消息框、Information 消息框、Warning 消息框、Critical 消息框、About 消息框、About Qt(關于 Qt)消息框以及 Custom(自定義) 消息框。當用戶點擊各個按鈕時,將創建對應的標準對話框,程序的運行效果如圖 7-23 所 示。

圖 7-23 綜合實例運行效果
我們先來看一下 Dialog 類的頭文件。
```
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
class QLabel;
class QGroupBox;
class QErrorMessage;
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
private slots:
void getAge();
void getStature();
void getSex();
void getName();
void getColor();
void getFont();
void getCriticalMessage();
void getInformationMessage();
void getQuestionMessage();
void getWarningMessage();
void getErrorMessage();
void getAboutMessage();
void getAboutQtMessage();
void getCustomMessage();
private:
QLabel *nameLabel;
QLabel *sexLabel;
QLabel *ageLabel;
QLabel *statureLabel;
QLabel *colorLabel;
QLabel *fontLabel;
QLabel *criticalLabel;
QLabel *informationLabel;
QLabel *questionLabel;
QLabel *warningLabel;
QLabel *errorLabel;
QLabel *aboutLabel;
QLabel *aboutQtLabel;
QLabel *customLabel;
QErrorMessage *errorMessageDialog;
};
#endif
```
在文件開始處,首先引入了 QDialog 類的聲明,然后前置聲明程序中用到的 Qt 類。 Dialog 類公有單繼承自 QDialog,接下來為其聲明若干個私有槽函數和私有成員變量。
小貼士:類的成員變量盡量聲明為私有的。
在 Dialog 類的實現文件的最開始處定義一個宏 MESSAGE,它保存了后面 MessageBox 類 的實例用到的提示信息。
```
#include <QtGui>
#include "dialog.h"
#define MESSAGE \
Dialog::tr("<p>Message boxes have a caption, a text, " \
"and any number of buttons, each with standard or custom texts." \
"<p>Click a button to close the message box. Pressing the Esc button " \
"will activate the detected escape button (if any).")
```
然后看一下構造函數。
```
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
//! [1]
setWindowTitle(tr("Standard Dialogs"));
errorMessageDialog = new QErrorMessage(this);
int frameStyle = QFrame::Sunken | QFrame::Panel;
//! [1]
//! [2]
//Name
nameLabel = new QLabel;
nameLabel->setFrameStyle(frameStyle);
QPushButton *nameButton = new PushButton(tr("&Name(QInputDialog::getText())"));
//Sex
sexLabel = new QLabel;
sexLabel->setFrameStyle(frameStyle);
QPushButton *sexButton = new QPushButton(tr("&Sex(QInputDialog::getItem())"));
//Age
ageLabel = new QLabel;
ageLabel->setFrameStyle(frameStyle);
QPushButton *ageButton = new pushButton(tr("&Age(QInputDialog::getInteger())"));
//Stature
statureLabel = new QLabel;
statureLabel->setFrameStyle(frameStyle);
QPushButton *statureButton = new
QPushButton(tr("S&tature(QInputDialog::getDouble())"));
//setup inputdialog groupbox
QGroupBox *inputDialogGBox = new QGroupBox(tr("Input Dialog"));
QGridLayout *inputDialogGridLayout = new QGridLayout;
inputDialogGridLayout->setColumnStretch(1, 1);
inputDialogGridLayout->setColumnMinimumWidth(1, 100);
inputDialogGridLayout->addWidget(nameButton, 0, 0);
inputDialogGridLayout->addWidget(nameLabel, 0, 1);
inputDialogGridLayout->addWidget(sexButton, 1, 0);
inputDialogGridLayout->addWidget(sexLabel, 1, 1);
inputDialogGridLayout->addWidget(ageButton, 3, 0);
inputDialogGridLayout->addWidget(ageLabel, 3, 1);
inputDialogGridLayout->addWidget(statureButton, 4, 0);
inputDialogGridLayout->addWidget(statureLabel, 4, 1);
inputDialogGBox->setLayout(inputDialogGridLayout);
//! [2]
//! [3]
//Color
colorLabel = new QLabel;
colorLabel->setFrameStyle(frameStyle);
QPushButton *colorButton = new QPushButton(tr("&Color"));
//Font
fontLabel = new QLabel;
fontLabel->setFrameStyle(frameStyle);
QPushButton *fontButton = new QPushButton(tr("&Font"));
//setup color&font Dialog groupbox
QGroupBox *colorAndFontDlgGBox = new QGroupBox(tr("Color Dialog And Font
Dialog"));
QGridLayout *colorAndFontDlgGLayout = new QGridLayout;
colorAndFontDlgGLayout->setColumnStretch(1, 1);
colorAndFontDlgGLayout->addWidget(colorButton, 0, 0);
colorAndFontDlgGLayout->addWidget(colorLabel, 0, 1);
colorAndFontDlgGLayout->addWidget(fontButton, 1, 0);
colorAndFontDlgGLayout->addWidget(fontLabel, 1, 1);
colorAndFontDlgGBox->setLayout(colorAndFontDlgGLayout);
//! [3]
//! [4]
//Question MessageBox
questionLabel = new QLabel;
questionLabel->setFrameStyle(frameStyle);
QPushButton *questionButton = new QPushButton(tr("&Question"));
//Information MessageBox
informationLabel = new QLabel;
informationLabel->setFrameStyle(frameStyle);
QPushButton *informationButton = new QPushButton(tr("&Information"));
//Warning MessageBox
warningLabel = new QLabel;
warningLabel->setFrameStyle(frameStyle);
QPushButton *warningButton = new QPushButton(tr("&Warning"));
//Critical MessageBox
criticalLabel = new QLabel;
criticalLabel->setFrameStyle(frameStyle);
QPushButton *criticalButton = new QPushButton(tr("Critica&l"));
//Error MessageBox
errorLabel = new QLabel;
errorLabel->setFrameStyle(frameStyle);
QPushButton *errorButton = new QPushButton(tr("Show &Message"));
//setup messageBox dialog groupbox
QGroupBox *messageBoxDlgGBox = new QGroupBox(tr("MessageBox Dialog"));
QGridLayout *messageBoxDlgGLayout = new QGridLayout;
messageBoxDlgGLayout->setColumnStretch(1, 1);
messageBoxDlgGLayout->addWidget(questionButton, 0, 0);
messageBoxDlgGLayout->addWidget(questionLabel, 0, 1);
messageBoxDlgGLayout->addWidget(informationButton, 1, 0);
messageBoxDlgGLayout->addWidget(informationLabel, 1, 1);
messageBoxDlgGLayout->addWidget(warningButton, 2, 0);
messageBoxDlgGLayout->addWidget(warningLabel, 2, 1);
messageBoxDlgGLayout->addWidget(criticalButton, 3, 0);
messageBoxDlgGLayout->addWidget(criticalLabel, 3, 1);
messageBoxDlgGLayout->addWidget(errorButton, 4, 0);
messageBoxDlgGLayout->addWidget(errorLabel, 4, 1);
messageBoxDlgGBox->setLayout(messageBoxDlgGLayout);
//! [4]
//! [5]
//About MessageBox
aboutLabel = new QLabel;
aboutLabel->setFrameStyle(frameStyle);
QPushButton *aboutButton = new QPushButton(tr("A&bout"));
//AboutQt MessageBox
aboutQtLabel = new QLabel;
aboutQtLabel->setFrameStyle(frameStyle);
QPushButton *aboutQtButton = new QPushButton(tr("Ab&out Qt"));
//custom MessageBox
customLabel = new QLabel;
customLabel->setFrameStyle(frameStyle);
QPushButton *customButton = new QPushButton(tr("Custom M&essageBox"));
//setup about dialog groupbox
QGroupBox *aboutMessageDlgGBox = new QGroupBox(tr("About And Custom MessageBox
Dialog"));
QGridLayout *aboutMessageBoxDlgGLayout = new QGridLayout;
aboutMessageBoxDlgGLayout->setColumnStretch(1, 1);
aboutMessageBoxDlgGLayout->addWidget(aboutButton, 0, 0);
aboutMessageBoxDlgGLayout->addWidget(aboutLabel, 0, 1);
aboutMessageBoxDlgGLayout->addWidget(aboutQtButton, 1, 0);
aboutMessageBoxDlgGLayout->addWidget(aboutQtLabel, 1, 1);
aboutMessageBoxDlgGLayout->addWidget(customButton, 2, 0);
aboutMessageBoxDlgGLayout->addWidget(customLabel, 2, 1);
aboutMessageDlgGBox->setLayout(aboutMessageBoxDlgGLayout);
//! [5]
//! [6]
//connect signals and slots
connect(ageButton, SIGNAL(clicked()), this, SLOT(getAge()));
connect(statureButton, SIGNAL(clicked()), this, SLOT(getStature()));
connect(sexButton, SIGNAL(clicked()), this, SLOT(getSex()));
connect(nameButton, SIGNAL(clicked()), this, SLOT(getName()));
connect(colorButton, SIGNAL(clicked()), this, SLOT(getColor()));
connect(fontButton, SIGNAL(clicked()), this, SLOT(getFont()));
connect(criticalButton, SIGNAL(clicked()), this, SLOT(getCriticalMessage()));
connect(informationButton, SIGNAL(clicked()),this,
SLOT(getInformationMessage()));
connect(questionButton, SIGNAL(clicked()), this, SLOT(getQuestionMessage()));
connect(warningButton, SIGNAL(clicked()), this, SLOT(getWarningMessage()));
connect(errorButton, SIGNAL(clicked()), this, SLOT(getErrorMessage()));
connect(aboutButton, SIGNAL(clicked()), this, SLOT(getAboutMessage()));
connect(aboutQtButton, SIGNAL(clicked()), this, SLOT(getAboutQtMessage()));
connect(customButton, SIGNAL(clicked()), this, SLOT(getCustomMessage()));
//! [6]
//! [7]
//Setup MainLayout
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(inputDialogGBox);
mainLayout->addWidget(colorAndFontDlgGBox);
mainLayout->addWidget(messageBoxDlgGBox);
mainLayout->addWidget(aboutMessageDlgGBox);
setLayout(mainLayout);
//! [7]
}
```
在代碼塊[1]中,首先為應用程序設置標題欄,接著定義了一個 QErrorMessage 的實例,然后定義一個 QFrame 類的實例,用作應用程序窗口部件的風格。關于 QFrame,這里重 點講解一下。
專題:關于 QFrame 類的使用
一般繼承自 QWidget 的類都可以設置它的 frame 屬性。比如 QLabel 類的窗口在默認情 況下擁有一個平面的(flat)觀感,而 QProgressBar 類的窗口則擁有一個向下凹陷(sunken)的觀感。當然這些都是可以通過設置它們的 frame 而改變的。下面是一段示意代碼,演示了如何設置窗口部件的 frame。
```
QLabel label(...);
label.setFrameStyle(QFrame::Panel | QFrame::Raised);
label.setLineWidth(2);
QProgressBar pbar(...);
label.setFrameStyle(QFrame::NoFrame);
```
一個窗口部件的 frame 有兩個重要的屬性,一個是 shapes,一個是 style。
style 由 QFrame::Shape 和 QFrame::Shadow 枚舉值共同來指定,它們可以使設置了 frame 的窗口部件與其他的區分開來。一般可以使用 setFrameStyle()方法來設置 frame 的 屬性,而使用 frameStyle()方法來讀取該設置。
setFrameStyle()的原型如下:
```
void QFrame::setFrameStyle ( int style )
```
它的作用就是設置該窗口部件的 frame 為 style。
常見的各種應用程序的 frame 的觀感如圖 7-24 所示。

圖 7-24 各種 frame 組合起來的效果
在代碼塊[2]-[5]中,創建了程序中用到的各種窗口部件,然后把它們分類放到幾個分 組框中,最后為分組框設置了布局。這其中的重點是 QGroupBox 類的使用,它用作創建分 組框,請看下面的專題講解。
專題:QGroupBox 類的使用
QGroupBox 為構建分組框提供了支持。分組框通常帶有一個邊框和一個標題欄,作為容 器部件來使用,在其中可以布置各種窗口部件。分組框的標題通常在上方顯示,其位置可以 設置為靠左、居中、靠右、自動調整這幾種方式之一。位于分組框之中的窗口部件可以獲得 應用程序的焦點。
位于分組框之內的窗口部件被稱作是它的子窗口,通常使用 addWidget()方法把子窗口 部件加入到分組框之中。
使用分組框的一般步驟如下:
1\. 實例化分組框對象
使用 QGroupBox 構造函數來實例化分組框對象,示例代碼如下:
```
QGroupBox *groupBox = new QGroupBox(tr("Exclusive Radio Buttons"));
```
2\. 創建位于分組框之中的子窗口部件
同樣使用該窗口部件的構造函數來實現,示例代碼如下:
```
QRadioButton *radio1 = new QRadioButton(tr("&Radio button 1"));
```
3\. 創建一個布局
這個布局就是后面要設置在分組框之上的布局, Qt 提供的常見布局類型比如水平布 局、垂直布局、柵格布局、表單布局等都可以,目前還不支持分裂器布局。示例代碼如下:
```
QVBoxLayout *vbox = new QVBoxLayout;
```
4\. 把第 2 步創建的子窗口部件加入到第 3 步創建的布局之中
一般使用 addWidget()或者 insertWidget()方法把子窗口部件加入到布局之中。示例 代碼如下:
```
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(radio1);
```
5\. 把第 3 步創建的布局應用到分組框上
最后,使用 setLayout()方法把布局應用到分組框上,示例代碼如下:
```
groupBox->setLayout(vbox);
```
注意,創建分組框及其內部的子窗口部件時,以上次序不要改變。當分組框內部沒有
子窗口部件時,是無法為其應用布局的。再有就是,要牢固記得 QGroupBox 是 QWidget 的 子類,QWidget 的公有方法,它的對象都可以使用,它本身就是一個窗口部件。最后,一般 情況下,在應用程序中只要使用了分組框,就要為它應用一個布局,請讀者朋友注意體會。
下面是一個示例程序片段,它演示了創建分組框并為其設置布局的過程。
```
QGroupBox *groupBox = new QGroupBox(tr("Exclusive Radio Buttons"));
QRadioButton *radio1 = new QRadioButton(tr("&Radio button 1"));
QRadioButton *radio2 = new QRadioButton(tr("R&adio button 2"));
QRadioButton *radio3 = new QRadioButton(tr("Ra&dio button 3"));
radio1->setChecked(true);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(radio1);
vbox->addWidget(radio2);
vbox->addWidget(radio3);
vbox->addStretch(1);
groupBox->setLayout(vbox);
```
代碼塊[6]設置程序中的信號和槽的連接
代碼塊[7]設置程序總的布局。 接下來看一下設置年齡的函數 getAge()。
```
void Dialog::getAge()
{
bool ok;
int age = QInputDialog::getInteger(this,tr("User Age"),
tr("Please input age"),ageLabel->text().toInt(),0,150,1,&ok);
if(ok)
{
ageLabel->setText(QString(tr("%1")).arg(age));
}
}
```
靜態方法 QInputDialog::getInteger 用于創建基于整數的標準輸入框。
QString 的 toInt()方法原型如下:
```
int QString::toInt ( bool * ok = 0, int base = 10 ) const
```
它的作用是以 base 為基準將字符串轉化為整數。如果 base 等于 0,則表示將使用 C 語 言規定的轉換方法,即如果字符串是以 0x 開頭的,則轉換成 16 進制的整數;如果字符串是以 0 開頭的,則轉換成 8 進制整數,其它情況則轉換成 10 進制整數。一般我們使用十進 制整數的時候較多。
再看一下設置性別的函數 getSex()是如何定義的。
```
void Dialog::getSex()
{
QStringList items;
items << tr("male") << tr("female");
bool ok;
QString sex = QInputDialog::getItem(this,tr("Sex"),
tr("Please select sex"),items,0,false,&ok);
if (ok)
{
sexLabel->setText(sex);
}
}
```
其中,QStringList 類用于容納一些列的字符串對象。操作符 <<的原型如下:
```
QStringList & QStringList::operator<< ( const QString & str )
```
它的作用于 append()方法相同,將 str 附加到已知的字符串列表中,并返回該列表的引用。
設置字體的函數 getFont()是這樣定義的。
```
void Dialog::getFont()
{
bool ok;
QFont font = QFontDialog::getFont(&ok, QFont(fontLabel->text()), this);
if (ok)
{
fontLabel->setText(font.key());
fontLabel->setFont(font);
}
}
```
第 3 行調用 getFont()方法創建標準字體對話框。
第 5 行設置 fontLabel 的文本是 font 的文本描述。QFont 的 key()方法的原型如下:
```
QString QFont::key () const
```
它返回該字體的文本描述代碼。
第 6 行設置 fontLabel 的字體為用戶選中的 font。 現在看看自定義消息對話框的方法,在 getWarningMessage()方法中有很好的示范。
```
void Dialog::getWarningMessage()
{
QMessageBox msgBox(QMessageBox::Warning, tr("QMessageBox::warning()"),
MESSAGE, 0, this);
msgBox.addButton(tr("Save &Again"), QMessageBox::AcceptRole);
msgBox.addButton(tr("&Continue"), QMessageBox::RejectRole);
if (msgBox.exec() == QMessageBox::AcceptRole)
{
warningLabel->setText(tr("Save Again"));
}
else
{
warningLabel->setText(tr("Continue"));
}
}
```
首先使用構造函數而不是靜態方法創建 QMessageBox 的實例。然后使用 addButton()方法為消息對話框添加按鈕。QMessageBox::AcceptRole()和 QMessageBox::RejectRole()是 枚舉變量 QMessageBox::ButtonRole 的取值之一,該枚舉變量描述了按鈕在消息對話框中 的作用。QMessageBox::AcceptRole 表示當用戶單擊該按鈕時,將導致對話框被接受,類似 于 OK 按鈕的作用,而 QMessageBox::RejectRole()表示當用戶單擊該按鈕時,將導致對話 框被拒絕,類似于 Cancel 按鈕的作用。
- 第 1 章 走近 Qt
- 1.1 Qt 簡介
- 1.2 Qt 紀事概覽
- 1.3 Qt 套件的組成(以 Qt4.5 為準)
- 1.4 Qt 的授權
- 1.5 Qt 的產品
- 1.6 Qt 的服務與支持
- 1.7 Qt 的最新進展
- 1.8為什么選擇 Qt
- 1.9 問題與解答
- 1.10 總結與提高
- 第 2 章 Qt 的安裝與配置
- 2.1 獲取 Qt
- 2.2 協議說明
- 2.3 安裝 Qt
- 2.4 配置 Qt4 環境
- 2.5 問題與解答
- 2.6 總結與提高
- 第 3 章 Qt 編程基礎
- 3.1 標準 C++精講
- 3.2 Windows 編程基礎
- 3.3 Linux 編程基礎
- 3.4 Mac 編程基礎
- 3.5 問題與解答
- 3.6 總結與提高
- 第 4 章 Qt 4 集成開發環境
- 4.1 常見的 Qt IDE
- 4.2 Qt Creator
- 4.3 Eclipse
- 4.5 問題與解答
- 4.6 總結與提高
- 第 5 章 使用 Qt 基本 GUI 工具
- 5.1 使用 Qt Designer 進行 GUI 設計
- 5.2 使用 Qt Assistant 獲取在線文檔與幫助
- 5.3 使用 Qt Demo 學習 Qt 應用程序開發
- 5.4 問題與解答
- 5.5 總結與提高
- 第 6 章 Qt 4 程序開發方法和流程
- 6.1 開發方法
- 6.2 Hello Qt
- 6.3 幾個重要的知識點
- 6.4 問題與解答
- 6.5 總結與提高
- 第 7 章 對話框
- 7.1 QDialog 類
- 7.2 子類化 QDialog
- 7.3 快速設計對話框
- 7.4 常見內建(built in)對話框的使用
- 7.5 模態對話框與非模態對話框
- 7.6 問題與解答
- 7.7 總結與提高
- 第 8 章 主窗口
- 8.1 主窗口框架
- 8.2 創建主窗口的方法和流程
- 8.3 代碼創建主窗口
- 8.4 使用 Qt Designer 創建主窗口
- 8.5 中心窗口部件專題
- 8.6 Qt4 資源系統專題
- 8.7 錨接窗口
- 8.8 多文檔
- 8.9 問題與解答
- 8.10 總結與提高
- 第 9 章 Qt 樣式表與應用程序觀感
- 9.1 應用程序的觀感
- 9.2 QStyle 類的使用
- 9.3 樣式表概述
- 9.4 使用樣式表
- 9.5 問題與解答
- 9.6 總結與提高
- 第 10 章 在程序中使用.ui 文件
- 10.1 uic 的使用
- 10.2 Ui_YourFormName.h 文件的組成
- 10.3 編譯時加入處理.ui 文件的方法
- 10.4 運行時加入處理.ui 文件的方法
- 10.5 信號與槽的自動連接
- 10.6 問題與解答
- 10.7 總結與提高 本章主要講解了以下內容:
- 第 11 章 布局管理
- 11.1 基本概念和方法
- 11.2在 Qt Designer 中使用布局
- 11.3 基本布局實踐
- 11.4 堆棧布局
- 11.5 分裂器布局
- 11.6 自定義布局管理器
- 11.7 布局管理經驗總結
- 11.8 問題與解答
- 11.9 總結與提高
- 第 12 章 使用 Qt Creator
- 12.1 Qt Creator 概覽
- 12.2 Qt Creator 的組成
- 12.3 快捷鍵和常用技巧
- 12.4 Qt Creator 構建系統的設置
- 12.5 處理項目間依賴關系( Dependencies )
- 12.6 Qt 多版本共存時的管理
- 12.7 使用定位器在代碼間快速導航
- 12.8 如何創建一個項目
- 12.9 實例講解
- 12.10 使用 Qt Creator 調試程序
- 12.11 問題與解答
- 12.12 總結與提高
- 第 13 章 Qt 核心機制與原理
- 13.1 Qt 對標準 C++的擴展
- 13.2 信號與槽
- 13.3 元對象系統
- 13.4 Qt 的架構
- 13.5 Qt 的事件模型
- 13.6 構建 Qt 應用程序
- 13.7 總結與提高
- 附錄 A qmake 使用指南
- A.1 qmake 簡介
- A.2 使用 qmake
- 附錄 B make 命令
- B.1 命令解釋
- B.2 使用 make 自動構建
- 附錄 C Qt 資源
- C.1Qt 官方資源
- C.2 Qt 開發社區