我正在制作一个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;
}
}
答案 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
→点击按钮
$
最后一点:
如果win1.hide();
的2 nd 运行仅显示app.exec()
,则win2
是必不可少的。可以肯定的是,我对它进行了测试评论。如果未调用,则在app.exec()
的2 nd 运行中出现两个窗口。