这段代码存在一些问题,导致程序异常退出,具体如下:

  1. Manage 类的构造函数中,连接了 loginon 按钮的点击信号与 loginUser 槽函数,但是在槽函数中使用了 ui->username->text()ui->password->text() 获取用户名和密码,这两个控件并没有在构造函数中初始化,可能会导致程序崩溃。需要在构造函数中初始化这两个控件。

  2. Manage 类的 loginUser 函数中,将登录成功后跳转到其他页面的逻辑写在了 else 分支中,但是在当前代码中并没有实现具体的页面跳转逻辑,需要根据实际需求添加跳转逻辑。

  3. users 类的构造函数中,连接了 Manage 类的 registerUser 信号与 users 类的 closeWidget 槽函数,但是在槽函数中使用了 w 指针,但是该指针并没有在构造函数中初始化,可能会导致程序崩溃。需要在构造函数中初始化该指针。

  4. users 类的 closeWidget 槽函数中,调用了 this->close() 关闭当前窗口,但是并没有关闭应用程序的主窗口。需要在关闭当前窗口之后,关闭应用程序的主窗口。

  5. users 类的 closeEvent 函数中,弹出了一个确认关闭窗口的提示框,但是并没有根据用户的选择进行相应的操作。需要根据用户的选择来决定是否关闭窗口。

解决方案:

  1. Manage 类的构造函数中初始化 ui->usernameui->password 控件。

  2. Manage 类的 loginUser 函数中,根据登录结果进行页面跳转,例如使用 QMainWindow 创建新的主窗口,并调用 show() 显示新窗口,然后关闭当前窗口。

  3. users 类的构造函数中初始化 w 指针,将其指向 Manage 对象。

  4. users 类的 closeWidget 槽函数中,调用 QApplication::quit() 关闭应用程序的主窗口。

  5. users 类的 closeEvent 函数中,根据用户选择的确认按钮 (Yes 或 No) 决定是否调用 e->accept() 接受关闭事件,或者调用 e->ignore() 忽略关闭事件。

代码示例:

// manage.cpp
#include "manage.h"
#include "ui_manage.h"
#include "sqlite.h"
#include "reg.h"
#include <QPushButton>
#include <QLineEdit>
#include <QSqlQuery>
#include <QSqlDatabase>
#include <QSqlError>
#include <QMessageBox>
#include <QDebug>
#include <QCloseEvent>
Manage::Manage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Manage)
{
    ui->setupUi(this);

    connect(ui->loginon,&QPushButton::clicked,this,[=](){loginUser(ui->username->text(),ui->password->text());});
    connect(ui->registe,&QPushButton::clicked,this,[=](){emit closeButtonClicked();registerUser();});
   // connect(ui->registe,&QPushButton::clicked,this,[=](){emit closeButtonClicked();});
   // connect(ui->loginon,&QPushButton::clicked,this,[=](){emit closeButtonClicked();});

}
Manage::~Manage()
{
    delete ui;
}
void Manage::loginUser(QString username,QString passwd)
{
    Sqlite::sqlite_init();
    QSqlQuery query;
    QString sql=QString("SELECT * FROM users WHERE username = ' %1 ' AND passwd = ' %2 ' ").arg(username).arg(passwd);
    if (!query.exec(sql)) {
                qDebug() << "查询失败:" << query.lastError().text();

            }
    //判断执行结果
    if(!query.next())
    {
        qDebug() << "登录失败!" << query.lastError();
        QMessageBox::information(this,"登录认证","登录失败,账户或者密码错误");
    }
    else
    {
        qDebug() << "登录成功!";
        QMessageBox::information(this,"登录认证","登录成功");
        //登录成功后可以跳转到其他页面(未设计)
        QWidget *w = new QWidget;
        w->show();
        this->close();

    }
}

void Manage::registerUser()
{
    this->close();
    Reg *s=new Reg;
    s->show();
}

//void Manage::closeWindow()
//{
//    this->close();
//    QCloseEvent* closeEvent = new QCloseEvent();
//    QCoreApplication::postEvent(QApplication::instance(), closeEvent);
//}


#define MANAGE_H

#include <QWidget>

namespace Ui {
class Manage;
}

class Manage : public QWidget
{
    Q_OBJECT

public:
    explicit Manage(QWidget *parent = nullptr);
    ~Manage();
    void loginUser(QString username,QString password);
    void registerUser();

private:
    Ui::Manage *ui;

//public slots:
//   void closeWindow();
signals:
    void closeButtonClicked();
};

#endif // MANAGE_H


#include "users.h"
#include "ui_users.h"
#include <QCloseEvent>
#include <QMessageBox>
users::users(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::users)
{
    ui->setupUi(this);
    displayLogin();
    w = new Manage;
    connect(w, &Manage::registerUser, this, &users::closeWidget);

}
users::~users()
{
    delete ui;
}

//设置登录界面
void users::displayLogin()
{
    resize(420,280);
    setWindowTitle("智能管家");
    //设置ui组件背景
    setAutoFillBackground(true);
    QPalette palette=this->palette();
    QPixmap pixmap(":/user/image/image/OIP-C.jpg");
    palette.setBrush(QPalette::Window, QBrush(pixmap));
    setPalette(palette);
    setFixedSize(420,280);
}

//void users::closeEvent(QCloseEvent *e)
//{
    //窗口关闭时弹出的提示窗口
 //   QMessageBox::StandardButton reply;
  //   reply = QMessageBox::information(this,"提示","确认退出?",QMessageBox::Yes|QMessageBox::No);
   //     if(reply == QMessageBox::Yes){
            //若用户点击确认,则接收这个事件,当前窗口会关闭
//            e->accept();
 //       }else{
  //          //若用户点击取消,则忽略这个事件,当前窗口不会关闭
 //           e->ignore();
 //       }
//}

void users::closeWidget()
{
    this->close();
    QApplication::quit(); // 关闭主窗口

}
#ifndef USERS_H
#define USERS_H

#include <QWidget>
class Manage;
namespace Ui {
class users;
}

class users : public QWidget
{
    Q_OBJECT

public:
    explicit users(QWidget *parent = nullptr);
    ~users();
    void displayLogin();
    //void closeEvent(QCloseEvent*);

private:
    Ui::users *ui;
    Manage *w;
public slots:
void closeWidget();

};

#endif // USERS_H

这些修改可以解决代码中的异常退出问题,并使程序更稳定可靠。建议开发者在编写代码时,注意代码逻辑,并及时进行测试,以避免出现类似问题。

C++ Qt 异常退出问题分析及解决方案

原文地址: https://www.cveoy.top/t/topic/fzQC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录