首页 > 解决方案 > 如何解决 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 错误,我读到这可能是一个指针问题。我不知道如何解决它。

任何帮助将不胜感激。

标签: c++qtuser-interface

解决方案


推荐阅读