exec() 是 Qt 中模态对话框的核心方法,它的用法和特点如下:
exec() 的用法和作用
QDialog *dialog = new QDialog(this);
dialog->resize(200, 100);
int result = dialog->exec(); // 执行模态对话框
exec() 的特点
- 阻塞执行 - 程序会停在
exec()这一行,直到对话框关闭 - 返回结果 - 返回
QDialog::Accepted或QDialog::Rejected - 事件循环 - 启动一个局部的事件循环,处理该对话框的事件
为什么需要使用 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(); // 用户确认后才执行删除
}
}
注意事项
- 内存管理 - 如果使用
new创建对话框,记得在适当时候删除 - 避免死锁 - 不要在
exec()对话框内再次调用exec() - 替代方案 - Qt5 以后推荐使用
open()方法替代部分exec()场景
// 现代写法
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->open(); // 非阻塞的模态对话框
总结:exec() 主要用于需要等待用户响应并获取选择结果的场景,它能确保程序流程在关键决策点暂停,直到用户做出明确选择。
268

被折叠的 条评论
为什么被折叠?



