我的班级名称就像(做什么)_(类型),例如:reg_QDialog
这里是执行中的dlg的代码,如果被接受,则创建QMainWindow:
if(log_dlg->exec() == QDialog::Accepted)
{
find_wnd = new find_QMainWindow();
find_wnd->show();
}
log_dlg具有2个btns:“ Enter”(这是接受结果)和“ Reg”(打开新的dlg)
“ Enter”和“ Reg”代码在这里:
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中“返回”(实际上只是隐藏然后显示),然后将btn与accept结果一起推送,它什么都不做!它只是关闭程序,但必须显示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();
}
您的操作超出了Qt的限制。查看文档:
通常,在调用exec()之前不能进行任何用户交互。作为一种特殊情况,可以在使用诸如QMessageBox之类的模式小部件之前调用exec(),因为模式小部件调用exec()以启动本地事件循环。
在Mac OS上测试代码会给您可怕的警告
modalSession已提前退出-检查可重入呼叫到endModalSession
这表明您正在努力工作,您的代码将随时中断。
考虑重新编写代码,以便MainWindow出现,然后显示对话框。如果要继续使用Dialog序列,请从on_btn_reg_clicked中删除hide()/ show()对(这些调用会弄乱事件循环)。
QApplication退出并在最后一个窗口关闭时关闭。您可以通过将QApplication::quitOnLastWindowClosed属性设置为false来放弃它。
QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(false);
当您使用这些对话框完成工作时,您可能希望将其恢复为以前的状态。
正如@Jens在问题的另一个答案中提到的那样,这将在某些时候中断evenloop,甚至在调用a.exec()之前QApplication都会退出。因此,您也可以创建一个零宽度/高度或屏幕外的QWidget作为对话框的父级。为此,QSplashScreen也很合适。您的所有对话框都应该是您的初始屏幕子级。最后,您可以通过调用QSplashScreen::finish完成初始屏幕。