【问题标题】:End Game Function结束游戏功能
【发布时间】:2021-07-02 07:25:04
【问题描述】:

一旦玩家生命耗尽,我会尝试显示“游戏结束”。但是,它在游戏结束后永远不会显示。这是一些示例代码。

void Game::end()
{
  QGraphicsTextItem *text = new QGraphicsTextItem("GameOver");

  text->setPos(400, 500);

  scene->addItem(text);

  sleep(2);
  QApplication::quit();
}

【问题讨论】:

  • 尝试切换text->setPos(400, 500);scene->addItem(text); 行的顺序。首先添加项目,然后更改其相对于您已添加到的场景的位置。
  • 什么是sleep(2);?它可能会阻塞 GUI 线程,因此您不会看到它已更新。
  • 但是,游戏结束后它永远不会显示这不会是因为QApplication::quit();记住绘图发生在你的函数返回之后.使用 QTimer::SingleShot 延迟退出
  • 添加更多关于调用函数的代码。这将有助于贡献者更多地了解您的问题。
  • drecherjm,成功了。感谢您的帮助!

标签: qt qgraphicstextitem


【解决方案1】:

你没有得到想要的结果,因为绘图发生在它被内部调用的函数返回之后,并且它永远不会返回,因为你之前退出了应用程序。正如drescherjm 指出的那样,尝试使用QTimer::SingleShot 来延迟退出。像这样:

QTimer::singleShot(1000, [](){
    QApplication::exit();
});

因此QApplication::exit() 在给定的时间间隔内被调用,此时Game::end() 应该返回。

【讨论】:

  • 乔治,非常感谢您的帮助。你能解释一下你上面的函数的语法吗?我看到了 Qtimer::singleShot(myTime, myObject, SLOT(myMethodInMyObject())); 的正常语法但是,我以前从未见过这种语法。
  • @DerrickMullins 上面代码的[](){QApplication::exit();} 部分称为 lambda 函数。它是许多现代编程语言的一部分,包括 C++。信号槽连接的新语法允许您将信号连接到 lambda 函数。这是一种非常方便的方式来编写“在发出特定信号时执行某些操作”的行为,而无需在界面中添加额外的插槽
  • lambda 表达式是 2011 标准中对 c++ 语言的补充。 c++11。 Qt 从 Qt5 开始通过信号和槽支持它们。相关:https://en.cppreference.com/w/cpp/language/lambda
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多