c++ - 如何解决 Qt C++ SIGSEV 错误问题?
问题描述
我正在使用 Qt 构建一个简单的 GUI 电话簿应用程序,但我被卡住了。我有 3 个类:contacts、editcontact 和 newcontact。
联系人.h
class Contacts : public QMainWindow
{
Q_OBJECT
public:
explicit Contacts(QWidget *parent = nullptr);
~Contacts();
void save_contact(std::string name, long long phone, std::string email);
void edit_contact(std::string name, long long phone, std::string email);
private:
Ui::Contacts *ui;
std::map<std::string, Person> phonebook;
};
#endif // CONTACTS_H
新联系人.h
class NewContact : public QDialog
{
Q_OBJECT
public:
explicit NewContact(QWidget *parent = nullptr);
void save_details();
~NewContact();
private slots:
void on_save_button_clicked();
void on_cancel_button_clicked();
private:
Ui::NewContact *ui;
Contacts *contact;
};
新联系人.cpp
#include <QMessageBox>
#include <QDoubleValidator>
#include <iostream>
#include "newcontact.h"
#include "ui_newcontact.h"
#include "data_store.h"
#include "person.h"
NewContact::NewContact(QWidget *parent) :
QDialog(parent),
ui(new Ui::NewContact)
{
ui->setupUi(this);
ui->phone_edit->setValidator( new QDoubleValidator(0, 100, 2, this) );
}
void NewContact::save_details()
{
std::string name;
long long phone;
std::string email;
if(!(ui->phone_edit->text().isEmpty())){
/* Phone field cannot be empty.
* If it is, prompt the user to input a phone number
*/
if((ui->name_edit->text().isEmpty())){ /*If name field is empty, use the phone number as the name key*/
name = ui->phone_edit->text().toStdString();
}else{
name = ui->name_edit->text().toStdString();
}
to_camel_case(name);
std::string p = ui->phone_edit->text().toStdString();
phone = std::stoll(p);
email = ui->email_edit->text().toStdString();
contact->save_contact(name, phone, email);
close();
}else{
QMessageBox::critical(this,"Can't Do It!", "Phone Field Cannot Be Empty!");
}
}
NewContact::~NewContact()
{
delete ui;
}
编辑联系人.h
class editcontact : public QDialog
{
Q_OBJECT
public:
explicit editcontact(QWidget *parent = nullptr);
~editcontact();
void add_contact(std::string name, long long phone, std::string email);
private slots:
void on_save_button_clicked();
void on_cancel_button_clicked();
private:
void fill_data();
private:
Ui::editcontact *ui;
Contacts *contact;
QString name{contact->current_name()};
};
编辑联系人.cpp
#include "editcontact.h"
#include "ui_editcontact.h"
#include "contacts.h"
#include <QDoubleValidator>
#include <QMessageBox>
#include <algorithm>
editcontact::editcontact(QWidget *parent) :
QDialog(parent),
ui(new Ui::editcontact)
{
ui->setupUi(this);
ui->phone_edit->setValidator( new QDoubleValidator(0, 100, 2, this) );
fill_data();
}
editcontact::~editcontact()
{
delete ui;
}
void editcontact::add_contact(std::string name, long long phone, std::string email)
{
contact->save_contact(name, phone, email);
}
void editcontact::fill_data()
{
QString ph, mail;
ui->name_edit->setText(name);
std::string p = name.toStdString(); //Convert name to std::string from Qstring, the key is an std::string
ph = QString::fromStdString(std::to_string(contact->get_phone(p))); //Convert phone number to QString
mail = QString::fromStdString(contact->get_email(p));
ui->phone_edit->setText(ph);
ui->email_edit->setText(mail);
}
void editcontact::on_save_button_clicked()
{
std::string key = ui->name_edit->text().toStdString();
long long phone = ui->phone_edit->text().toULongLong();
std::string email = ui->email_edit->text().toStdString();
contact->edit_contact(key, phone, email);
QMessageBox::information(this,"Success", "Contact change successful!",QMessageBox::Ok);
close();
}
void editcontact::on_cancel_button_clicked()
{
close();
}
问题是,我能做到
void EditContact::add_contact(std::string name, long long phone, std::string email)
{
contact_edit->save_contact(name, phone, email);
}
一切运行良好。
但是当我跑步时
void NewContact::save_details()
{
std::string name;
long long phone;
std::string email;
contact_add->save_contact(name, phone, email);
close();
}
程序突然崩溃。我使用 Qt 调试,它说我有一个 SIGSEV 错误,我读到这可能是一个指针问题。我不知道如何解决它。
任何帮助将不胜感激。
解决方案
推荐阅读
- postgresql - goroutine 中的 pgx 报告连接繁忙
- php - Elasticsearch PHP 添加路由到子文档
- flutter - 找不到方法:'setState' 即使我在有状态的小部件中
- python - 根据条件创建 bin
- mysql - 如何根据正则表达式查询将是或否值插入标志列
- arrays - C 用 printf 打印非常奇怪的值
- python - 赋值前引用的全局变量?
- widget - 散景:滑块未更新 Hbar 图上的结果
- javascript - 如何将基于 URL 的 mp3 文件从客户端上传到节点服务器
- python - Google Drive API 权限不足:请求的身份验证范围不足