Я создаю простое приложение телефонной книги GUI, используя Qt, и я застрял. У меня есть 3 класса: контакты, редактировать контакт и новый контакт.
Contacts.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
NewContact.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;
}
EditContact.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()};
};
editcontact. 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 debug, и он говорит, что у меня ошибка SIGSEV, и я прочитал, что это может быть проблема с указателем. Я не знаю, как это исправить.
Любая помощь будет оценена.