乐趣区

Qt-使用sql模型类显示数据库信息

显示方法有 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();}
退出移动版