關(guān)鍵詞: 模態(tài)對(duì)話框、非模態(tài)對(duì)話框
1. 對(duì)話框的概念
- 對(duì)話框是用戶進(jìn)行簡(jiǎn)短交互的頂層窗口
-
QDialog是Qt中所有對(duì)話框窗口的基類 -
QDialog繼承于QWidget,是一種容器類型的組件
2. QDialog的意義
-
QDialog作為一種專用的交互窗口而存在 -
QDialog不能作為子部件嵌入其它容器中——為頂成窗口 -
QDialog是定制了窗口式樣的特殊的QWidget
3. 對(duì)話框的類型
- 模態(tài)對(duì)話框(
QDialog::exec()):顯示后無(wú)法與父類窗口進(jìn)行交互,是一種阻塞式的對(duì)話框調(diào)用方式 - 非模態(tài)對(duì)話框(
QDialog::show()):顯示后獨(dú)立存在可以同時(shí)與父窗口進(jìn)行交互,是一種非阻塞式的對(duì)話框調(diào)用方式 - 模態(tài)對(duì)話框用于必須依賴用戶選擇的場(chǎng)合:如消息提示,文本選擇,打印設(shè)置等
- 非模態(tài)對(duì)話框用于特殊功能設(shè)置的場(chǎng)合:如查找操作,屬性設(shè)置等
小技巧:
1) 在棧上創(chuàng)建模態(tài)對(duì)話框是最簡(jiǎn)單常用的方式
2)一般情況下非模態(tài)對(duì)話框需要在堆上創(chuàng)建
3) 通過QDialog::setModal函數(shù)可以創(chuàng)建混合特性的對(duì)話框
4)非模態(tài)對(duì)話框需要指定Qt::WA_DeleteOnClose屬性
Dialog::Dialog(QWidget *parent)
: QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)
{
ModalBtn.setText("Modal Dialog");
ModalBtn.move(20, 20);
ModalBtn.resize(100, 30);
NormalBtn.setText("Normal Dialog");
NormalBtn.move(20, 70);
NormalBtn.resize(100, 30);
MixedBtn.setText("Mixed Dialog");
MixedBtn.move(20, 120);
MixedBtn.resize(100, 30);
connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_Clicked()));
connect(&NormalBtn, SIGNAL(clicked()), this, SLOT(NormalBtn_Clicked()));
connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_Clicked()));
this->resize(140, 170);
}
void Dialog::ModalBtn_Clicked()
{
qDebug() << "ModalBtn_Clicked() Begin...";
QDialog dialog(this);
dialog.exec(); // modal dialog
qDebug() << "ModalBtn_Clicked() End...";
}
void Dialog::NormalBtn_Clicked()
{
qDebug() << "NormalBtn_Clicked() Begin...";
// normal 對(duì)話框需要在堆上定義,
// 如果定義在堆上,局部變量會(huì)自動(dòng)銷毀
QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose); // 設(shè)置關(guān)閉釋放堆空間屬性
dialog->show();
qDebug() << "NormalBtn_Clicked() End...";
}
void Dialog::MixedBtn_Clicked()
{
qDebug() << "MixedBtn_Clicked()";
QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setModal(true);
dialog->show();
qDebug() << "MixedBtn_Clicked()";
}
Dialog::~Dialog()
{
}
4. 對(duì)話框的返回值
- 只有模態(tài)對(duì)話框才有返回值的概念
- 模態(tài)對(duì)話框的返回值用于表示交互結(jié)果
-
QDialog::exec()的返回值為交互結(jié)果
1)void QDialog::done(int i):關(guān)閉對(duì)話框并將參數(shù)作為交互結(jié)果
2)QDialog::Accepted:用戶操作成功
3)QDialog::Rejected:用戶操作失敗
5. 小結(jié)
- 對(duì)話框分為模態(tài)對(duì)話框和非模態(tài)對(duì)話框
- 模態(tài)對(duì)話框是阻塞式的
- 模態(tài)對(duì)話框依賴于用戶交互結(jié)果的場(chǎng)合
- 非模態(tài)對(duì)話框是非阻塞式的
- 非模態(tài)對(duì)話框用于功能設(shè)置場(chǎng)合
聲明:此文章僅是本人在學(xué)習(xí)狄泰QT實(shí)驗(yàn)分析課程所做的筆記,文章中包含狄泰軟件資料內(nèi)容,一切版權(quán)歸狄泰軟件所有!
實(shí)驗(yàn)環(huán)境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4
