• QT:搭配tablewidget的数据库编程


    pro:QT        += core gui sql

    widget.ui

    main.cpp

    1. #include "widget.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. Widget w("./student.db");
    7. w.show();
    8. return a.exec();
    9. }

    widget.h

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include //数据库连接
    5. #include //执行SQL语句
    6. #include //具体错误
    7. #include
    8. namespace Ui {
    9. class Widget;
    10. }
    11. class Widget : public QWidget
    12. {
    13. Q_OBJECT
    14. public:
    15. explicit Widget(QString filename,QWidget *parent = 0);
    16. ~Widget();
    17. void showInfo();
    18. private slots:
    19. void on_pb_add_clicked();
    20. void on_pb_update_clicked();
    21. void on_pb_delete_clicked();
    22. private:
    23. Ui::Widget *ui;
    24. QString db_file_name; //数据库文件名
    25. QSqlDatabase db_student; //数据库名
    26. };
    27. #endif // WIDGET_H

    widget.cpp

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include
    4. #include
    5. Widget::Widget(QString filename,QWidget *parent) :
    6. QWidget(parent),
    7. ui(new Ui::Widget),
    8. db_file_name(filename)
    9. {
    10. ui->setupUi(this);
    11. setWindowTitle("学生信息系统");
    12. setFixedSize(800,600);
    13. QFile file(db_file_name);
    14. if(!file.exists())
    15. {
    16. db_student = QSqlDatabase::addDatabase("QSQLITE"); //建立到SQLITE数据库的连接
    17. db_student.setDatabaseName(db_file_name); //设置数据库文件名
    18. //打开数据库
    19. if (!db_student.open())
    20. {
    21. qDebug() << "打开数据库失败1";
    22. }
    23. else
    24. {
    25. qDebug() << "打开数据库成功1";
    26. }
    27. //QSqlQuery用于SQL语句的执行,对返回结果的使用
    28. //要指定使用的数据库的连接 db_student
    29. QSqlQuery sql_query(db_student);
    30. //创建数据库的表
    31. QString str_query = "create table Student (id varchar(64) PRIMARY KEY, name varchar(64), gender varchar(64), age int)";
    32. //执行SQL语句
    33. if (!sql_query.exec(str_query))
    34. {
    35. qDebug() << str_query << " failed";
    36. qDebug() << sql_query.lastError().text();
    37. }
    38. //向数据库的student表插入数据 方式1
    39. str_query = "insert into Student values('2309260001', '张三', '男', 15)";
    40. if (!sql_query.exec(str_query))
    41. {
    42. qDebug() << str_query << " failed";
    43. qDebug() << sql_query.lastError().text();
    44. }
    45. //向数据库的student表插入数据 方式2
    46. str_query = "insert into Student values(?,?,?,?)";
    47. //准备SQL的语句
    48. sql_query.prepare(str_query);
    49. //绑定待定的数据,取代SQL语句里的 "?"
    50. sql_query.addBindValue("2309260002");
    51. sql_query.addBindValue("李四");
    52. sql_query.addBindValue("男");
    53. sql_query.addBindValue(16);
    54. if (!sql_query.exec())
    55. {
    56. qDebug() << str_query << " failed";
    57. qDebug() << sql_query.lastError().text();
    58. }
    59. //向数据库的student表插入数据 方式3
    60. str_query = "insert into Student values(:id, :name, :gender, :age)";
    61. sql_query.prepare(str_query);
    62. //绑定待定的数据
    63. sql_query.bindValue(":id", "2309260003");
    64. sql_query.bindValue(":name", "王五");
    65. sql_query.bindValue(":gender", "女");
    66. sql_query.bindValue(":age", 17);
    67. if (!sql_query.exec())
    68. {
    69. qDebug() << str_query << " failed";
    70. qDebug() << sql_query.lastError().text();
    71. }
    72. }
    73. else
    74. {
    75. db_student = QSqlDatabase::addDatabase("QSQLITE");
    76. //设置数据库文件的名字
    77. db_student.setDatabaseName(db_file_name);
    78. //打开数据库
    79. if (!db_student.open())
    80. {
    81. qDebug() << "打开数据库失败2";
    82. }
    83. else
    84. {
    85. qDebug() << "打开数据库成功2";
    86. }
    87. }
    88. ui->tableWidget->setColumnCount(4); //设置列数为4
    89. QStringList list;
    90. list << "学号" << "姓名" << "性别" << "年龄";
    91. ui->tableWidget->setHorizontalHeaderLabels(list);
    92. //显示数据库的内容
    93. showInfo();
    94. }
    95. Widget::~Widget()
    96. {
    97. delete ui;
    98. }
    99. void Widget::showInfo()
    100. {
    101. QSqlQuery sql_query(db_student); //连接数据库,执行SQL操作
    102. QString str_query = "select * from Student";
    103. if(!sql_query.exec(str_query))
    104. {
    105. QMessageBox::information(this,"数据库操作错误",sql_query.lastError().text());
    106. return;
    107. }
    108. QList lists; //链表
    109. while(sql_query.next())
    110. {
    111. QStringList tmp;
    112. for(int i = 0;i < 4;i++)
    113. {
    114. tmp << sql_query.value(i).toString(); //value为一条数据中的一个,tmp存放一整条数据:学号 、姓名 、性别 、年龄
    115. }
    116. lists.append(tmp); //存放所有数据(全部条),lists存放的条数为数据库的行数(一条为一行)
    117. }
    118. ui->tableWidget->setRowCount(lists.size()); //根据数据库里的记录的条数来设置行数
    119. //设置显示的数据库记录的内容
    120. for(int i = 0;i < lists.size();i++) //行
    121. {
    122. for(int j = 0;j < 4;j++) //列
    123. {
    124. ui->tableWidget->setItem(i,j,(new QTableWidgetItem(lists.at(i).at(j)))); //第i条第j个数据的内容
    125. }
    126. QTableWidgetItem *item = ui->tableWidget->item(i,0); //设置id不能被用户编辑
    127. item->setFlags(item->flags() & (~Qt::ItemIsEditable));
    128. }
    129. }
    130. //新增
    131. void Widget::on_pb_add_clicked()
    132. {
    133. if(ui->pb_add->text() == "新增")
    134. {
    135. int row = ui->tableWidget->rowCount(); //获取实际行数,三条数据为3行
    136. ui->tableWidget->insertRow(row); //增加行数,索引从0开始为第一行,索引为3实际为第4行
    137. ui->pb_add->setText("提交");
    138. ui->pb_delete->setEnabled(false);
    139. ui->pb_update->setEnabled(false);
    140. }
    141. else
    142. {
    143. int row = ui->tableWidget->rowCount(); //新增一行后获取行数
    144. row--; //索引要减一才为所在新增行
    145. QSqlQuery sql_query(db_student);
    146. QString str_query = "insert into Student values(?,?,?,?)";
    147. sql_query.prepare(str_query);
    148. int count = 0;
    149. sql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toString()); //id
    150. sql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toString()); //name
    151. sql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toString()); //gender
    152. sql_query.addBindValue(ui->tableWidget->item(row,count++)->data(0).toInt()); //age
    153. if(!sql_query.exec())
    154. {
    155. qDebug() << str_query << " failed";
    156. qDebug() << sql_query.lastError().text();
    157. }
    158. ui->pb_add->setText("新增");
    159. ui->pb_delete->setEnabled(true);
    160. ui->pb_update->setEnabled(true);
    161. showInfo(); //刷新主界面的显示
    162. }
    163. }
    164. //修改
    165. void Widget::on_pb_update_clicked()
    166. {
    167. int row = ui->tableWidget->currentRow(); //用户点击的所在行
    168. qDebug() << "row = " << row;
    169. if(row < 0)
    170. {
    171. qDebug() << "wrong row number = " << row;
    172. return;
    173. }
    174. QSqlQuery sql_query(db_student);
    175. QString str_query = "update Student set name = ?,gender = ?,age = ? where id = ?";
    176. sql_query.prepare(str_query);
    177. sql_query.addBindValue(ui->tableWidget->item(row,1)->data(0).toString()); //name,所在行的索引为1的数据
    178. sql_query.addBindValue(ui->tableWidget->item(row,2)->data(0).toString()); //gender
    179. sql_query.addBindValue(ui->tableWidget->item(row,3)->data(0).toInt()); //age
    180. sql_query.addBindValue(ui->tableWidget->item(row,0)->data(0).toString()); //id
    181. if(!sql_query.exec())
    182. {
    183. qDebug() << str_query << " failed";
    184. qDebug() << sql_query.lastError().text();
    185. }
    186. showInfo();
    187. }
    188. //删除
    189. void Widget::on_pb_delete_clicked()
    190. {
    191. int row = ui->tableWidget->currentRow(); //用户点击的所在行
    192. qDebug() << "row = " << row;
    193. if(row < 0)
    194. {
    195. qDebug() << "wrong row number = " << row;
    196. return;
    197. }
    198. QSqlQuery sql_query(db_student);
    199. QString str_query = "delete from Student where id = ?";
    200. sql_query.prepare(str_query);
    201. sql_query.addBindValue(ui->tableWidget->item(row,0)->data(0).toString()); //id
    202. if(!sql_query.exec())
    203. {
    204. qDebug() << str_query << " failed";
    205. qDebug() << sql_query.lastError().text();
    206. }
    207. showInfo();
    208. }

    结果

    新增

    修改

    删除

  • 相关阅读:
    QT学习day1
    使用 shell 脚本安装 nginx
    【漏洞复现】时空智友企业流程化管控系统 session泄露
    【Python爬虫 js渲染思路一】
    LeetCode 88. 合并两个有序数组
    【Golang | gRPC】使用gRPC实现简单远程调用
    1932. 合并多棵二叉搜索树 并查集+DFS
    计算机视觉与深度学习-全连接神经网络-训练过程-权值初始化- [北邮鲁鹏]
    简述人工智能,及其三大学派:符号主义、连接主义、行为主义
    在C++中调用Pytorch模型
  • 原文地址:https://blog.csdn.net/cxy255256/article/details/133622038