【问题标题】:app.exec() does not return on window closeapp.exec() 不会在窗口关闭时返回
【发布时间】:2021-07-19 20:36:18
【问题描述】:

我在 Visual Studio 中有一个简单的 Qt 应用程序:

int main(int argc, char* argv[]){
QApplication app(argc, argv);
Myclass* c = new MyClass;

c->show();
int ret = app.exec();
return ret;
}

但是当我关闭窗口时我的应用程序没有返回(在调试模式下,app.exec() 没有返回)。 Qt Qtwebengineprocessd 进程和子进程仍在执行中。

如何在 Visual Studio 中控制/调试我的应用程序被阻止的原因/位置?

【问题讨论】:

  • MyClass 不是 Qt 提供的类,因此在不知道 MyClass 是如何实现的情况下,无法判断其中是否存在错误。除此之外,您显示的代码将无法编译:Myclass*new MyClass 不匹配。发布代码时,请发布 minimal reproducible example 的实际副本和过去,否则,我们无法确定什么是拼写错误,什么是错误。
  • MyClass,是我的类定义。但我问过 Visual Studio 中是否有办法调试/控制我的应用程序被阻止的位置?
  • 理论上你可以在 Qt 代码中(在它的事件循环中)设置一些断点来查看它为什么仍然处于活动状态。哪里取决于您使用的 qt 的实际版本。但是了解 Qt 的内部结构并不是那么容易。问题可能出在您的 MyClass 实现中,因此您将检查其代码是否在逻辑上正确,而不是使用断点。
  • 我的班级在 Marble kde 的实现中,大量使用了 Qt。我必须控制是否正确调用 Marble 析构函数。目前我使用 Qt 5.13。谢谢。
  • 我也有这个问题,当我运行时没问题,但是当我使用 debug 时,我的程序在(app.exec()) 的那一行崩溃了,并没有告诉我为什么会这样。

标签: c++ qt


【解决方案1】:

根据Qt documentation for exec,您必须致电QApplication::exit(code)QApplication::quit() for exec 才能返回。当您在 MyClass 小部件中检测到 QCloseEvent 时,您可能应该调用这些函数之一。

【讨论】:

【解决方案2】:

如果实例化MarbleWidget类的类有QMainWindow(parent)可以加void MyClass::closeEvent(QCloseEvent *e){delete c;}

如果没有 QMainWindows 或 QDialBox 在 main 中添加: app.closeAllWindows() 在析构函数中: QApplication::quit();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多