QT6应用启动失败:退出码139(信号11:SIGSEGV)问题排查求助
首先,你的代码里有两个关键问题直接导致了段错误,我来一步步帮你梳理清楚:
1. 未初始化的空指针触发内存访问错误
你在Login.h里自己声明了QPushButton * loginButton;、QLineEdit * passwordInput;、QLineEdit * usernameInput;这三个成员变量,但实际上Qt的UI编译器已经在自动生成的ui_Login.h里帮你创建了这些控件的指针,你可以通过ui->loginButton这类方式直接访问。
你自己声明的这三个指针从来没有被初始化过(没有指向任何实际的控件对象),当你在构造函数里执行:
QObject::connect(loginButton, &QPushButton::clicked, this, &Login::buttonPressed);
这里的loginButton是一个空指针,程序尝试访问它的成员时就会触发SIGSEGV段错误。
解决方法:
删除Login.h里自己声明的这三个成员变量,直接使用ui指针提供的控件:
// Login.h 中删除以下三行 // QPushButton * loginButton; // QLineEdit * passwordInput; // QLineEdit * usernameInput;
然后把构造函数里的connect语句改成:
QObject::connect(ui->loginButton, &QPushButton::clicked, this, &Login::buttonPressed);
2. 错误替换QMainWindow的Central Widget导致控件布局崩溃
你在Login构造函数里执行了:
this->setCentralWidget(new QWidget(this));
这会把QMainWindow默认的central widget替换成一个空的QWidget,而UI文件里创建的所有控件(用户名输入框、密码框、登录按钮)都是直接作为Login窗口的子控件存在的,替换central widget后,这些控件的父对象关系和布局会被破坏,进而引发内存访问问题。
解决方法:
直接删除这行setCentralWidget的代码,Qt Designer生成的UI已经帮你处理好了窗口的布局和控件放置逻辑。
修改后的完整代码示例
Login.h(修改后)
#ifndef RESTCLIENT_LOGIN_H #define RESTCLIENT_LOGIN_H #include <QWidget> #include <QPushButton> #include <QLineEdit> #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class Login; } QT_END_NAMESPACE class Login : public QMainWindow { Q_OBJECT public slots: void buttonPressed(); public: explicit Login(QWidget *parent = nullptr); ~Login() override; private: Ui::Login *ui; }; #endif //RESTCLIENT_LOGIN_H
Login.cpp(修改后)
#include "Login.h" #include "ui_Login.h" Login::Login(QWidget *parent) : QMainWindow(parent), ui(new Ui::Login) { ui->setupUi(this); // 使用ui指针访问自动生成的控件 QObject::connect(ui->loginButton, &QPushButton::clicked, this, &Login::buttonPressed); } Login::~Login() { delete ui; } void Login::buttonPressed() { // 现在可以正常获取输入内容处理登录逻辑了 QString username = ui->usernameInput->text(); QString password = ui->passwordInput->text(); // todo process login }
这样修改后,程序应该就能正常运行,不会再出现段错误了。作为Qt新手,要记住:用Qt Designer创建UI后,所有控件都通过ui->控件名来访问,不要自己重复声明同名指针,否则很容易踩空指针的坑。
内容的提问来源于stack exchange,提问作者saltycoder815




