Qt退出应用程序并显示另一个窗口

时间:2018-01-13 02:59:00

标签: c++ qt

我正在制作一个qt射击游戏,一旦发现碰撞,我想退出应用程序并显示另一个得分窗口。这应该发生在attack.cpp中。

时如何做到这一点
   QApplication a(argc, argv);
   return a.exec();

在main.cpp?

attack.cpp就像这样

void Attack::move()
{
    QList<QGraphicsItem *> colliding_att=collidingItems();
    for(int i=0; i<colliding_att.size(); ++i){
        if(typeid(*(colliding_att[i]))==typeid(Player)){
            scene()->removeItem(this);
            delete this;

            qDebug()<<SCORE;
          //code that will close the app and open a new window with 
          //text "Your score is"<<SCORE";

            return;
        }
    }

1 个答案:

答案 0 :(得分:2)

这就是它的工作原理 - testQWinSeq.cc

#include <QtWidgets>

int main(int argc, char **argv)
{
  QApplication app(argc, argv);
  QLabel win1(QString::fromUtf8("GAME"));
  win1.show();
  app.exec();
  win1.hide();
  QLabel win2(QString::fromUtf8("Score"));
  win2.show();
  return app.exec();
}

首先打开一个带有文本“GAME”的窗口。关闭后,它会打开第二个窗口“Score”。

再次阅读你的问题后,我意识到你的实际问题可能是:如何摆脱游戏。因此,我稍微修改了样本testQWinSeq.cc

#include <QtWidgets>

int main(int argc, char **argv)
{
  QApplication app(argc, argv);
  // setup 1st GUI
  QPushButton win1(QString::fromUtf8("GAME - Click to Finish"));
  win1.show();
  // install signal handler
  QObject::connect(&win1, &QPushButton::clicked,
    []() { QApplication::quit(); });
  // run
  app.exec();
  // setup 2nd GUI
  win1.hide();
  QLabel win2(QString::fromUtf8("Score"));
  win2.show();
  // run again
  return app.exec();
}

我让win1成为QPushButton来模拟“游戏结束”。 (这是我连接到QPushButton::clicked信号的lambda中发生的情况。)

我只是致电QApplication::quit()。所以,这个名字可能有点误导。实际上,它不会退出应用程序。相反,它只退出在app.exec()内驱动的事件循环。您可以尝试自己,再次调用app.exec()(以及另一个主窗口)不是问题。

我必须承认我可以连接QApplication::quit()(不将其包裹在lambda中),因为它的签名与QPushButton::clicked信号完全匹配。

我写了一个QMake文件testQWinSeq.pro来演示:

SOURCES = testQWinSeq.cc

QT += widgets

并在Window 10(64位)的cygwin bash中进行了测试:

$ qmake-qt5 testQWinSeq.pro

$ make
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQWinSeq.o testQWinSeq.cc
g++  -o testQWinSeq.exe testQWinSeq.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 

$ ./testQWinSeq

Snapshot of ./testQWinSeq – 1<sup>st</sup> window

→点击按钮

Snapshot of ./testQWinSeq – 2<sup>nd</sup> window

$

最后一点:

如果win1.hide();的2 nd 运行仅显示app.exec(),则win2是必不可少的。可以肯定的是,我对它进行了测试评论。如果未调用,则在app.exec()的2 nd 运行中出现两个窗口。