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¢ral;
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(¢ral);
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 出现段错误后更新主窗口标题的主要内容,如果未能解决你的问题,请参考以下文章