C++ QDialog正在关闭它';it’这是我自己的,我怎样才能修好它?

C++ QDialog正在关闭它';it’这是我自己的,我怎样才能修好它?,c++,qt,qdialog,C++,Qt,Qdialog,我的类名类似于(它的功能)\ uu(类型)例如:reg\uqdialog 以下是正在执行的dlg的代码,如果接受,则创建QMainWindow: if(log_dlg->exec() == QDialog::Accepted) { find_wnd = new find_QMainWindow(); find_wnd->show(); } log_dlg有2个BTN:“输入”(这是接受结果)和“注册”(打开一个新的dlg) “输入”和“注册”代码在此处: void

我的类名类似于(它的功能)\ uu(类型)例如:reg\uqdialog

以下是正在执行的dlg的代码,如果接受,则创建QMainWindow:

if(log_dlg->exec() == QDialog::Accepted)
{
    find_wnd = new find_QMainWindow();
    find_wnd->show();
}
log_dlg有2个BTN:“输入”(这是接受结果)和“注册”(打开一个新的dlg)

“输入”和“注册”代码在此处:

void log_QDialog::on_btn_enter_clicked()
{
    this->accept();
}

void log_QDialog::on_btn_reg_clicked()
{
    reg_QDialog *reg_dlg = new reg_QDialog();

    this->hide();
    if(reg_wnd->exec() == QDialog::Accepted)
    {
        //code
    }
    this->show();
}
因此,问题是:

Step by step:
1) run the prog    //it starts with dlg_log 
2) "Reg"           //creating dlg_reg 
3) accept dlg_reg  //returning to dlg_log 
4) "Enter"         //trying to create QMainWindow 
QMainWindow is not created, and the app just closed
从reg_dlg“返回”(实际上,只是隐藏然后显示)并用accept result推送btn后,它什么也不做!它只是关闭程序,但它必须显示QMainWindow

main.cpp的所有实际代码:

#include "log_window_root.h"
#include "find_mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    log_window_root * log_wnd;
    find_mainwindow * find_wnd;

    log_wnd = new log_window_root();
    log_wnd->setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
    log_wnd->setModal(true);

    if(log_wnd->exec() == QDialog::Accepted)
    {
        find_wnd = new find_mainwindow();
        find_wnd->setWindowFlags(Qt::MSWindowsFixedSizeDialogHint);
        find_wnd->show();
    }
    return a.exec();
}
#包括“log_window_root.h”
#包括“find_mainwindow.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
log\u window\u root*log\u wnd;
查找主窗口*find\u wnd;
log_wnd=新日志_窗口_根();
log_wnd->setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
log_wnd->setModal(真);
如果(log_wnd->exec()==QDialog::Accepted)
{
find_wnd=新的find_main窗口();
查找->设置窗口标志(Qt::MSWindowsFixedSizeDialogHint);
查找->显示();
}
返回a.exec();
}

q应用程序退出并在最后一个窗口关闭时关闭。 通过将属性设置为false,可以放弃该属性

    QApplication a(argc, argv);
    a.setQuitOnLastWindowClosed(false);
使用这些对话框完成工作后,您可能希望将其恢复到以前的状态


正如@Jens在您问题的另一个答案中提到的,这将在某个点上打破平衡循环,并且QApplication甚至在调用.exec()之前就退出了。因此,您还可以创建零宽度/高度或屏幕外对话框作为对话框的父级。A也是一个很好的候选人。所有对话框都应该是您的启动屏幕子对象。最后,您可以通过调用来完成启动屏幕。

q应用程序退出并在最后一个窗口关闭后关闭。 通过将属性设置为false,可以放弃该属性

    QApplication a(argc, argv);
    a.setQuitOnLastWindowClosed(false);
使用这些对话框完成工作后,您可能希望将其恢复到以前的状态


正如@Jens在您问题的另一个答案中提到的,这将在某个点上打破平衡循环,并且QApplication甚至在调用.exec()之前就退出了。因此,您还可以创建零宽度/高度或屏幕外对话框作为对话框的父级。A也是一个很好的候选人。所有对话框都应该是您的启动屏幕子对象。最后,您可以通过调用来完成启动屏幕。

您的操作稍微超出了Qt的限制。查看文档:

通常,在调用exec()之前不能进行任何用户交互。 作为一种特殊情况,像QMessageBox这样的模态小部件可以在以前使用 调用exec(),因为模态小部件调用exec()来启动本地 事件循环

在Mac OS上测试代码会给你一个可怕的警告

modalSession已提前退出-检查可重入调用 结束

这表明,您正在薄冰上工作,您的代码随时都会崩溃


考虑重新编写代码,以便打开主窗口,然后显示对话框。如果要继续执行对话框序列,请从单击时删除hide()/show()对(这些调用会打乱事件循环)。

您的操作稍微超出了Qt的限制。查看文档:

通常,在调用exec()之前不能进行任何用户交互。 作为一种特殊情况,像QMessageBox这样的模态小部件可以在以前使用 调用exec(),因为模态小部件调用exec()来启动本地 事件循环

在Mac OS上测试代码会给你一个可怕的警告

modalSession已提前退出-检查可重入调用 结束

这表明,您正在薄冰上工作,您的代码随时都会崩溃

考虑重新编写代码,以便打开主窗口,然后显示对话框。如果您想继续对话顺序,请从单击的\u btn\u reg\u中删除hide()/show()对(这些调用会打乱您的事件循环)。

[从问题中重新发布,因为上面的横幅可能会导致人们完全跳过该问题,而且这个问题没有好的答案。]

下面是一个在
QMainWindow
之前显示对话框的非常简单的示例。该对话框仅显示启动或不启动主应用程序的选项。关键点在于QDialog部分发生在创建任何其他小部件之前(如此处的QMainWindow),如果需要,应用程序(
main()
)在此之前退出。没有理由在使用QDialog之后保留它,所以我在堆栈上创建它,然后
delete


int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QDialog*d=新的QDialog();
QPushButton*pbYes=新的QPushButton(“您想玩游戏吗?”,d);
QPushButton*pbNo=新的QPushButton(“让我离开这里!”,d);
连接(pbYes,&QPushButton::单击,[d]({d->done(QDialog::Accepted);});
连接(pbNo,&QPushButton::单击,[d]({d->done(QDialog::拒绝);});
d->setLayout(新的QVBoxLayout);
d->layout()->addWidget(pbYes);
d->layout()->addWidget(pbNo);
const int ret=d->exec();
删除d;
如果(ret==QDialog::拒绝)
返回0;
qmainw;
setCentralWidget(新的QLabel(“欢迎来到游戏!”,&mw));
mw.show();
返回a.exec();
}
[重新发布问题,因为问题顶部的横幅可能会导致人们完全跳过该问题,我想这一问题没有好的答案。]

下面是一个在
QMainWindow
之前显示对话框的非常简单的示例。该对话框仅显示启动或不启动主应用程序的选项。关键点在于QDialog部分发生在创建任何其他小部件之前(如此处的QMainWindow),如果需要,应用程序(
main()
)在此之前退出。没有理由在使用QDialog之后保留它,所以我在堆栈上创建它并
delete