приложение закрывается после возврата в главное окно / c ++ - PullRequest
1 голос
/ 08 января 2020

В моем главном окне я использовал этот код, чтобы открыть свое игровое приложение

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);}

после окончания игры я хочу go вернуться в главное окно. Поэтому я использовал эту функцию

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

Ответы [ 2 ]

4 голосов
/ 08 января 2020

Проблема с кодом в случае:

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

Проблема двоякая: во-первых, вы не можете определить переменные внутри case, как это. Вам нужно добавить область. Я удивлен, что компилятор не кричит на это.

Вторая проблема (и это вызывает вашу проблему) состоит в том, что переменная w является локальной переменная внутри оператора switch. Как только утверждение заканчивается, так же, как и время жизни и w, и оно разрушается и перестает существовать.

Решение (насколько я знаю) кажется простым: не создавайте и не открывайте новое главное окно! Когда вы запускаете игру «космические захватчики», вы никогда не закрываете исходное главное окно, оно все равно должно работать в фоновом режиме.

Однако это очень плохой способ «запустить» то, что по сути должно быть отдельным программа или, по крайней мере, часть вашего обычного программного потока и события l oop. Либо извлеките мини-игру в свою собственную программу, которую вы затем загрузите и выполните, либо не создавайте отдельный объект приложения и просто откройте обычное окно и позвольте основному событию приложения l oop обработать его.

0 голосов
/ 08 января 2020

Используя это, я решил свою проблему

void CSpaceInwaders::onGameOver(){
    this->close();
}
...