前面介绍了数据库都是要使用SQL语句,并在显示方面不方便,不够直观反映数据。

上节介绍一个模型,可以直接利用该模型连接数据库,可以在QT的可视化界面TabView直接对数据库进行操作,并且不需要使用SQL语句。

 

思路:

1.按照前面的方式,选择数据库的类型,打开数据库

   QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");

    db.setHostName("127.0.0.1");

    db.setUserName("root");

    //db.setPassword("123");

    db.setDatabaseName("stu");

    if(!db.open())

    {

        return ;

}

2.设置模型,把二维表装进模型中。

      model=new QSqlTableModel(this);

    model->setTable("student");

3. 本例用tableView控件作为显示,把model放在tableView

  ui->tableView->setModel(model);

4.对tableView控件进行操作即可

 

重点:

  1. 给字段起别名,在数据库中可能有些不一样,因此可以在tableView中重命名。

bool QSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant & value, int role = Qt::EditRole)

如:model->setHeaderData(0,Qt::Horizontal,"学号");

36可视化操作数据库_sed

 

2.提交问题。在tabVlew上我们可以直接对数据进行修改,如把学号1改成2,直接可以改变。可以设置手动提交或其他方式。

void QSqlTableModel::setEditStrategy(EditStrategy strategy)

如:model->setEditStrategy(QSqlTableModel::OnManualSubmit);

参数:

QSqlTableModel::OnFieldChange  0    一改动马上提交数据库

QSqlTableModel::OnRowChange  1    点击行号再提交数据库

QSqlTableModel::OnManualSubmit     2    只有使用submitAll()和revertAll() 提交

 

3. tabVlew只做显示,不做修改。

void      setEditTriggers(EditTriggers triggers)

如:ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);

Constant     Value    Description

QAbstractItemView::NoEditTriggers   0    No editing possible.

QAbstractItemView::CurrentChanged  1    Editing start whenever current item changes.

QAbstractItemView::DoubleClicked    2    Editing starts when an item is double clicked.

QAbstractItemView::SelectedClicked  4    Editing starts when clicking on an already selected item.

QAbstractItemView::EditKeyPressed   8    Editing starts when the platform edit key has been pressed over an item.

QAbstractItemView::AnyKeyPressed  16  Editing starts when any key is pressed over an item.

QAbstractItemView::AllEditTriggers    31  Editing starts for all above actions.

4.显示model的数据

model->select();

 

 

添加操作

    //获取空记录

    QSqlRecord record=model->record();

    //获取行号,即最后一行

    int row=model->rowCount();

    //qDebug()<<row;

    //在最后一行增加记录

    model->insertRecord(row,record);

 

提交操作

model->submitAll();

撤销操作

model->revertAll();

 

删除操作

    //获取选中的模型

    QItemSelectionModel *sModel=ui->tableView->selectionModel();

    //返回选中行的索引,每一个索引代表一行的数据

    QModelIndexList list=sModel->selectedRows();

    //删除所有选中的行

    for(int i=0;i<list.size();++i)

    {

        model->removeRow(list.at(i).row());

}

 

查找操作

    //获取查找的名字

    QString str=QString("sname='%1'").arg(ui->lineEdit->text());

    //查找

    model->setFilter(str);

 

结果图

36可视化操作数据库_sed_02

36可视化操作数据库_#include_03

36可视化操作数据库_sed_04

 

 

 

 

源代码

.h

#ifndef WIDGET_H

#define WIDGET_H

 

#include <QWidget>

#include <QSqlTableModel>

 

 

namespace Ui {

class Widget;

}

 

class Widget : public QWidget

{

    Q_OBJECT

 

public:

    explicit Widget(QWidget *parent = 0);

    ~Widget();

 

private slots:

    void on_btnAdd_clicked();

 

    void on_btnSure_clicked();

 

    void on_btnCancel_clicked();

 

    void on_btnDel_clicked();

 

    void on_btnFind_clicked();

 

    void on_btnUpdata_clicked();

 

private:

    Ui::Widget *ui;

    QSqlTableModel *model;

};

 

#endif // WIDGET_H

 

 

.cpp

#include "widget.h"

#include "ui_widget.h"

#include <QtSql/QSqlDatabase>

#include <QDebug>

#include <QSqlRecord>

#include <QItemSelectionModel>

 

Widget::Widget(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Widget)

{

    ui->setupUi(this);

    qDebug()<<QSqlDatabase::drivers();

 

    //选择数据库并打开

    QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");

 

    db.setHostName("127.0.0.1");

    db.setUserName("root");

    //db.setPassword("123");

    db.setDatabaseName("stu");

 

    if(!db.open())

    {

        return ;

    }

 

    //设置模型

    model=new QSqlTableModel(this);

    model->setTable("student");

    //把model放在tableView

    ui->tableView->setModel(model);

 

    //给字段起别名

    model->setHeaderData(0,Qt::Horizontal,"学号");

    //设置model的编辑模式,手动提交修改

    model->setEditStrategy(QSqlTableModel::OnManualSubmit);

    //不可以改变tableView中数据

    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);

 

    //显示model里的数据

    model->select();

 

}

 

Widget::~Widget()

{

    delete ui;

}

 

void Widget::on_btnAdd_clicked()

{

    //获取空记录

    QSqlRecord record=model->record();

    //获取行号,即最后一行

    int row=model->rowCount();

    //qDebug()<<row;

    //在最后一行增加记录

    model->insertRecord(row,record);

}

 

void Widget::on_btnSure_clicked()

{

    //提交到数据库。更新

    model->submitAll();

}

 

void Widget::on_btnCancel_clicked()

{

    //撤销提交

    model->revertAll();

    //更新

    model->submitAll();

}

 

void Widget::on_btnDel_clicked()

{

    //获取选中的模型

    QItemSelectionModel *sModel=ui->tableView->selectionModel();

    //返回选中行的索引,每一个索引代表一行的数据

    QModelIndexList list=sModel->selectedRows();

    //删除所有选中的行

    for(int i=0;i<list.size();++i)

    {

        model->removeRow(list.at(i).row());

    }

}

 

void Widget::on_btnFind_clicked()

{

    //获取查找的名字

    QString str=QString("sname='%1'").arg(ui->lineEdit->text());

    //查找

    model->setFilter(str);

    //显示

    model->select();

}

 

void Widget::on_btnUpdata_clicked()

{

    //刷新页面

    model->setTable("student");

    ui->tableView->setModel(model);

    model->select();

}