QT:搭配tablewidget的数据库编程

pro:QT        += core gui sql

widget.ui

QT:搭配tablewidget的数据库编程_第1张图片

main.cpp

#include "widget.h"
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w("./student.db");
    w.show();

    return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include   //数据库连接
#include      //执行SQL语句
#include      //具体错误
#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QString filename,QWidget *parent = 0);
    ~Widget();


    void showInfo();


private slots:
    void on_pb_add_clicked();

    void on_pb_update_clicked();

    void on_pb_delete_clicked();

private:
    Ui::Widget *ui;

    QString db_file_name;     //数据库文件名
    QSqlDatabase db_student;   //数据库名
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include 
#include 

Widget::Widget(QString filename,QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget),
  db_file_name(filename)
{
    ui->setupUi(this);
    setWindowTitle("学生信息系统");
    setFixedSize(800,600);

    QFile file(db_file_name);
    if(!file.exists())
    {
        db_student = QSqlDatabase::addDatabase("QSQLITE");  //建立到SQLITE数据库的连接

        db_student.setDatabaseName(db_file_name);   //设置数据库文件名

        //打开数据库
        if (!db_student.open())
        {
            qDebug() << "打开数据库失败1";
        }
        else
        {
            qDebug() << "打开数据库成功1";
        }

        //QSqlQuery用于SQL语句的执行,对返回结果的使用
        //要指定使用的数据库的连接 db_student
        QSqlQuery sql_query(db_student);

        //创建数据库的表
        QString str_query = "create table Student (id varchar(64) PRIMARY KEY, name varchar(64), gender varchar(64), age int)";

        //执行SQL语句
        if (!sql_query.exec(str_query))
        {
            qDebug() << str_query << " failed";
            qDebug() << sql_query.lastError().text();
        }

        //向数据库的student表插入数据 方式1
        str_query = "insert into Student values('2309260001', '张三', '男', 15)";
        if (!sql_query.exec(str_query))
        {
            qDebug() << str_query << " failed";
            qDebug() << sql_query.lastError().text();
        }


        //向数据库的student表插入数据 方式2
        str_query = "insert into Student values(?,?,?,?)";
        //准备SQL的语句
        sql_query.prepare(str_query);
        //绑定待定的数据,取代SQL语句里的 "?"
        sql_query.addBindValue("2309260002");
        sql_query.addBindValue("李四");
        sql_query.addBindValue("男");
        sql_query.addBindValue(16);
        if (!sql_query.exec())
        {
            qDebug() << str_query << " failed";
            qDebug() << sql_query.lastError().text();
        }


        //向数据库的student表插入数据 方式3
        str_query = "insert into Student values(:id, :name, :gender, :age)";
        sql_query.prepare(str_query);
        //绑定待定的数据
        sql_query.bindValue(":id", "2309260003");
        sql_query.bindValue(":name", "王五");
        sql_query.bindValue(":gender", "女");
        sql_query.bindValue(":age", 17);
        if (!sql_query.exec())
        {
            qDebug() << str_query << " failed";
            qDebug() << sql_query.lastError().text();
        }
    }
    else
    {
        db_student = QSqlDatabase::addDatabase("QSQLITE");

        //设置数据库文件的名字
        db_student.setDatabaseName(db_file_name);

        //打开数据库
        if (!db_student.open())
        {
            qDebug() << "打开数据库失败2";
        }
        else
        {
            qDebug() << "打开数据库成功2";
        }
    }

    ui->tableWidget->setColumnCount(4);  //设置列数为4

    QStringList list;
    list << "学号" << "姓名" << "性别" << "年龄";
    ui->tableWidget->setHorizontalHeaderLabels(list);

    //显示数据库的内容
    showInfo();

}

Widget::~Widget()
{
    delete ui;
}

void Widget::showInfo()
{
    QSqlQuery sql_query(db_student);  //连接数据库,执行SQL操作
    QString str_query = "select * from Student";
    if(!sql_query.exec(str_query))
    {
        QMessageBox::information(this,"数据库操作错误",sql_query.lastError().text());
        return;
    }

    QList lists;  //链表

    while(sql_query.next())
    {
        QStringList tmp;
        for(int i = 0;i < 4;i++)
        {
           tmp << sql_query.value(i).toString();   //value为一条数据中的一个,tmp存放一整条数据:学号 、姓名 、性别 、年龄
        }
        lists.append(tmp);    //存放所有数据(全部条),lists存放的条数为数据库的行数(一条为一行)
    }

    ui->tableWidget->setRowCount(lists.size());  //根据数据库里的记录的条数来设置行数

    //设置显示的数据库记录的内容
    for(int i = 0;i < lists.size();i++)  //行
    {
        for(int j = 0;j < 4;j++)   //列
        {
            ui->tableWidget->setItem(i,j,(new QTableWidgetItem(lists.at(i).at(j))));  //第i条第j个数据的内容
        }

        QTableWidgetItem *item = ui->tableWidget->item(i,0);  //设置id不能被用户编辑
        item->setFlags(item->flags() & (~Qt::ItemIsEditable));
    }
}


//新增
void Widget::on_pb_add_clicked()
{
   if(ui->pb_add->text() == "新增")
   {
       int row = ui->tableWidget->rowCount();  //获取实际行数,三条数据为3行
       ui->tableWidget->insertRow(row);    //增加行数,索引从0开始为第一行,索引为3实际为第4行
       ui->pb_add->setText("提交");
       ui->pb_delete->setEnabled(false);
       ui->pb_update->setEnabled(false);
   }
   else
   {
       int row = ui->tableWidget->rowCount();  //新增一行后获取行数
       row--;    //索引要减一才为所在新增行

       QSqlQuery sql_query(db_student);
       QString str_query = "insert into Student values(?,?,?,?)";

       sql_query.prepare(str_query);

       int count = 0;
       sql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toString());  //id
       sql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toString());  //name
       sql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toString());  //gender
       sql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toInt());     //age

       if(!sql_query.exec())
       {
           qDebug() << str_query << " failed";
           qDebug() << sql_query.lastError().text();
       }

       ui->pb_add->setText("新增");
       ui->pb_delete->setEnabled(true);
       ui->pb_update->setEnabled(true);

       showInfo();  //刷新主界面的显示
   }
}

//修改
void Widget::on_pb_update_clicked()
{
    int row = ui->tableWidget->currentRow();  //用户点击的所在行
    qDebug() << "row = " << row;
    if(row < 0)
    {
        qDebug() << "wrong row number = " << row;
        return;
    }

    QSqlQuery sql_query(db_student);
    QString str_query = "update Student set name = ?,gender = ?,age = ? where id = ?";

    sql_query.prepare(str_query);

    sql_query.addBindValue(ui->tableWidget->item(row,1)->data(0).toString());  //name,所在行的索引为1的数据
    sql_query.addBindValue(ui->tableWidget->item(row,2)->data(0).toString());  //gender
    sql_query.addBindValue(ui->tableWidget->item(row,3)->data(0).toInt());     //age
    sql_query.addBindValue(ui->tableWidget->item(row,0)->data(0).toString());  //id

    if(!sql_query.exec())
    {
        qDebug() << str_query << " failed";
        qDebug() << sql_query.lastError().text();
    }

    showInfo();
}

//删除
void Widget::on_pb_delete_clicked()
{
    int row = ui->tableWidget->currentRow();  //用户点击的所在行
    qDebug() << "row = " << row;
    if(row < 0)
    {
        qDebug() << "wrong row number = " << row;
        return;
    }

    QSqlQuery sql_query(db_student);
    QString str_query = "delete from Student where id = ?";

    sql_query.prepare(str_query);

    sql_query.addBindValue(ui->tableWidget->item(row,0)->data(0).toString());  //id

    if(!sql_query.exec())
    {
        qDebug() << str_query << " failed";
        qDebug() << sql_query.lastError().text();
    }

    showInfo();

}

结果

QT:搭配tablewidget的数据库编程_第2张图片

QT:搭配tablewidget的数据库编程_第3张图片

新增

QT:搭配tablewidget的数据库编程_第4张图片

QT:搭配tablewidget的数据库编程_第5张图片

QT:搭配tablewidget的数据库编程_第6张图片

修改

QT:搭配tablewidget的数据库编程_第7张图片

QT:搭配tablewidget的数据库编程_第8张图片

QT:搭配tablewidget的数据库编程_第9张图片

删除

QT:搭配tablewidget的数据库编程_第10张图片

QT:搭配tablewidget的数据库编程_第11张图片

QT:搭配tablewidget的数据库编程_第12张图片

你可能感兴趣的:(qt,开发语言,数据库,sqlite)