1. 程式人生 > >8.QT-對話框(模態與非模態)

8.QT-對話框(模態與非模態)

所有 消息 屬於 分享 數值 oid qdialog HA 繼承

對話框介紹

  • 對話框是於用戶進行簡易交互的頂層窗口
  • QDialog是Qt中所有對話框窗口的父類,是一種容器類型的組件
  • QDialog繼承於QWidget類,如下圖所示:

技術分享圖片

QWidget和QDialog有什麽不同

QDialog:

  • QDialog是定制了窗口式樣的特殊的QWidget
  • QDialog只能作為專用的交互窗口
  • QDialog不能作為子部件,嵌入其它容器中

QWidget:

  • QWidget如果沒有父組件,則將會成為一個主窗口,
  • QWidget如果有父組件,則將成為其父組件的子部件,嵌入到其父組件裏

代碼試驗: QWidget和QDialog區別

代碼1:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget w;
    w.resize(300,300);

    QDialog d(&w);
    d.resize(150,150);

    w.show();
    d.show();

    return a.exec();
}

效果:

技術分享圖片

可以看到,對話框始終都是作為獨立的交互窗口

代碼2:

int main(int
argc, char *argv[]) { QApplication a(argc, argv); QWidget w1; w1.resize(300,300); QWidget w2(&w1); w2.resize(150,150); w1.show(); w2.show(); return a.exec(); }

效果:

技術分享圖片

可以看到只出現了一個窗口,並沒有出現第二個窗口

對話框類型

模態對話框

  • 屬於阻塞式調用,指沒有關閉該對話框之前,是無法與其它任何窗口進行交互的
  • 用於依賴用戶選擇的場合,比如:選項設置,消息提示,字體設置等
  • 在棧上創建模態對話框是最簡單常用的方式
  • 使用exec()進入對話框的消息循環,從而實現阻塞式調用

實驗代碼:

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    QWidget w;
    w.resize(300,300);
w.show(); QDialog d(
&w); d.resize(150,150); d.exec(); //進入對話框d的消息循環,從而實現阻塞式調用 return a.exec(); }

非模態對話框

  • 屬於非阻塞調用,指出現該對話框時,也可以與父窗口進行交互
  • 用於特殊功能設置的場合,比如:查找操作
  • 一般情況下非模態對話框需要在堆上創建,避免自動被摧毀
  • 非模態對話框需要通過setAttribute()成員函數指定Qt::WA_DeleteOnClose屬性
  • Qt::WA_DeleteOnClose表示:退出窗口後,讓Qt自動摧毀這個對話框
  • 使用show()來顯示對話框窗口,從而實現非阻塞調用

實驗代碼:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget w;
    w.resize(300,300);
    w.show();

    QDialog  *d = new QDialog(&w);

    d->setAttribute(Qt::WA_DeleteOnClose);
    d->resize(150,150);
    d->show();                

    return a.exec();
}

混合模態對話框

  • 在非模態對話框的基礎上調用QDialog::setModal(true)成員函數實現

實驗代碼:

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    QWidget w;
    w.resize(300,300);
    w.show();

    QDialog  *d = new QDialog(&w);
    d->setAttribute(Qt::WA_DeleteOnClose);
    d->setModal(true);               
    d->resize(150,150);
    d->show();

    return a.exec();
}

對話框返回值處理

  • 只有模態對話框才有返回值概念
  • QDialog::exec()的返回值作為交互結果

  -使用void QDialog::done ( int r ) 作為交互結果,將r值返回給exec()

  -返回值為QDialog::Accepted時,表示用戶操作成功

  -返回值為QDialog::Rejected時,表示用戶操作失敗

  -也可以自定義返回數值

8.QT-對話框(模態與非模態)