显示方法有3类,分别为:关系表格模型、表格模型、查询模型
显示步骤基本为:
1 创建model
2 为model指定数据库表
3 (关系表格模型先设置关系)选择表内容
4 将model应用于view
下面是代码片段,
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlQueryModel>
#include <QSqlTableModel>
#include <QSqlRelationalTableModel>
#include <QSqlRelationalDelegate>
#include <QTableView>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//使用关系表格模型显示数据
QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this);
model->setTable("student");
model->setRelation(2, QSqlRelation("course", "id", "name"));
model->select();
/*
//这里view范围不同
QTableView *view = new QTableView(this);
view->setModel(model);
setCentralWidget(view);
*/
ui->tableView->setModel(model);
//使用委托类提供一个qcombobox部件显示可选数据
ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));
/*
* //使用表格模型显示数据
//QSqlTableModel *model = new QSqlTableModel(this);
//这里起初写成了上面语句,可以运行与显示,但是后面按钮使用会崩溃,因为暂时覆盖了头文件中定义的指针,构造函数结束后调用的头文件中的指针是空的。
model = new QSqlTableModel(this);
model->setTable("student");
model->select();
//设置编辑策略
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
ui->tableView->setModel(model);
*/
/*
* //使用查询模型显示数据
QSqlQueryModel *model = new QSqlQueryModel(this);
model->setQuery("select * from student");
model->setHeaderData(0, Qt::Horizontal, "学号");
model->setHeaderData(1, Qt::Horizontal, "姓名");
model->setHeaderData(2, Qt::Horizontal, "课程");
QTableView *view = new QTableView(this);
view->setModel(model);
setCentralWidget(view);
*/
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//保存修改
//开始事务操作
model->database().transaction();
if (model->submitAll()){
if (model->database().commit())
QMessageBox::information(this, "tableModel", "数据修改成功");
}else{
model->database().rollback();
QMessageBox::warning(this, "tableModel",
QString("数据库错误:'%1'").arg(model->lastError().text()),
QMessageBox::Ok);
}
}
void MainWindow::on_pushButton_2_clicked()
{
model->revertAll();//恢复所有未提交的修改(model中的修改)
}
void MainWindow::on_pushButton_7_clicked()
{
QString name = ui->lineEdit->text();
//根据姓名进行筛选,%1一定要使用单引号
model->setFilter(QString("name = '%1'").arg(name));
model->select();
}
void MainWindow::on_pushButton_8_clicked()
{
//显示全表
model->setTable("student");
model->select();
}
void MainWindow::on_pushButton_5_clicked()
{
//按id字段,即第0列,升序排列
model->setSort(0, Qt::AscendingOrder);
model->select();
}
void MainWindow::on_pushButton_6_clicked()
{
//按id降序排列
model->setSort(0, Qt::DescendingOrder);
model->select();
}
void MainWindow::on_pushButton_4_clicked()
{
//删除选中行
int curRow = ui->tableView->currentIndex().row();
qDebug()<<curRow;
model->removeRow(curRow);
int ok = QMessageBox::warning(this, "删除当前行", "确定删除当前行吗?",
QMessageBox::Yes, QMessageBox::No);
if (ok == QMessageBox::No){
model->revertAll();
}else{
model->submitAll();
}
}
void MainWindow::on_pushButton_3_clicked()
{
//增加一行记录
//获得表的行数
int rowNum = model->rowCount();
int id = 10;
//添加一行
model->insertRow(rowNum);
model->setData(model->index(rowNum, 0), id);
//可以直接提交
//model->submitAll();
}