【问题标题】:Updating main window title after exec gets segment faultexec 出现段错误后更新主窗口标题
【发布时间】: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 毫无意义,因为此时主窗口将被隐藏(用户已关闭它以退出应用程序),但更改其名称不会受到伤害。因此,请显示导致此问题的代码。这不寻常。

标签: c++ windows qt


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您很可能尝试使用已销毁的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多