关于Qt中QDialog对话框调用exec()函数界面退出造成僵尸程序问题

问题一:

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)。

求助:关于这个问题,学识尚浅,求大佬分析一波

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值