#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include <iostream>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QtSql>
#include <QDataWidgetMapper>
QSqlDatabase DB; // 数据库连接
QSqlQueryModel *qryModel; // 数据库模型
QSqlTableModel *tabModel; // 数据模型
QItemSelectionModel *theSelection; // 选择模型
QDataWidgetMapper *dataMapper; // 数据映射
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 打开数据库
DB=QSqlDatabase::addDatabase("QSQLITE"); // 添加 SQL LITE数据库驱动
DB.setDatabaseName("./database.db"); // 设置数据库名称
if (!DB.open())
{
return;
}
// 打开数据表
qryModel=new QSqlQueryModel(this);
theSelection=new QItemSelectionModel(qryModel);
qryModel->setQuery("SELECT id,name,sex,age,mobile,city FROM Student order by id");
if (qryModel->lastError().isValid())
{
return;
}
// 设置字段
qryModel->setHeaderData(0,Qt::Horizontal,"ID");
qryModel->setHeaderData(1,Qt::Horizontal,"Name");
qryModel->setHeaderData(2,Qt::Horizontal,"Sex");
qryModel->setHeaderData(3,Qt::Horizontal,"Age");
qryModel->setHeaderData(4,Qt::Horizontal,"Mobile");
qryModel->setHeaderData(5,Qt::Horizontal,"City");
ui->tableView->setModel(qryModel);
ui->tableView->setSelectionModel(theSelection);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tableView->setAlternatingRowColors(true);
// this->setCentralWidget(ui->tableView);
}
MainWindow::~MainWindow()
{
delete ui;
}
// 弹出Dialog对话框,并 更新数据
void MainWindow::on_pushButton_update_clicked()
{
int curRecNo=theSelection->currentIndex().row();
QSqlRecord curRec=qryModel->record(curRecNo); // 获取当前记录
int uid=curRec.value("id").toInt(); // 获取id
QSqlQuery query; // 查询出当前记录的所有字段
query.prepare("select * from Student where id = :ID");
query.bindValue(":ID",uid);
query.exec();
query.first();
if (!query.isValid()) // 是否为有效记录
return;
curRec=query.record(); // 获取当前记录的数据
Dialog *WindowPtr=new Dialog(this); // 创建对话框
Qt::WindowFlags flags=WindowPtr->windowFlags();
WindowPtr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); // 设置对话框固定大小
WindowPtr->setUpdateRecord(curRec); // 调用对话框函数更新数据和界面
int ret=WindowPtr->exec(); // 以模态方式显示对话框
if (ret==QDialog::Accepted) // OK键被按下
{
QSqlRecord recData=WindowPtr->getRecordData(); // 获得对话框返回的记录
query.prepare("update Student set name=:Name, sex=:Sex,age=:Age, mobile=:Mobile, city=:City where id=:ID");
query.bindValue(":ID",recData.value("id"));
query.bindValue(":Name",recData.value("name"));
query.bindValue(":Sex",recData.value("sex"));
query.bindValue(":Age",recData.value("age"));
query.bindValue(":Mobile",recData.value("mobile"));
query.bindValue(":City",recData.value("city"));
// 数据模型重新查询数据,更新tableView显示
if (query.exec())
{
qryModel->query().exec();
}
}
delete WindowPtr;
}
// 增加一条新纪录
void MainWindow::on_pushButton_insert_clicked()
{
QSqlQuery query;
query.exec("select * from Student where id =-1"); // 查询字段信息,是否存在
QSqlRecord curRec=query.record(); // 获取当前记录,实际为空记录
curRec.setValue("id",qryModel->rowCount()+1001);
Dialog *WindowPtr=new Dialog(this);
Qt::WindowFlags flags=WindowPtr->windowFlags();
WindowPtr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); // 设置对话框固定大小
WindowPtr->setInsertRecord(curRec); // 插入记录
int ret=WindowPtr->exec(); // 以模态方式显示对话框
if (ret==QDialog::Accepted) // OK键被按下
{
QSqlRecord recData=WindowPtr->getRecordData();
query.prepare("INSERT INTO Student(id,name,sex,age,mobile,city)"
" VALUES(:Id, :Name, :Sex, :Age, :Mobile, :City)");
query.bindValue(":Id",recData.value("id"));
query.bindValue(":Name",recData.value("name"));
query.bindValue(":Sex",recData.value("sex"));
query.bindValue(":Age",recData.value("age"));
query.bindValue(":Mobile",recData.value("mobile"));
query.bindValue(":City",recData.value("city"));
if (query.exec())
{
QString sqlStr=qryModel->query().executedQuery(); // 执行过的SELECT语句
qryModel->setQuery(sqlStr); // 重新查询数据
}
}
delete WindowPtr;
}
// 删除选中记录
void MainWindow::on_pushButton_delete_clicked()
{
int curRecNo=theSelection->currentIndex().row();
QSqlRecord curRec=qryModel->record(curRecNo); // 获取当前记录
if (curRec.isEmpty()) // 当前为空记录
return;
int uid=curRec.value("id").toInt(); // 获取员工编号
QSqlQuery query;
query.prepare("delete from Student where id = :ID");
query.bindValue(":ID",uid);
if (query.exec())
{
QString sqlStr=qryModel->query().executedQuery(); // 执行过的SELECT语句
qryModel->setQuery(sqlStr); // 重新查询数据
}
}
// 将所有人的年龄增加1岁
void MainWindow::on_pushButton_AddAge_clicked()
{
QSqlQuery qryEmpList; // 员工工资信息列表
qryEmpList.exec("SELECT id,age FROM Student ORDER BY id");
qryEmpList.first();
QSqlQuery qryUpdate; // 临时QSqlQuery
qryUpdate.prepare("UPDATE Student SET age=:Age WHERE id = :ID");
while (qryEmpList.isValid()) // 当前记录有效
{
int uid=qryEmpList.value("id").toInt(); // 获取uid
int uage=qryEmpList.value("age").toInt(); // 获取age
uage=uage+1; // 年龄+1
qryUpdate.bindValue(":ID",uid);
qryUpdate.bindValue(":Age",uage); // 设置SQL语句参数
qryUpdate.exec(); // 执行update
if (!qryEmpList.next()) // 移动到下一条记录,并判断是否到末尾了
break;
}
// 数据模型重新查询数据,更新tableView的显示
qryModel->query().exec();
}