Qt-可视化数据库操作

1  简介

参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=89

说明:Qt可使用QSqlTableModel来进行数据库的可视化操作,将mode/view与数据库结合起来使用,本文主要介绍使用QSqlTableModel来显示数据库的方法。

mode/view你就当作对象的可视化,这里我们操作的对象就是数据库。

2  测试及说明

我们需要使用的数据库已有一些数据,数据库如下:

需要使用到Qt的Table View组件:

创建的界面如下:

可使用增加、删除、确认、取消、查找(已name进行查找)按钮来对数据库进行相应的操作。

先给出运行测试的效果:

代码步骤说明:

(1)添加数据库、打开数据库、连接数据库

这个步骤,之前的博客有介绍,就直接给出代码:

 1     //添加MySql数据库
 2     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
 3     //连接数据库
 4     db.setHostName("127.0.0.1");  //数据库服务器IP
 5     db.setUserName("root");    //数据库用户名
 6     db.setPassword("123456");  //密码
 7     db.setDatabaseName("test");  //使用哪个数据库
 8     //打开数据库
 9     if (db.open() == false) {
10         QMessageBox::warning(this, "错误", db.lastError().text());
11         return;
12     }

(2)设置模型

1     //设置模型
2     model = new QSqlTableModel(this);

(3)指定使用哪张表

1     //指定使用哪个表
2     model->setTable("student");

(4)把model放置到View里面

1     //把model放置到view里面
2     ui->tableView->setModel(model);

(5)显示mode的数据

1     //显示model里的数据
2     model->select();

(6)设置mode的编辑模式为手动提交修改

1     //设置model的编辑模式,手动提交修改
2     model->setEditStrategy(QSqlTableModel::OnManualSubmit);

(7)增加

1 void Widget::on_pushButton_add_clicked()
2 {
3     //添加空记录
4     QSqlRecord record = model->record();  //获取空记录
5     //获取行号
6     int row = model->rowCount();
7     //添加空行
8     model->insertRecord(row, record);
9 }

(8)删除

 1 void Widget::on_pushButton_delete_clicked()
 2 {
 3     //获取选中的模型
 4     QItemSelectionModel *sModel = ui->tableView->selectionModel();
 5     //取出模型中的索引
 6     QModelIndexList list = sModel->selectedRows();
 7     //删除所有选中的行
 8     for (int i = 0; i < list.size(); i++) {
 9         model->removeRow(list.at(i).row());
10     }
11 }

(9)确认

1 void Widget::on_pushButton_sure_clicked()
2 {
3     //提交所有动作
4     model->submitAll();
5 }

(10)取消

1 void Widget::on_pushButton_cancel_clicked()
2 {
3     //取下所有动作
4     model->revertAll();
5     //提交所有动作
6     model->submitAll();
7 }

(11)查找

1 void Widget::on_pushButton_find_clicked()
2 {
3     //以name进行查找
4     QString key = ui->lineEdit->text();
5     QString str = QString("name = '%1'").arg(key);
6     //过滤条件
7     model->setFilter(str);
8     model->select();
9 }

完整代码如下:

 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include <QDebug>
 4 #include <QSqlDatabase>
 5 #include <QMessageBox>
 6 #include <QSqlError>
 7 #include <QSqlQuery>
 8 #include <QSqlTableModel>
 9 #include <QSqlRecord>
10 #include <QItemSelectionModel>
11 
12 Widget::Widget(QWidget *parent) :
13     QWidget(parent),
14     ui(new Ui::Widget)
15 {
16     ui->setupUi(this);
17 
18     //打印qt支持的数据库驱动
19     qDebug() << QSqlDatabase::drivers();
20 
21     //添加MySql数据库
22     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
23     //连接数据库
24     db.setHostName("127.0.0.1");  //数据库服务器IP
25     db.setUserName("root");    //数据库用户名
26     db.setPassword("123456");  //密码
27     db.setDatabaseName("test");  //使用哪个数据库
28     //打开数据库
29     if (db.open() == false) {
30         QMessageBox::warning(this, "错误", db.lastError().text());
31         return;
32     }
33     //设置模型
34     model = new QSqlTableModel(this);
35     //指定使用哪个表
36     model->setTable("student");
37     //把model放置到view里面
38     ui->tableView->setModel(model);
39     //显示model里的数据
40     model->select();
41 
42 //    model->setHeaderData(0, Qt::Horizontal, "学号");
43 
44     //设置model的编辑模式,手动提交修改
45     model->setEditStrategy(QSqlTableModel::OnManualSubmit);
46     //设置数据库不允许修改
47 //    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
48 }
49 
50 Widget::~Widget()
51 {
52     delete ui;
53 }
54 
55 void Widget::on_pushButton_add_clicked()
56 {
57     //添加空记录
58     QSqlRecord record = model->record();  //获取空记录
59     //获取行号
60     int row = model->rowCount();
61     //添加空行
62     model->insertRecord(row, record);
63 }
64 
65 void Widget::on_pushButton_delete_clicked()
66 {
67     //获取选中的模型
68     QItemSelectionModel *sModel = ui->tableView->selectionModel();
69     //取出模型中的索引
70     QModelIndexList list = sModel->selectedRows();
71     //删除所有选中的行
72     for (int i = 0; i < list.size(); i++) {
73         model->removeRow(list.at(i).row());
74     }
75 }
76 
77 void Widget::on_pushButton_sure_clicked()
78 {
79     //提交所有动作
80     model->submitAll();
81 }
82 
83 void Widget::on_pushButton_cancel_clicked()
84 {
85     //取下所有动作
86     model->revertAll();
87     //提交所有动作
88     model->submitAll();
89 }
90 
91 void Widget::on_pushButton_find_clicked()
92 {
93     //以name进行查找
94     QString key = ui->lineEdit->text();
95     QString str = QString("name = '%1'").arg(key);
96     //过滤条件
97     model->setFilter(str);
98     model->select();
99 }
View Code

 

posted @ 2020-07-19 15:53  zhengcixi  阅读(3587)  评论(0编辑  收藏  举报
回到顶部