问题描述
当用户按下按钮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 (将#修改为@)