返回主 window / c++ 后应用程序正在关闭
app is closing after going back to main window / c++
在我的主 window 中,我使用此代码打开我的游戏应用程序
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);}
比赛结束后我想回到主场window。所以我用了这个函数
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();
}}
这让我回到主界面 window 但几秒钟后它关闭了。
我想知道如何解决这个问题
注:使用QT创建
案例中的代码有问题:
case QMessageBox::Ok:
close();
MainWindow w;
w.show();
问题有两个方面:首先,您实际上不能像这样在 case
中定义变量。您需要添加范围。我很惊讶编译器没有为此对你大喊大叫。
第二个问题(也是导致你的问题的原因)是变量 w
是一个 local 变量switch
声明。一旦语句结束,生命周期和 w
也会被破坏并不再存在。
解决方案(据我所知)似乎很简单:不要创建和打开新的主 window!当您启动 "space invaders" 游戏时,您永远不会关闭原来的主 window,它应该仍然是 运行 在后台。
然而,对于 "run" 本质上应该是一个单独的程序或至少是正常程序流和事件循环的一部分来说,这是一种非常糟糕的方法。要么将迷你游戏提取到它自己的程序中,然后加载并执行,要么不创建单独的应用程序对象,只打开一个普通的 window 并让主应用程序事件循环处理它。
使用这个我解决了我的问题
void CSpaceInwaders::onGameOver(){
this->close();
}
在我的主 window 中,我使用此代码打开我的游戏应用程序
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);}
比赛结束后我想回到主场window。所以我用了这个函数
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();
}}
这让我回到主界面 window 但几秒钟后它关闭了。
我想知道如何解决这个问题
注:使用QT创建
案例中的代码有问题:
case QMessageBox::Ok:
close();
MainWindow w;
w.show();
问题有两个方面:首先,您实际上不能像这样在 case
中定义变量。您需要添加范围。我很惊讶编译器没有为此对你大喊大叫。
第二个问题(也是导致你的问题的原因)是变量 w
是一个 local 变量switch
声明。一旦语句结束,生命周期和 w
也会被破坏并不再存在。
解决方案(据我所知)似乎很简单:不要创建和打开新的主 window!当您启动 "space invaders" 游戏时,您永远不会关闭原来的主 window,它应该仍然是 运行 在后台。
然而,对于 "run" 本质上应该是一个单独的程序或至少是正常程序流和事件循环的一部分来说,这是一种非常糟糕的方法。要么将迷你游戏提取到它自己的程序中,然后加载并执行,要么不创建单独的应用程序对象,只打开一个普通的 window 并让主应用程序事件循环处理它。
使用这个我解决了我的问题
void CSpaceInwaders::onGameOver(){
this->close();
}