问题一:
QDialog对话框调用exec()函数造成僵尸程序
问题描述:
我想要在主界面程序前做一个登陆窗口,成功登陆后登录窗口关闭,显示主界面。使用QDialog对话框实现该功能。
代码如下:
当关闭窗口后,程序依然运行
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog_Login dialog;
Widget_Main mainForm;
//test 1
/**
* BUG:当关闭dialog窗体时,会产生僵尸程序
*
*/
//模态对话框,用户关闭时返回QDialogCode结果
if(dialog.exec() == QDialog::Accepted)
{
mainForm.show();
}
return a.exec();
}
原因分析:
个人理解:dialog窗体关闭时,执行了a.exec(),而这个函数的作用是
进入主事件循环并等待直到调用exit()
,此时窗体已经关闭了,但是程序进入了主事件循环等待中,无法触发exit()退出程序,所以就造成了僵尸程序的现象。
解决方案:
//修改后正常,代码如下:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog_Login dialog;
Widget_Main mainForm;
//test 2
if(dialog.exec() == QDialog::Accepted)
{
mainForm.show();
return a.exec();
}
return 0;
}
问题二:
关于Qt中QDialog对话框调用exec()函数的退出问题
问题描述:
继承问题一
的场景,当判断登陆成功时需要将对话框结果设置为QDialog::Accepted并关闭登陆窗口。
代码如下:
//判断是否登陆成功
if((account.compare("s") != 0) && (passWord.compare("s") != 0))
{
this->setResult(QDialog::Rejected); //对话框结果设置为Rejected 0
QMessageBox::warning(this,"提示","用户名或密码错误",QMessageBox::Ok);
}else
{
//方式一
//this->done(QDialog::Accepted); //关闭窗口
//方式二
//this->accept(); //隐藏窗口,Accepted
//方式三
//BUG:调用close()后返回值为 0,即对话框结果为QDialog::Rejected
//this->setResult(QDialog::Accepted); //对话框结果设置为Accepted 1
//this->close();
}
我测试了三种方式设置对话框返回结果,但是方式三结果无效。当窗口关闭后,QDialog::exec()的返回值仍然为QDialog::Rejected(0)。