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();
}
相關文章
相關標籤/搜索