61黑马QT笔记之可视化操作数据库(第一部完结)
前提:之前我们在样式表那里说到了ui提供的各种样式,但是没有说明Item-View;他就是可视化操作数据库重要的样式,也叫Model-View。他是怎么操作的呢?下面我将介绍。
1 Model-View是如何从数据库取数据可视化处理的?我们将这个单词拆开来理解。
1)Model:代表将数据库的数据加载进来;
2)View:将Model的数据在在ui上面显示。
2 代码
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QSqlDatabase>
#include<QMessageBox>
#include<QSqlError>
#include<QSqlQuery>
#include<QVariantList> //可变列表赋值
#include<QString>
#include<QSqlRecord>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
qDebug()<<QSqlDatabase::drivers();
QSqlDatabase db= QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setUserName("root");
db.setPassword("123456");
db.setDatabaseName("test"); //使用哪个数据库
if(db.open() == false)
{
QMessageBox::warning(this,"error",db.lastError().text());
return;
}
//1 设计模型
model=new QSqlTableModel(this);
model->setTable("student");
ui->tableView->setModel(model); // 在ui的table view上(但仍未显示)
//2 利用model进行操作显示(显示在ui界面,到这里就可以完整的显示出数据库的数据)
model->select(); // 不用sql语句 select已经封装好函数
//为字段改人性化名字 (即显示时以学号显示 但数据库不会改变)
model->setHeaderData(0,Qt::Horizontal,"学号");// 参1为哪一列 类似query.value(0).toInt() 参2为常量水平或者竖直
model->setHeaderData(1,Qt::Horizontal,"名字");// 这个改变不会影响到数据库 直接在窗口改就会
//3 设置编辑策略为手动修改,只有手动确认才行
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//4 设置ui的tableview 为只读 即与文本编辑可读类似,不过他在ui设置,这里直接语句设置
//ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); //注意是ui
}
Widget::~Widget()
{
delete ui;
}
// 增加一行数据
void Widget::on_buttonAdd_clicked()
{
QSqlRecord record = model->record(); // 获取空行
int row = model->rowCount(); // 获取当前行数,用来作空行的下标(因为以0开始嘛)
model->insertRecord(row,record); // 插入一行 row为新行的下标
}
// 删除按钮
void Widget::on_buttonDel_clicked()
{
//分三步 1找出ui选中要删除的区域 2取出他们对应的索引 3利用索引找出行号删除
QItemSelectionModel *smodel = ui->tableView->selectionModel();
QModelIndexList list = smodel->selectedRows(); //取出索引
for(int i=0 ; i < list.size(); i++) //list.size()表示有多少个索引
{
model->removeRow(list.at(i).row()); //list.at(i)表示取出表中第一行对应的索引 .row()表示取出对应行号
}
}
// 修改可以直接将数据 在界面修改 所以不需要按钮
// 查找按钮
void Widget::on_buttonFind_clicked()
{
QString name = ui->lineEdit->text();
QString str = QString("name='%1'").arg(name); //单引号不打不行 因为字符串必须增加单引号 类似数据库的格式
model->setFilter(str); //过滤条件只需要sql语句select中的where条件 故上面只需组name='名字'
model->select();
}
// 确定按钮
void Widget::on_buttonSure_clicked()
{
model->submitAll(); // 提交数据
}
// 取消按钮
void Widget::on_buttonCancel_clicked()
{
model->revertAll(); // 取消所有动作
model->submitAll(); // 取消也是动作 所以提交所有动作
}