17_對(duì)話框及其類型

關(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容