Qt 中模态对话框的核心方法---exec()

exec() 是 Qt 中模态对话框的核心方法,它的用法和特点如下:

exec() 的用法和作用

QDialog *dialog = new QDialog(this);
dialog->resize(200, 100);
int result = dialog->exec();  // 执行模态对话框

exec() 的特点

  1. 阻塞执行 - 程序会停在 exec() 这一行,直到对话框关闭
  2. 返回结果 - 返回 QDialog::AcceptedQDialog::Rejected
  3. 事件循环 - 启动一个局部的事件循环,处理该对话框的事件

为什么需要使用 exec()

1. 需要获取用户选择时

QDialog dialog(this);
if (dialog.exec() == QDialog::Accepted) {
    // 用户点击了确定/OK
    qDebug() << "用户确认操作";
} else {
    // 用户点击了取消/Cancel
    qDebug() << "用户取消操作";
}

2. 需要用户必须做出选择时

// 重要设置对话框,必须让用户选择
SettingsDialog dialog(this);
if (dialog.exec() == QDialog::Accepted) {
    applySettings(dialog.getSettings());
}
// 确保在这里用户已经做出了选择

3. 与 show() 的对比

// 使用 show() - 非模态,立即继续执行
dialog->show();
qDebug() << "这行代码会立即执行";

// 使用 exec() - 模态,等待对话框关闭
dialog->exec();
qDebug() << "这行代码要等对话框关闭后才执行";

实际应用场景

登录对话框

bool MainWindow::checkLogin()
{
    LoginDialog dialog(this);
    if (dialog.exec() == QDialog::Accepted) {
        return dialog.isLoginSuccessful();
    }
    return false;
}

确认对话框

void MainWindow::on_deleteButton_clicked()
{
    QMessageBox msgBox(this);
    msgBox.setText("确定要删除吗?");
    msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
    
    if (msgBox.exec() == QMessageBox::Ok) {
        deleteSelectedItem();  // 用户确认后才执行删除
    }
}

注意事项

  1. 内存管理 - 如果使用 new 创建对话框,记得在适当时候删除
  2. 避免死锁 - 不要在 exec() 对话框内再次调用 exec()
  3. 替代方案 - Qt5 以后推荐使用 open() 方法替代部分 exec() 场景
// 现代写法
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->open();  // 非阻塞的模态对话框

总结exec() 主要用于需要等待用户响应并获取选择结果的场景,它能确保程序流程在关键决策点暂停,直到用户做出明确选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值