1. accept()
用途
確認操作:表示用戶完成了對話框的交互并確認了操作(如點擊“確定”按鈕)。
關閉模態對話框:結束 exec() 的事件循環,返回 QDialog::Accepted 結果碼。
適用場景
模態對話框(通過 exec() 顯示):
void SettingsDialog::on_btnOK_clicked() {// 保存數據或應用設置accept(); // 關閉對話框,返回 Accepted
}
結果處理:
if (dialog.exec() == QDialog::Accepted) {// 處理用戶確認后的邏輯
}
行為
隱藏對話框,設置結果碼為 Accepted。
不會銷毀對話框對象(除非設置了 Qt::WA_DeleteOnClose)。
2. reject()
用途
取消操作:表示用戶取消了對話框的交互(如點擊“取消”按鈕或關閉窗口)。
關閉模態對話框:結束 exec() 的事件循環,返回 QDialog::Rejected 結果碼。
適用場景
模態對話框(通過 exec() 顯示):
void SettingsDialog::on_btnCancel_clicked() {reject(); // 關閉對話框,返回 Rejected
}
結果處理:
if (dialog.exec() == QDialog::Rejected) {// 處理用戶取消后的邏輯
}
行為
隱藏對話框,設置結果碼為 Rejected。
不會銷毀對話框對象(除非設置了 Qt::WA_DeleteOnClose)。
3. hide()
用途
隱藏窗口:僅隱藏對話框,不關閉或銷毀對象,允許后續重復顯示。
非模態對話框:適用于需要異步交互的場景,允許用戶同時操作主窗口和對話框。
適用場景
非模態對話框(通過 show() 顯示):
void SettingsDialog::on_btnOK_clicked() {// 發射信號傳遞數據emit settingsApplied(enable, mode);hide(); // 隱藏對話框,不銷毀對象
}
臨時隱藏窗口:
m_settingsDialog->hide(); // 隱藏后可通過 show() 重新顯示
行為
僅隱藏窗口,不觸發 closeEvent,不設置結果碼。
對象保持活躍狀態,可重復調用 show() 顯示。
對比總結
方法 適用場景 結果碼 窗口狀態 對象生命周期
accept() 模態對話框確認操作 Accepted 隱藏 保持存在(默認)
reject() 模態對話框取消操作 Rejected 隱藏 保持存在(默認)
hide() 非模態對話框 無 隱藏 保持存在
代碼示例
模態對話框(使用 accept()/reject())
// 模態對話框的確認和取消邏輯
void SettingsDialog::on_btnOK_clicked() {// 保存設置...accept(); // 關閉并返回 Accepted
}void SettingsDialog::on_btnCancel_clicked() {reject(); // 關閉并返回 Rejected
}// 主窗口調用
void MainWindow::onOpenSettings() {SettingsDialog dialog(this);if (dialog.exec() == QDialog::Accepted) {// 處理確認后的數據}
}
非模態對話框(使用 hide())
// 非模態對話框的確認邏輯
void SettingsDialog::on_btnOK_clicked() {// 發射信號傳遞數據emit settingsApplied(enable, mode);hide(); // 隱藏窗口,保持對象存在
}// 主窗口調用
void MainWindow::onOpenSettings() {if (!m_settingsDialog) {m_settingsDialog = new SettingsDialog(this);connect(m_settingsDialog, &SettingsDialog::settingsApplied, this, &MainWindow::onSettingsConfirmed);}m_settingsDialog->show(); // 顯示窗口
}
注意事項
對象生命周期若對話框設置為 Qt::WA_DeleteOnClose,調用 accept() 或 reject() 會銷毀對象。非模態對話框應避免設置此屬性,以重復使用實例。信號與槽
非模態對話框應通過信號傳遞數據,而非依賴返回值:
connect(m_settingsDialog, &SettingsDialog::settingsApplied, this, &MainWindow::updateSettings);
窗口關閉確認
可在 closeEvent 中統一處理關閉邏輯:
void SettingsDialog::closeEvent(QCloseEvent *event) {if (needConfirmClose) {QMessageBox::question(...); // 彈出確認對話框}event->accept(); // 或 event->ignore()
}
通過合理選擇 accept()、reject() 和 hide(),可以精確控制對話框的交互邏輯,確保用戶體驗和代碼健壯性。