Как я могу решить проблему с Qt C ++ SIGSEV? - PullRequest
0 голосов
/ 12 марта 2020

Я создаю простое приложение телефонной книги 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, и я прочитал, что это может быть проблема с указателем. Я не знаю, как это исправить.

Любая помощь будет оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...