首页 > 解决方案 > exec 出现段错误后更新主窗口标题

问题描述

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

标签: c++windowsqt

解决方案


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

示例应用程序的屏幕截图

// https://github.com/KubaO/stackoverflown/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;
}

推荐阅读