C++ Qt 异常退出问题分析及解决方案
这段代码存在一些问题,导致程序异常退出,具体如下:
-
在
Manage类的构造函数中,连接了loginon按钮的点击信号与loginUser槽函数,但是在槽函数中使用了ui->username->text()和ui->password->text()获取用户名和密码,这两个控件并没有在构造函数中初始化,可能会导致程序崩溃。需要在构造函数中初始化这两个控件。 -
在
Manage类的loginUser函数中,将登录成功后跳转到其他页面的逻辑写在了else分支中,但是在当前代码中并没有实现具体的页面跳转逻辑,需要根据实际需求添加跳转逻辑。 -
在
users类的构造函数中,连接了Manage类的registerUser信号与users类的closeWidget槽函数,但是在槽函数中使用了w指针,但是该指针并没有在构造函数中初始化,可能会导致程序崩溃。需要在构造函数中初始化该指针。 -
在
users类的closeWidget槽函数中,调用了this->close()关闭当前窗口,但是并没有关闭应用程序的主窗口。需要在关闭当前窗口之后,关闭应用程序的主窗口。 -
在
users类的closeEvent函数中,弹出了一个确认关闭窗口的提示框,但是并没有根据用户的选择进行相应的操作。需要根据用户的选择来决定是否关闭窗口。
解决方案:
-
在
Manage类的构造函数中初始化ui->username和ui->password控件。 -
在
Manage类的loginUser函数中,根据登录结果进行页面跳转,例如使用QMainWindow创建新的主窗口,并调用show()显示新窗口,然后关闭当前窗口。 -
在
users类的构造函数中初始化w指针,将其指向Manage对象。 -
在
users类的closeWidget槽函数中,调用QApplication::quit()关闭应用程序的主窗口。 -
在
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
这些修改可以解决代码中的异常退出问题,并使程序更稳定可靠。建议开发者在编写代码时,注意代码逻辑,并及时进行测试,以避免出现类似问题。
原文地址: https://www.cveoy.top/t/topic/fzQC 著作权归作者所有。请勿转载和采集!