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

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

Qt,可以使用槽函数从一个对话框调用另一个对话框。下面是一个简单的示例: 1. 首先,在第一个对话框,添加一个按钮。在按钮的槽函数,创建第二个对话框,并调用它的exec函数以显示对话框。 ```cpp // 点击第一个对话框的按钮时,调用此槽函数 void FirstDialog::onButtonClicked() { SecondDialog secondDialog; secondDialog.exec(); } ``` 2. 在第二个对话框的构造函数,设置对话框的属性和布局。例如,可以添加一些标签和按钮。 ```cpp SecondDialog::SecondDialog(QWidget *parent) : QDialog(parent) { // 设置对话框的标题 setWindowTitle(tr("Second Dialog")); // 创建标签和按钮 QLabel *label = new QLabel(tr("This is the second dialog.")); QPushButton *button = new QPushButton(tr("Close")); // 将标签和按钮添加到布局 QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(label); layout->addWidget(button); setLayout(layout); // 连接按钮的槽函数 connect(button, SIGNAL(clicked()), this, SLOT(accept())); } ``` 3. 在第一个对话框的构造函数,连接按钮的槽函数。这将确保当用户单击按钮时,第二个对话框将被创建和显示。 ```cpp FirstDialog::FirstDialog(QWidget *parent) : QDialog(parent), ui(new Ui::FirstDialog) { ui->setupUi(this); // 连接按钮的槽函数 connect(ui->button, SIGNAL(clicked()), this, SLOT(onButtonClicked())); } ``` 这样,在第一个对话框单击按钮时,第二个对话框将被创建和显示。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值