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(),可以精确控制对话框的交互逻辑,确保用户体验和代码健壮性。