對話窗 dialog

  • Modal 與 Nonnodal 對話視窗:
    1. Modal 對話視窗:在使用者回應對話視窗之前,擱置其它視窗的輸入。對於立即抓取使用者的回應和顯示重要的錯誤訊息,這類型的對話視窗就很有用。
    2. Nonmodal 對話視窗:非擱置視窗,與一般應用程式視窗相同。對於搜尋視窗或輸入視窗就很有用。
  • QDialog:Qt 的基本對話視窗類別
    1. 實例:一般會產生一個繼承自 QDialog 的對話視窗類別,並加上一些 widget 來構成對話視窗介面。
      #include <qdialog.h>
      MyDialog::MyDialog(QWidget *parent, const char *name) :
      QDialog(parent, name)
      {
        QHBoxLayout *hbox = new QHBoxLayout(this);
        hbox->addWidget(new Qlabel("Enter your name"));
        hbox->addWidget(new QLineEdit());
        hbox->addWidget(ok_pushbutton);
        hbox->addWidget(cancel_pushbutton);
        connect (ok_pushbutton, SIGNAL(clicked()), this, SLOT(accept()));
        connect (cancel_pushbutton, SIGNAL(clicked()), this,
                                   SLOT(reject()));
      }
      
    2. Modal 對話窗:呼叫 exec(),所有處理都會被擱置。
      MyDialog *dialog = new MyDialog(this, "mydialog");
      if (dialog->exec() == QDialog::Accepted)
      {
        // User clicked ‘Ok’
        doSomething();
      }
      else
      {
        // user clicked ‘Cancel’ or dialog killed
        doSomethingElse();
      }
      delete dialog;
      
    3. signal/slot 連結方式如同 modal 對話視窗。
      MyDialog::MyDialog(QWidget *parent, const char *name) :
      QDialog(parent, name)
      {
        ...
        connect (ok_pushbutton, SIGNAL(clicked()), this, SLOT(OkClicked()));
        connect (cancel_pushbutton, SIGNAL(clicked()), this,
                 SLOT(CancelClicked()));
      }
      MyDialog::OkClicked()
      {
        //Do some processing
      }
      MyDialog::CancelClicked()
      {
        //Do some other processing
      }
      
    4. NonModal 對話窗:呼叫 show(),顯示對話窗並立刻回覆,繼續主要的處理迴圈。
      MyDialog *dialog = new MyDialog(this, "mydialog");
      dialog->show();
      

  • QMessageBox
    1. QMessageBox 是一個 modal 對話窗,顯示一個簡單的訊息,加上一個小圖示和按鈕。QMessageBox一般的訊息、警告訊息、其它關鍵訊息成員函式:
      #include <qmessagebox.h>
      int information (QWidget *parent, const QString &caption,
                       const QString &text,
                       int button0, int button1=0, int button2=0)
      int warning     (QWidget *parent, const QString &caption,
                       const QString &text,
                       int button0, int button1, int button2=0)
      int critical    (QWidget *parent, const QString &caption,
                       const QString &text,
                       int button0, int button1, int button2=0)
      
    2. Each of the buttons, button0, button1 and button2 may be set to one of the following values:
      QMessageBox::Ok
      QMessageBox::Cancel
      QMessageBox::Yes
      QMessageBox::No
      QMessageBox::Abort
      QMessageBox::Retry
      QMessageBox::Ignore
      
    3. 實例:QMessageBox 的使用
      int result = QMessageBox::information(this,
                   "Engine Room Query",
                    "Do you wish to engage the HyperDrive?",
                   QMessageBox::Yes | QMessageBox::Default,
                   QMessageBox::No | QMessageBox::Escape);
      switch (result) {
        case QMessageBox::Yes:
           hyperdrive->engage();
           break;
        case QMessageBox::No:
          // do something else
          break;
      }
      
    4. 對話視窗的結果。
      Image hyperdrive
  • QInputDialog
    1. 類似 QMessageBox,但多一個 QLineEdit 可讓使用者輸入。
      Image question
    2. 可輸入文字、布林、整數及浮點數,但分別使用不同的建構函式:
      #include <qinputdialog.h>
      QString getText   (const QString &caption, const QString &label,
                        QLineEdit::EchoMode mode=QLineEdit::Normal,
                        const QString &text=QString::null, bool * ok = 0,
                        QWidget * parent = 0, const char * name = 0)
      QString getItem   (const QString &caption, const QString &label,
                        const QStringList &list, int current=0,
                        bool editable=TRUE,
                        bool * ok=0, QWidget *parent = 0, const char *name=0)
      int getInteger    (const QString &caption, const QString &label,
                        int num=0,
                        int from = -2147483647, int to = 2147483647,
                        int step = 1,
                        bool * ok = 0, QWidget * parent = 0,
                        const char * name = 0)
      double getDouble (const QString &caption, const QString &label,
                        double num = 0,
                        double from = -2147483647, double to = 2147483647,
                        int decimals = 1, bool * ok = 0,
                        QWidget * parent = 0,
                        const char * name = 0 )
      
    3. 實例:輸入一行的文字:
      bool result;
      QString text = QInputDialog::getText("Question",
                                              "What is your Quest?:",
                                              QLineEdit::Normal,
                                              QString::null, &result, this,
                                              "input" );
      if (result) {
         doSomething(text);
      } else {
      // user pressed cancel
      }
      
      1. getText 利用一個 QLineEdit,可以設定 EchoMode,也可以指定預設文字或清成空白。
      2. 每個 QInputDialog 都有 Ok 和 Cancel 按鈕,必須傳入一個 bool 指標,才能知道哪個按鈕被按下,如果使用者按下 Ok,result 就是 TRUE。
    4. getItem 透過 QComboBox,提供使用者一系列的選項。
      bool result;
      QStringList options;
      options << "London" << "New York" << "Paris";
      QString city = QInputDialog::getItem("Holiday",
                                            "Please select a destination:",
                                             options, 1, TRUE, &result,
                                            this, "combo");
      if (result)
        selectDestination(city);
      
    5. 對話窗的結果。
      Image getitem
  • 使用 qmake 簡化 makefile 的設計
    1. Qt 提供一個工具稱為 qmake,可以產生 makefile。
    2. qmake 需要一個 .pro 的輸入檔案。這個檔案包含基本的資訊,例如:原始碼、標頭檔案、目的檔案和 KDE/Qt 函式庫位置。一般 KDE 的 .pro 檔案如下:
      TARGET = app
      MOC_DIR = moc
      OBJECTS_DIR = obj
      INCLUDEPATH = /usr/include/kde
      QMAKE_LIBDIR_X11 += /usr/lib
      QMAKE_LIBS_X11 += -lkdeui -lkdecore
      SOURCES = main.cpp window.cpp
      HEADERS = window.h
      
    3. 產生 makefile。
      $qmake file.pro -o Makefile