QT Qdialog的對話框模式以及其關閉


模式對話框

描述

阻塞同一應用程序中其它可視窗口輸入的對話框。模式對話框有自己的事件循環,用戶必須完成這個對話框中的交互操作,並且關閉了它之后才能訪問應用程序中的其它任何窗口。模式對話框僅阻止訪問與對話相關聯的窗口,允許用戶繼續使用其它窗口中的應用程序。

顯示模態對話框最常見的方法是調用其exec()函數,當用戶關閉對話框,exec()將提供一個有用的返回值,並且這時流程控制繼續從調用exec()的地方進行。通常情況下,要獲得對話框關閉並返回相應的值,我們連接默認按鈕,例如:”確定”按鈕連接到accept()槽,”取消”按鈕連接到reject()槽。另外我們也可以連接done()槽,傳遞給它Accepted或Rejected。

效果

這里寫圖片描述

退出

  我們可以通過調用accept()或者是reject()函數來是使得exec()函數結束代碼如下:

//可以在之前的代碼的快要結束的額時候調用accept();然后在主函數中
login *user_login=new login;//login是繼承dialog的類
	int res = user_login->exec();
	if (res == QDialog::Accepted)
	{
		delete user_login;
	}

  

源碼

MainWindow *pMainWindow = new MainWindow();
pMainWindow->setWindowTitle(QStringLiteral("主界面"));
pMainWindow->show();

CustomWindow *pDialog = new CustomWindow(pMainWindow);
pDialog->setWindowTitle(QStringLiteral("模式對話框"));

// 關鍵代碼
pDialog->exec();

// 關閉模態對話框以后才會執行下面的代碼
pMainWindow->setWindowTitle(QStringLiteral("主界面-模式對話框"));
qDebug() << QStringLiteral("關閉模態對話框以后,可以繼續向下執行");
  1. 主界面被阻塞,不能進行點擊、拖動等任何操作。
  2. exec()之后的代碼不會執行,直到關閉模態對話框。

非模式對話框

描述

和同一個程序中其它窗口操作無關的對話框。在文字處理中的查找和替換對話框通常是非模式的,允許用戶同時與應用程序的主窗口和對話框進行交互。調用show()來顯示非模式對話框,並立即將控制返回給調用者。

如果隱藏對話框后調用show()函數,對話框將顯示在其原始位置,這是因為窗口管理器決定的窗戶位置沒有明確由程序員指定,為了保持被用戶移動的對話框位置,在closeEvent()中進行處理,然后在顯示之前,將對話框移動到該位置。

效果

這里寫圖片描述

源碼

MainWindow *pMainWindow = new MainWindow();
pMainWindow->setWindowTitle(QStringLiteral("主界面"));
pMainWindow->show();

CustomWindow *pDialog = new CustomWindow(pMainWindow);
pDialog->setWindowTitle(QStringLiteral("非模式對話框"));

// 關鍵代碼
pDialog->show();

// 下面的代碼會立即運行
pMainWindow->setWindowTitle(QStringLiteral("主界面-非模式對話框"));
qDebug() << QStringLiteral("立即運行");
  1. 主界面不會被阻塞,可以進行點擊、拖動等任何操作。
  2. show()之后的代碼會立即執行。

半模式對話框

描述

調用setModal(true)或者setWindowModality(),然后show()。有別於exec(),show() 立即返回給控制調用者。

對於進度對話框來說,調用setModal(true)是非常有用的,用戶必須擁有與其交互的能力,例如:取消長時間運行的操作。如果使用show()和setModal(true)共同執行一個長時間操作,則必須定期在執行過程中調用QApplication ::processEvents(),以使用戶能夠與對話框交互(可以參考QProgressDialog)。

效果

這里寫圖片描述

源碼

MainWindow *pMainWindow = new MainWindow();
pMainWindow->setWindowTitle(QStringLiteral("主界面"));
pMainWindow->show();

CustomWindow *pDialog = new CustomWindow(pMainWindow);
pDialog->setWindowTitle(QStringLiteral("半模式對話框"));

// 關鍵代碼
pDialog->setModal(true);
pDialog->show();

// 下面的代碼會立即運行
pMainWindow->setWindowTitle(QStringLiteral("主界面-半模式對話框"));
qDebug() << QStringLiteral("立即運行");
  1. 主界面被阻塞,不能進行點擊、拖動等任何操作。
  2. show()之后的代碼會立即執行。

原文:https://blog.csdn.net/liang19890820/article/details/51067310


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM