exec 出现段错误后更新主窗口标题

Posted

技术标签:

【中文标题】exec 出现段错误后更新主窗口标题【英文标题】:Updating main window title after exec gets segment fault 【发布时间】:2019-10-09 13:28:57 【问题描述】:

如果我在 main.cpp 中调用 a.exec() 之后调用 MainWindow 函数 setWindowTitle,我会收到段错误 (C000 0005)。 gui运行后有什么方法可以更改窗口标题。我不相信这是 WIN 10 的限制,因为我可以使用 tkinter 在 python 中做到这一点。我正在使用 qtcreator,但没有 QML 表单。

【问题讨论】:

您的代码有错误。当然,如果代码正确,我们可以随时设置窗口标题。 exec() 返回时,GUI 运行完毕,您应该退出main 函数。您需要在应用程序运行时或在显示窗口之前设置窗口标题。但这只是为了消除您对如何使用exec() 的误解。在exec() 返回之后执行setWindowTitle 毫无意义,因为此时主窗口将被隐藏(用户已关闭它以退出应用程序),但更改其名称不会受到伤害。因此,请显示导致此问题的代码。这不寻常。 【参考方案1】:

我的问题是由于我试图通过 MainWindow 函数使用指向我的主窗口的指针。实际上它有点复杂,因为我实际上是在另一个类中调用一个函数。解决方案是将 this 指针传递给另一个类中的函数。

【讨论】:

【参考方案2】:

您很可能尝试使用已销毁的 MainWindow 实例。可能你错误​​地在窗口上设置了QT_WADeleteOnClose 属性。以下独立示例演示了此问题。该属性可能在.ui文件中设置,您可能不知道。

// https://github.com/KubaO/***n/tree/master/questions/mainwindow-crash-double-delete-58305305
#include <QtWidgets>

class Window : public QMainWindow 
   QWidget central;
   QGridLayout layout&central;
   QLabel label"Hello, World!";
   QCheckBox crash"Crash on exit";
public:
   static bool alive;
   Window() 
      alive = true;
      layout.addWidget(&label, 0, 0);
      layout.addWidget(&crash, 1, 0);
      setCentralWidget(&central);
      connect(&crash, &QCheckBox::toggled, this, [this]()
         setAttribute(Qt::WA_DeleteOnClose, crash.isChecked());
      );
   
   ~Window() 
      qDebug() << __FUNCTION__;
      alive = false;
   
;
bool Window::alive;

int main(int argc, char *argv[])

   QApplication a(argc, argv);
   int rc;
   
      Window w;
      w.show();
      rc = a.exec();
      Q_ASSERT(w.alive);
      w.setWindowTitle("A New Title Awaits");
      qDebug() << "We're past w.setWindowTitle()";
   
   return rc;

【讨论】:

以上是关于exec 出现段错误后更新主窗口标题的主要内容,如果未能解决你的问题,请参考以下文章

服务器正常运行一段时间后就会出数据库连接错误[代码:01]

在c ++中执行后出现“段错误”错误[关闭]

一段时间后出现错误:“内容类型与 JSON 不兼容”

呈现窗口时出现 Gtkmm 分段错误

这段代码有啥错误

CUDA 矩阵加法段错误