對話框(QDialog)

modal、modeless

QDialog是所有對話框窗口類別的父類別,通常用來顯現訊息,或者和使用者進行簡單互動的頂層窗口,分為模態對話框(modal)和非模態對話框(modeless)兩大類。

  • 模態對話框(modal):當對話框顯現時,不能對此對話框之外的窗口進行操作,直到關閉對話框。
  • 非模態對話框(modeless):當對話框顯現時,可以操作此對話框,也可以對其他部分進行操作。

對話框創建

以下範例分別產生這兩種對話框,方法類似,呼叫exec()實現模態對話框,呼叫show()實現非模態對話框,當有模態對話框時,除非我們關掉,否則無法對應用程式進行操作。


widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDialog>
#include <QPushButton>
#include <QHBoxLayout>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
private slots:
    void openModalDlg();
    void openModelessDlg();
private:
    QPushButton *modalBtn;
    QPushButton *modelessBtn;
    QHBoxLayout *layout;
};

#endif     

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent) : 
    QWidget(parent)
{
    setWindowTitle(tr("按鍵組"));
    layout = new QHBoxLayout(this);
    modalBtn = new QPushButton(tr("開啟模態對話框"));
    modelessBtn = new QPushButton(tr("開啟非模態對話框"));
    layout->addWidget(modalBtn);
    layout->addWidget(modelessBtn);

    connect(modalBtn,SIGNAL(clicked()),this,SLOT(openModalDlg()));
    connect(modelessBtn,SIGNAL(clicked()),this,SLOT(openModelessDlg()));
}

void Widget::openModalDlg() {
    QDialog *dlg = new QDialog(this);
    dlg->exec();
}

void Widget::openModelessDlg() {
    QDialog *dlg = new QDialog(this);
    dlg->show();
}

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}  

Qt標準對話框

Qt有設定幾種標準對話框,且在不同作業系統有各自習慣的呈現方式,可依實際情況做使用,而不用自己重新設定一個對話框。

  • QMessageBox:消息對話框,用於顯示信息。
  • QInputDialog:允許用戶輸入一個值,並將其值輸入程式。
  • QColorDialog:選擇顏色 。
  • QFileDialog:選擇檔案。
  • QFontDialog:選擇字體。
  • QPrintDialog:列印配置。
  • QPrintPreviewDialog:列印預覽。
  • QProgressDialog:顯示進度。