雖然 Nokia 剛剛宣佈和微軟合做,推出 WP7 的智能手機,如今 IT 界依然一片譁然(不過也是在乎料之中),但這並不會影響咱們對於 Qt 的興趣。好了,如今咱們來看的是關於 QDialog 的一些東西。ide
首先先來看 QDialog 的一副截圖(出自 Qt Developer Day, 2009):函數
在這裏,咱們要注意的是不一樣平臺之上對話框的按鈕的不一樣。其實這是同一段代碼編譯的,沒有使用條件編譯技術。那麼是如何作到的呢?答案是使用 QDialogButtonBox 這個類。佈局
QDialogButtonBox 用於管理對話框按鈕的順序、佈局、文本和圖標等,以保證這些在不一樣平臺可以具備不一樣表現。若是咱們沒有 Mac 系統,咱們怎麼知道該如何佈局按鈕呢?咱們怎麼得到這些按鈕在不一樣平臺上的圖標呢?這些都不會成爲咱們實現程序的障礙,由於使用 QDialogButtonBox 就足夠了。例如,要實現上面的效果,咱們只須要一行代碼:this
- QDialogButtonBox box(QDialogButtonBox::Save |
- QDalogButtonBox::Discard |
- QDialogButtonBox::Cancel);
這樣,Qt 就會在不一樣的平臺作出不一樣的表現。spa
QDialogButtonBox 爲不一樣的按鈕分配不一樣的角色來實現這一功能。所以,咱們在上面的 QDialogButtonBox::Save 這些實際都是一個簡單的 enum,用於標記按鈕的角色。若是你須要使用本身的按鈕,而且爲之附加角色,那麼可使用下面的代碼:orm
- QDialogButtonBox box;
- box.addButton(myButton, QDialogButtonBox::AcceptRole);
這樣,myButton 的角色就是 QDialogButtonBox::AcceptRole,而 QDialogButtonBox 也可以根據這個角色爲之分配合適的圖標和位置等等。blog
QDialogButtonBox 先告一段落,下面來講說模態對話框。什麼是模態對話框?所謂模態,就是在對話框彈出來以後,可以阻塞後面的窗口。Windows 上通常在退出時會彈出來一個問你是否保存的對話框,就是一個模態對話框。當它出現的時候,後面的窗口是不能點擊的,必需要你關閉這個對話框以後才能夠。在 Qt 實現模態對話框很簡單:get
- MyQDialogSubclass dialog;
- // Various bits of initialization
- if (dialog.exec() == QDialog::Accept) { // HERE!!!
- // Set new values or do extra work
- // based on results.
- }
這段代碼在運行時,會在標記 HERE 註釋這行阻塞,具體是 QDialog::exec() 這個函數。這以後的代碼在你關閉 dialog 對話框以後纔會被執行。利用這一技術,你就能夠在 if 裏面獲取依賴於對話框返回值的數據。例如,對話框用於收集用戶數據等。string
- class MyDialog : public QDialog
- {
- public:
- QString name;
- };
- // ....
- MyDialog d;
- if(d.exec() == QDialog::Accept) {
- QString name = d.name;
- // do something with name...
- }
上面的代碼,MyDialog 用於用戶輸入 name 的值。咱們使用模態對話框,就能夠在 if 裏面獲取這個值了。it
不過,不一樣平臺上的模態對話框的使用方式是不同的。好比,Windows 平臺上,模態對話框用於嚴重錯誤的提示,或者是在繼續以前必須完成的任務;KDE 上,模態對話框用於可能形成數據丟失或者嚴重後果的交互。
Qt 中,對話框的打開具備三種方式:
前兩種咱們很容易理解,下面來看看什麼是窗口模態。好比,咱們有兩個窗口(如下圖示來自 Qt Developer Day, 2009):
使用以下代碼,咱們用 open() 函數打開一個對話框:
- if(!messageBox) {
- messageBox = new QMessageBox("SDI",
- "The document has been modified. \n"
- "Do you want to save your changes?",
- QMessageBox::Warning,
- QMessageBox::Yes | QMessageBox::Default,
- QMessageBox::No,
- QMessageBox::Cancel | QMessageBox::Escape,
- this);
- connect(messageBox, SIGNAL(finished(int)), SLOT(handleDialogClose(int)));
- }
- messageBox->open();
看看運行的結果:
這就是 open() 函數的效果:它相似模態對話框,可是隻會阻塞一個窗口,而不是將整個系統阻塞掉。
最後一個要說的技術是 QFormLayout。這個佈局用於展現表單。來看一下下面的截圖(出自 Qt Developer Day, 2009):
注意這裏的文本對齊方式和按鈕的順序。前面已經說過用 QDialogButtonBox 實現不一樣平臺下按鈕的順序,而上面的對齊方式則是使用 QFormLayout 實現,例如:
- QFormLayout *layout = new QFormLayout;
- layout->addRow(tr("Name:"), nameLineEdit);
- // more...
這樣,咱們又可以使用簡單的代碼實現不一樣平臺的不一樣佈局表現。