返回主窗口后应用程序正在关闭/ C++

Posted

技术标签:

【中文标题】返回主窗口后应用程序正在关闭/ C++【英文标题】:app is closing after going back to main window / c++ 【发布时间】:2020-01-08 07:28:54 【问题描述】:

在我的主窗口中,我使用此代码打开了我的游戏应用程序

void MainWindow::on_playButton_clicked()   
    CSpaceInwaders* pGame = new CSpaceInwaders(qApp->screens()[0]->size());
    pGame->showFullScreen();
    pGame->Run();

这就是我调用的运行函数

void CSpaceInwaders::Run()
scene()->clear();
setCursor(Qt::BlankCursor);

m_pCannon =new CCannon(EColor::Red);
m_pCannon->setPos(m_onScreenSize.width()/2,m_onScreenSize.height()-gCannonSize.height());
m_pCannon->setFlag(QGraphicsItem::ItemIsFocusable);
m_pCannon->setFocus();
scene()->addItem(m_pCannon);

connect(m_pCannon, &CCannon::sigIncreaseScore,this,&CSpaceInwaders::onIncreaseScore);
connect(m_pCannon, &CCannon::sigDecreseScore,this,&CSpaceInwaders::onDecreseScore);

m_pPoints = new CPoints();
scene()->addItem(m_pPoints);

QTimer* pTimer = new QTimer(this);
connect(pTimer, &QTimer::timeout,this,&CSpaceInwaders::onCreateEnemy);
pTimer->start(2000);

比赛结束后我想回到我的主窗口。所以我用了这个功能

void CSpaceInwaders::onGameOver()
scene()->clear();
QMessageBox msgBox;
msgBox.setText("Game.");
msgBox.setInformativeText("You got hit ! Game Over");
msgBox.setStandardButtons(QMessageBox::Ok);
int ret = msgBox.exec();
switch (ret) 
  case QMessageBox::Ok:
    close();
    MainWindow w;
    w.show();

这会将我带回主窗口,但几秒钟后它会关闭。

我想知道如何解决这个问题

注意:使用 QT 创建

【问题讨论】:

【参考方案1】:

问题出在案例中的代码上:

case QMessageBox::Ok:
    close();
    MainWindow w;
    w.show();

问题有两个方面:首先,您实际上不能像这样在case 中定义变量。您需要添加一个范围。我很惊讶编译器没有为此对你大喊大叫。

第二个问题(这是导致您的问题的原因)是变量 wswitch 语句中的 local 变量。一旦语句结束,生命周期和w 也将结束,它被破坏并不复存在。

解决方案(据我所知)似乎很简单:不要创建并打开新的主窗口!当你启动“太空侵略者”游戏时,你永远不会关闭原来的主窗口,它应该仍然在后台运行。

但是,这是“运行”本质上应该是一个单独的程序或至少是正常程序流和事件循环的一部分的非常糟糕的方式。要么将小游戏提取到它自己的程序中,然后加载并执行,要么不创建单独的应用程序对象,只打开一个普通窗口,让主应用程序事件循环处理它。

【讨论】:

谢谢。你能建议我一个代码来显示原始主窗口并关闭这个吗【参考方案2】:

使用这个我解决了我的问题

void CSpaceInwaders::onGameOver()
    this->close();

【讨论】:

以上是关于返回主窗口后应用程序正在关闭/ C++的主要内容,如果未能解决你的问题,请参考以下文章

c++程序运行后黑色小窗口自动关闭,怎么回事?

禁用主窗口的标题上下文菜单

WINFORM如何关闭主窗口?

wpf关闭主窗口询问“退出”的问题

Qt 中的主应用程序窗口和对话交互

python TKinter的主窗口运行程序完毕后,怎么让其自动关闭