2017-06-21 20 views
0

私は4つのフィールド(名前、姓、学期、studentid)を持つs​​tudentという名前のデータベースを持っています。QTテーブルのデータベースから削除しよう

私は、ユーザーがデータベースに学生を挿入して、挿入後にテーブルに表示するオプションを持つアプリケーションを接続しました。

テーブルには、私が別個の機能に接続しているすべての挿入学生のためのDELETEボタンがあり、ユーザにstudentidに基づいて個々の学生を削除するオプションがあります。

問題は、クリックしたときに削除ボタンが機能しないため、間違っているようです。しかし、私はエラーが出ないので、あなたの助けが必要です。

Database::Database() 
{ 
    db = QSqlDatabase::addDatabase("QSQLITE"); 
    db.setDatabaseName("students.db"); 
    db.open(); 
    QSqlQuery q(db); 
    q.exec(QString("DROP TABLE student;")); 

    q.exec(QString("create table if not exists student(")+ 
         QString("id integer primary key autoincrement,")+ 
         QString("name varchar(1024),lastname varchar(1024),semester integer,")+ 
         QString("studentid integer)")); 
} 

MainWindow.cpp

//挿入

の表-LISTの作成database.cpp

void Database::deleteStudent(int id) 
{ 
    QSqlQuery query(db); 
    query.exec("DELETE student where studentid="+QString::number(id)); 
} 

に呼び出され、データベースから削除します。コードを作成し

データベース

void MainWindow::makeDisplayForm() 
    { 
     QWidget *tab2=new QWidget; 
     panel->addWidget(tab2); 
     tab2->setFixedSize(95*this->size().width()/100,this->size().height()/2); 
     QVBoxLayout *tab2layout=new QVBoxLayout; 
     tab2->setLayout(tab2layout); 
     table=new QTableWidget; 
     table->setRowCount(1); 
     table->setColumnCount(5); 
     QStringList header; 
     header<<"NAME"<<"LASTNAME"<<"SEMESTER"<<"ID"<<"DELETE"; 
     table->setHorizontalHeaderLabels(header); 
     tab2layout->addWidget(table); 
    } 

void MainWindow::reloadTable() 
{ 
    QVector<Student> p=mydb->students(); 
    table->clearContents(); 
    table->setRowCount(p.size()); 
    for(int i=0;i<p.size();i++) 
    { 
     Student pt=p[i]; 
     QLineEdit *tableName=new QLineEdit; 
     tableName->setText(pt.getname()); 
     table->setCellWidget(i,0,tableName); 

     QLineEdit *tableLastName=new QLineEdit; 
     tableLastName->setText(pt.getlastname()); 
     table->setCellWidget(i,1,tableLastName); 


     table->setItem(i,2,new QTableWidgetItem(QString::number(pt.getsemester()))); 
     table->setItem(i,3,new QTableWidgetItem(QString::number(pt.getstudentid()))); 

     //DELETE BUTTON CREATE 
     QPushButton *deleteButton=new QPushButton; 
     deleteButton->setText("DELETE"); 
     connect(deleteButton,SIGNAL(clicked(bool)),this,SLOT(deleteSlot())); 
     deleteButton->setProperty("STUDENTID",pt.getstudentid()); 
     table->setCellWidget(i,4,deleteButton); 

    } 
} 

// DELETEボタンの接続機能。

void MainWindow::deleteSlot() 
{ 
    QPushButton *b=(QPushButton *)sender(); 
    int studtid=b->property("STUDENTID").toInt(); 
    mydb->deleteStudent(studtid); 
    reloadTable(); 
} 

//削除された生徒を除いて新しいデータベースを表示するために、リロードテーブルの後にリロードテーブルが呼び出されます。

Student.cpp

#include "student.h" 

Student::Student() 
{ 
    name=""; 
    lastname=""; 
    studentid=0; 
    semester=0; 
} 

Student::Student(QString n,QString l,int s,int p) 
{ 
    name=n; 
    lastname=l; 
    semester=s; 
    studentid=p; 
} 

int Student::getstudentid() 
{ 
    return studentid; 
} 

UPDATE:私はvoid Database::deleteStudent(int id)クエリを変更した場合:

query.exec(QString("DROP TABLE student;")); 

表がstudentidまたはクエリと間違って何かので、削除ボタンの後にうまく削除されますか?私は個々の挿入を削除する必要がありますすべてのテーブル。

答えて

1

はあなたの関数でこれを試してみてください:

DELETE FROM student WHERE studentid=.... 
+0

なんてこった。これを見つけるために3時間。本当にありがとうございますKlocur !!!! – foutzos

+0

ようこそ。 – klocur

関連する問題