讓你的 Qt 桌面程序看上去更加 native(五):QDialog

雖然 Nokia 剛剛宣佈和微軟合做,推出 WP7 的智能手機,如今 IT 界依然一片譁然(不過也是在乎料之中),但這並不會影響咱們對於 Qt 的興趣。好了,如今咱們來看的是關於 QDialog 的一些東西。ide

首先先來看 QDialog 的一副截圖(出自 Qt Developer Day, 2009):函數

在這裏,咱們要注意的是不一樣平臺之上對話框的按鈕的不一樣。其實這是同一段代碼編譯的,沒有使用條件編譯技術。那麼是如何作到的呢?答案是使用 QDialogButtonBox 這個類。佈局

QDialogButtonBox 用於管理對話框按鈕的順序、佈局、文本和圖標等,以保證這些在不一樣平臺可以具備不一樣表現。若是咱們沒有 Mac 系統,咱們怎麼知道該如何佈局按鈕呢?咱們怎麼得到這些按鈕在不一樣平臺上的圖標呢?這些都不會成爲咱們實現程序的障礙,由於使用 QDialogButtonBox 就足夠了。例如,要實現上面的效果,咱們只須要一行代碼:this

  
  
           
  
  
  1. QDialogButtonBox box(QDialogButtonBox::Save |   
  2.                       QDalogButtonBox::Discard |  
  3.                       QDialogButtonBox::Cancel);  

這樣,Qt 就會在不一樣的平臺作出不一樣的表現。spa

QDialogButtonBox 爲不一樣的按鈕分配不一樣的角色來實現這一功能。所以,咱們在上面的 QDialogButtonBox::Save 這些實際都是一個簡單的 enum,用於標記按鈕的角色。若是你須要使用本身的按鈕,而且爲之附加角色,那麼可使用下面的代碼:orm

  
  
           
  
  
  1. QDialogButtonBox box;  
  2. box.addButton(myButton, QDialogButtonBox::AcceptRole); 

這樣,myButton 的角色就是 QDialogButtonBox::AcceptRole,而 QDialogButtonBox 也可以根據這個角色爲之分配合適的圖標和位置等等。blog

QDialogButtonBox 先告一段落,下面來講說模態對話框。什麼是模態對話框?所謂模態,就是在對話框彈出來以後,可以阻塞後面的窗口。Windows 上通常在退出時會彈出來一個問你是否保存的對話框,就是一個模態對話框。當它出現的時候,後面的窗口是不能點擊的,必需要你關閉這個對話框以後才能夠。在 Qt 實現模態對話框很簡單:get

  
  
           
  
  
  1. MyQDialogSubclass dialog;   
  2. // Various bits of initialization   
  3. if (dialog.exec() == QDialog::Accept)  {  // HERE!!! 
  4.  // Set new values or do extra work       
  5.  // based on results.   

這段代碼在運行時,會在標記 HERE 註釋這行阻塞,具體是 QDialog::exec() 這個函數。這以後的代碼在你關閉 dialog 對話框以後纔會被執行。利用這一技術,你就能夠在 if 裏面獲取依賴於對話框返回值的數據。例如,對話框用於收集用戶數據等。string

  
  
           
  
  
  1. class MyDialog : public QDialog 
  2. public
  3.     QString name; 
  4. }; 
  5. // .... 
  6. MyDialog d; 
  7. if(d.exec() == QDialog::Accept) { 
  8.     QString name = d.name; 
  9.     // do something with name... 

上面的代碼,MyDialog 用於用戶輸入 name 的值。咱們使用模態對話框,就能夠在 if 裏面獲取這個值了。it

不過,不一樣平臺上的模態對話框的使用方式是不同的。好比,Windows 平臺上,模態對話框用於嚴重錯誤的提示,或者是在繼續以前必須完成的任務;KDE 上,模態對話框用於可能形成數據丟失或者嚴重後果的交互。

Qt 中,對話框的打開具備三種方式:

  • QDialog::show(): 非模態
  • QDialog::exec(): 模態
  • QDialog::open(): 窗口模態

前兩種咱們很容易理解,下面來看看什麼是窗口模態。好比,咱們有兩個窗口(如下圖示來自 Qt Developer Day, 2009):

使用以下代碼,咱們用 open() 函數打開一個對話框:

  
  
           
  
  
  1. if(!messageBox) { 
  2.     messageBox = new QMessageBox("SDI"
  3.                                  "The document has been modified. \n" 
  4.                                  "Do you want to save your changes?"
  5.                                  QMessageBox::Warning, 
  6.                                  QMessageBox::Yes | QMessageBox::Default, 
  7.                                  QMessageBox::No, 
  8.                                  QMessageBox::Cancel | QMessageBox::Escape, 
  9.                                  this); 
  10.     connect(messageBox, SIGNAL(finished(int)), SLOT(handleDialogClose(int))); 
  11. messageBox->open(); 

看看運行的結果:

這就是 open() 函數的效果:它相似模態對話框,可是隻會阻塞一個窗口,而不是將整個系統阻塞掉。

最後一個要說的技術是 QFormLayout。這個佈局用於展現表單。來看一下下面的截圖(出自 Qt Developer Day, 2009):

注意這裏的文本對齊方式和按鈕的順序。前面已經說過用 QDialogButtonBox 實現不一樣平臺下按鈕的順序,而上面的對齊方式則是使用 QFormLayout 實現,例如:

  
  
           
  
  
  1. QFormLayout *layout = new QFormLayout; 
  2. layout->addRow(tr("Name:"), nameLineEdit); 
  3. // more... 

這樣,咱們又可以使用簡單的代碼實現不一樣平臺的不一樣佈局表現。

相關文章
相關標籤/搜索