微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在专用插槽中获取运行时错误SIGSEGV

如何解决在专用插槽中获取运行时错误SIGSEGV

用户按下按钮inner_add_button时,我希望该插槽将学生添加数据库中。但是偶然地,当执行tableWidget->item(0,1)->text()时出现运行时错误(SIGSEGV)。 我尝试在tableWdiget->item(0,1);插槽中执行save_chng_button_pressed();,它工作正常,但是当我尝试将其解析为文本时,运行时错误就会消失。所需的广告位实现位于edit_window.cpp类的底部

这是代码

edit_window.h

#ifndef EDIT_WINDOW_H
#define EDIT_WINDOW_H

#include <QWidget>
#include <mylineedit.h>
#include <lineedit_delegate.h>
#include <spinBox_delegate.h>
#include <enums.h>
#include "mytablewidget.h"
#include <QTableWidget>
#include <QPushButton>

#include<QsqlQuery>
#include<QtDebug>
#include<QsqlError>
#include<QsqlRecord>

namespace Ui {
class Edit_window;
}

class Edit_window : public QWidget
{
    Q_OBJECT

public:
    explicit Edit_window(QWidget *parent = nullptr);
 void chng_widget(Button_pressed j);
    ~Edit_window();



private:
    Ui::Edit_window *add;
    void closeEvent(QCloseEvent *event);
    MyLineEdit *Name_MLine_Edit = new MyLineEdit;
    QCompleter *completer = nullptr;
    QPushButton *inner_add_button = new QPushButton();
    QStringList list;

    QsqlQuery qry;
    QString query;

    lineedit_delegate line_edit_delegate;
    spinBox_delegate spin_Box_delegate;

    qint8 whButton;
    Button_pressed j;
    mytablewidget *tableWidget = new mytablewidget();

private slots:
    void add_stud_ok_window();
    void add_stud_canc_window();
    void table_cell_changed();
    void save_chng_button_pressed();

};

extern bool datachanged;

#endif // EDIT_WINDOW_H

edit_window.cpp

#include "edit_window.h"
#include "ui_edit_window.h"
#include <QCloseEvent>
#include <QMessageBox>
#include <qvalidator>
#include <QCompleter>
#include <QTableView>

Edit_window::Edit_window(QWidget *parent) :
    QWidget(parent),add(new Ui::Edit_window)
{
    add->setupUi(this);
    this->tableWidget = new mytablewidget();

    Qpixmap bkgnd("background.jpg");
        bkgnd = bkgnd.scaled(this->size(),Qt::IgnoreAspectRatio);
        QPalette palette;
        palette.setBrush(QPalette::Background,bkgnd);
        this->setPalette(palette);

    ///////////////////// MyLine properties and MySpinBox properties


    this->Name_MLine_Edit->setValidator( new QRegExpValidator( QRegExp( "[A-Z|a-z]{1,19}" ) ) );


    this->Name_MLine_Edit->setFixedSize(200,20);
    this->Name_MLine_Edit->setobjectName("Name_MLine_Edit");

///////////////////////////////////////////////////////////

    //connections

    connect(add->buttonBox,SIGNAL(accepted()),this,SLOT(add_stud_ok_window()));
    connect(add->buttonBox,SIGNAL(rejected()),SLOT(add_stud_canc_window()));


}



void Edit_window::chng_widget(Button_pressed j)
{
    //MysqL QUERY
        if(qry.exec("SELECT * FROM students.students_report_card;"))
        {
             while(qry.next())
                 list.append(qry.value(1).toString()+" "+qry.value(2).toString()+" "+qry.value(0).toString() );
        }
        else
        {
            qDebug() <<"Error of query- " <<qry.lastError().text();
            qDebug() <<"Query is "<< query;
        }

    add->wrng_msg_label->clear();
    completer = new QCompleter(list,this);
        completer->setCaseSensitivity(Qt::CaseInsensitive);
        this->Name_MLine_Edit->setCompleter(completer);

    switch (j) {
    case Add_button:
{
        this->whButton = Add_button;

        this->tableWidget->clear();

        this->tableWidget->setColumnCount(7);
        this->tableWidget->setRowCount(1);


        this->tableWidget->setFixedSize(tableWidget->columnWidth(1) * 7 + 16,(tableWidget->rowHeight(0) * 2) -5 );
        tableWidget->setHorizontalHeaderLabels(QStringList() << "Name" << "Surname" << "Physics" << "Maths" << "Chemistry" << "CS" << "");
        tableWidget->setVerticalHeaderLabels(QStringList() << " " << " ");

        tableWidget->setItemDelegateForColumn(0,&line_edit_delegate);
        tableWidget->setItemDelegateForColumn(1,&line_edit_delegate);
        tableWidget->setItemDelegateForColumn(2,&spin_Box_delegate);
        tableWidget->setItemDelegateForColumn(3,&spin_Box_delegate);
        tableWidget->setItemDelegateForColumn(4,&spin_Box_delegate);
        tableWidget->setItemDelegateForColumn(5,&spin_Box_delegate);

        inner_add_button->setFixedSize(tableWidget->columnWidth(0),tableWidget->rowHeight(0));
        inner_add_button->setText("Add");
        tableWidget->setCellWidget(0,6,inner_add_button);

        connect(inner_add_button,SIGNAL(clicked()),SLOT(saven_chng_button_pressed()));

        tableWidget->show();
        break;
}
    case Change_button:

        this->whButton = Change_button;
        add->add_student_label->clear();
        add->add_student_label->setText("Enter name of the student\n to change its data");
        add->gridLayout->addWidget(this->Name_MLine_Edit,1,2,Qt::AlignHCenter);
        break;

    case Delete_button:

        this->whButton = Delete_button;
        add->add_student_label->clear();
        add->add_student_label->setText("Enter name of the student\n to delete its data");
        add->gridLayout->addWidget(this->Name_MLine_Edit,Qt::AlignHCenter);
        break;

    default:
        break;
    }  
}

void Edit_window::add_stud_ok_window()
{
    QString str = this->Name_MLine_Edit->text();
    auto parts = str.split(Qlatin1Char(' '));
    if(qry.exec("insert into students.students_report_card(firstname,lastname,physics,maths,chemystry,computer_science) values(\"" +
                 tableWidget->item(0,1)->text() + "\",\"" + tableWidget->item(0,2)->text() +
                 "\"," + tableWidget->item(0,3)->text() +
                 "," +tableWidget->item(0,4)->text()+",5)->text() +
                 ","+tableWidget->item(0,6)->text() + ");" ))
    {
        qDebug() <<"Succesfully added a student";
    }
    else
    {
        QMessageBox msgWarning;
            msgWarning.setText("Cannot add the student. "+ qry.lastError().text());
            msgWarning.setIcon(QMessageBox::Warning);
            msgWarning.setwindowTitle("Caution");
            msgWarning.exec();
    }
    switch (this->whButton) {
    case Change_button:
    {

            if(qry.exec("SELECT * FROM students.students_report_card where id = " + parts[2] + ";"))
            {

                tableWidget->clear();

                //Set the amount of rows and columns in the table
                 tableWidget->setColumnCount(qry.record().count());
                 tableWidget->setRowCount(qry.size());

                //Set the size of widgets which we are going to insert into our table

                  for (int i = 0; qry.next(); i++)
                  {
                     for (int j = 0; j <qry.record().count(); j++)
                     {
                          QTableWidgetItem *itm = new QTableWidgetItem(qry.value(j).toString());

                          if (j == 0 || j == 7)
                          {
                              itm->setFlags(itm->flags() ^ Qt::ItemIsEditable);
                          }


                         itm->setTextAlignment(Qt::AlignHCenter);
                         tableWidget->setItem(i,j,itm);
                     }
                  }

                 //Set width of the reg.date column,size and header labels of the table
                 tableWidget->setColumnWidth(7,150);
                 tableWidget->setHorizontalHeaderLabels(QStringList() << "ID" << "Name" << "Surname" << "Physics" << "Maths" << "Chemistry" << "CS" << "Reg_date" );
                 tableWidget->setFixedSize(tableWidget->columnWidth(1) * qry.record().count() + 46,(tableWidget->rowHeight(0) * 2) -9 );

                 tableWidget->setItemDelegateForColumn(1,&line_edit_delegate);
                 tableWidget->setItemDelegateForColumn(2,&line_edit_delegate);
                 tableWidget->setItemDelegateForColumn(3,&spin_Box_delegate);
                 tableWidget->setItemDelegateForColumn(4,&spin_Box_delegate);
                 tableWidget->setItemDelegateForColumn(5,&spin_Box_delegate);
                 tableWidget->setItemDelegateForColumn(6,&spin_Box_delegate);
   
                 //connections
                 connect(tableWidget,SIGNAL(cellChanged(int,int)),SLOT(table_cell_changed()));



                 //Show the table
                 tableWidget->show();

            }
            else
            {
                qDebug() <<"Error of query- " <<qry.lastError().text();
                qDebug() <<"Query is "<< query;
            }
        break;
    }

    case Delete_button:

        if(qry.exec("delete from students.students_report_card where id = " + parts[2] + ";"))
        {
            if (!qry.size())
                add->wrng_msg_label->setText("0 rows were affected");
            else
                add->wrng_msg_label->setText("Succes!");
        }
        else
        {
            QMessageBox msgWarning;
                msgWarning.setText("WARNING!\nCannot delete the student. "+ qry.lastError().text());
                msgWarning.setIcon(QMessageBox::Warning);
                msgWarning.setwindowTitle("Caution");
                msgWarning.exec();
        }

        break;
    default:
        break;
    }
}


void Edit_window::closeEvent(QCloseEvent *bar)
{

    if(this->whButton == 1  &&  !this->Name_MLine_Edit->text().isEmpty())
    {
    QMessageBox::StandardButton resBtn = QMessageBox::question( this," ",tr("Clear entered data?\n"),QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,QMessageBox::Yes);

    switch (resBtn) {
    case QMessageBox::Yes:
        this->Name_MLine_Edit->clear();

        bar->accept();
        break;


    case QMessageBox::No:

         bar->accept();
         break;
    case QMessageBox::Cancel:

        bar->ignore();
        break;
    default:
        break;
    }

    }
        this->Name_MLine_Edit->setStyleSheet("#Name_MLine_Edit { border: none; }");

    bar->accept();
}   

void Edit_window::add_stud_canc_window()
{
    Edit_window::close();
}

void Edit_window::table_cell_changed()
{
    datachanged = true;
}

void Edit_window::save_chng_button_pressed()
{
//Here appears runtime error,when tableWidget->item(0,1)->text() is performed 
        if(qry.exec("insert into students.students_report_card(firstname,computer_science) values(\"" +
                     tableWidget->item(0,2)->text() +
                     "\",3)->text() +
                     ",5)->text() +
                     ",6)->text() + ");" ))
        {
            qDebug() <<"Succesfully added a student";
        }
        else
        {
            QMessageBox msgWarning;
                msgWarning.setText("Cannot add the student. "+ qry.lastError().text());
                msgWarning.setIcon(QMessageBox::Warning);
                msgWarning.setwindowTitle("Caution");
                msgWarning.exec();
        }
    }
    
    Edit_window::~Edit_window()
    {
        delete add;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。