You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

QT6应用启动失败:退出码139(信号11:SIGSEGV)问题排查求助

解决QT6程序退出码139(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

火山引擎 最新活动