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();
}
    原文作者:ijiali
    原文地址: https://segmentfault.com/a/1190000020801764
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞