accept() reject() hide()

发布于:2025-05-07 ⋅ 阅读:(7) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到