Qt數據庫 QSqlTableModel實例操作(轉)

本文介紹的是Qt數據庫 QSqlTableModel實例操作,詳細操作請先來看內容。與上篇內容銜接着,不顧本文也有關於上篇內容的鏈接。

 

Qt數據庫 QSqlTableModel實例操作是本文所介紹的內容,我們先來看內容。在上一篇我們講到只讀的QSqlQueryModel也可以使其可編輯,但是很麻煩。Qt提供了操作單表的QSqlTableModel,如果我們需要對錶的內容進行修改,那麼我們就可以直接使用這個類。

相關聯文章:

Qt數據庫 QSqlQueryModel實例操作 上篇

Qt數據庫 QSqlQueryModel實例操作 下篇

QSqlTableModel,該類提供了一個可讀寫單張SQL表的可編輯數據模型。我們下面就對其的幾個常用功能進行介紹,分別是修改,插入,刪除,查詢,和排序。

在開始講之前,我們還是新建Qt4 Gui Application工程,我這裏工程名爲tableModel ,然後選中QtSql模塊,Base class選QWidget。工程建好後,添加C++ Header File ,命名爲database.h,更改其內容如下:

 
#ifndef DATABASE_H  
#define DATABASE_H  

#include <QSqlDatabase> 
#include <QSqlQuery> 
#include <QObject> 
static bool createConnection()  
{  
    QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);  
    db.setDatabaseName(“database.db”);  
    if(!db.open()) return false;  
    QSqlQuery query;  
    query.exec(QObject::tr(“create table student (id int primary key, name vchar)”));  
    query.exec(QObject::tr(“insert into student values (0,’劉明’)”));  
    query.exec(QObject::tr(“insert into student values (1,’陳剛’)”));  
    query.exec(QObject::tr(“insert into student values (2,’王紅’)”));  
    return true;  
}  
#endif // DATABASE_H 

爲了在數據庫中能使用中文,我們使用了QObject類的tr()函數。而在下面的main()函數中我們也需要添加相應的代碼來支持中文。

然後將main.cpp的文件更改如下:

#include <QtGui/QApplication> 
#include “widget.h”  
#include “database.h”  
#include <QTextCodec> 
int main(int argc, char *argv[])  
{  
    QApplication a(argc, argv);  
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());  
    if(!createConnection())  
        return 1;  
    Widget w;  
    w.show();  
    return a.exec();  
} 

下面我們打開widget.ui,設計界面如下:

Qt數據庫 QSqlTableModel實例操作

其中的部件有Table View 和 Line Edit,其餘是幾個按鈕部件。

然後在widget.h中加入頭文件: #include <QSqlTableModel>

在private中聲明對象:QSqlTableModel *model;

因爲我們要在不同的函數中使用model對象,所以我們在這裏聲明它。

我們到widget.cpp文件中的構造函數裏添加如下代碼:

 
model = new QSqlTableModel(this);  
model->setTable(“student”);  
model->setEditStrategy(QSqlTableModel::OnManualSubmit);  
model->select(); //選取整個表的所有行  
// model->removeColumn(1); //不顯示name屬性列,如果這時添加記錄,則該屬性的值添加不上  
ui->tableView->setModel(model);  
// ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);   //使其不可編輯 

此時運行程序,效果如下:

Qt數據庫 QSqlTableModel實例操作

可以看到,這個模型已經完全脫離了SQL語句,我們只需要執行select()函數就能查詢整張表。上面有兩行代碼被註釋掉了,你可以取消註釋,測試一下它們的作用。

第一,修改操作。

1.我們進入“提交修改”按鈕的單擊事件槽函數,修改如下:

 
void Widget::on_pushButton_clicked() //提交修改  
{  
    model->database().transaction(); //開始事務操作  
    if (model->submitAll()) {  
        model->database().commit(); //提交  
    } else {  
        model->database().rollback(); //回滾  
        QMessageBox::warning(this, tr(“tableModel”),  
                             tr(“數據庫錯誤: %1″)  
                             .arg(model->lastError().text()));  
    }  
} 

這裏用到了事務操作,真正起提交操作的是model->submitAll()一句,它提交所有更改。

 

2、進入“撤銷修改”按鈕單擊事件槽函數,並更改如下:

 
void Widget::on_pushButton_2_clicked() //撤銷修改  
{  
     model->revertAll();  
} 

它只有簡單的一行代碼。

我們需要在widget.cpp文件中添加頭文件:

 
  1. #include <QMessageBox> 
  2. #include <QSqlError> 

此時運行程序,效果如下:

Qt數據庫 QSqlTableModel實例操作

我們將“陳剛”改爲“李強”,如果我們點擊“撤銷修改”,那麼它就會重新改爲“陳剛”,而當我們點擊“提交修改”後它就會保存到數據庫,此時再點擊“撤銷修改”就修改不回來了。

可以看到,這個模型可以將所有修改先保存到model中,只有當我們執行提交修改後,纔會真正寫入數據庫。當然這也是因爲我們在最開始設置了它的保存策略:

 
  1. model->setEditStrategy(QSqlTableModel::OnManualSubmit); 

OnManualSubmit表明我們要提交修改才能使其生效。

第二,查詢操作。

1.我們進入“查詢”按鈕的單擊事件槽函數,更改如下:

 
void Widget::on_pushButton_7_clicked() //查詢  
{  
    QString name = ui->lineEdit->text();  
    model->setFilter(QObject::tr(“name = ‘%1′”).arg(name)); //根據姓名進行篩選  
    model->select(); //顯示結果  
} 

我們使用setFilter()函數進行關鍵字篩選,這個函數是對整個結果集進行查詢。爲了使用變量,我們使用了QObject類的tr()函數。

2.我們進入“返回全表”按鈕的單擊事件槽函數,更改如下:

 
void Widget::on_pushButton_8_clicked() //返回全表  
{  
    model->setTable(“student”);   //重新關聯表  
    model->select();   //這樣才能再次顯示整個表的內容  
} 

爲了再次顯示整個表的內容,我們需要再次關聯這個表。

運行效果如下:

Qt數據庫 QSqlTableModel實例操作

我們輸入一個姓名,點擊“查詢”按鈕後,就可以顯示該記錄了。再點擊“返回全表”按鈕則返回。

 

第三,排序操作。

我們分別進入“按id升序排列”和“按id降序排列”按鈕的單擊事件槽函數,更改如下:

 
void Widget::on_pushButton_5_clicked() //升序  
{  
    model->setSort(0,Qt::AscendingOrder); //id屬性,即第0列,升序排列  
    model->select();  
}  
void Widget::on_pushButton_6_clicked() //降序  
{  
    model->setSort(0,Qt::DescendingOrder);  
    model->select();  
} 

我們這裏使用了setSort()函數進行排序,它有兩個參數,第一個參數表示按第幾個屬性排序,表頭從左向右,最左邊是第0個屬性,這裏就是id屬性。第二個參數是排序方法,有升序和降序兩種。

運行程序,效果如下:

Qt數據庫 QSqlTableModel實例操作

這是按下“按id降序排列”按鈕後的效果。

第四,刪除操作。

我們進入“刪除選中行”按鈕單擊事件槽函數,進行如下更改:

 
void Widget::on_pushButton_4_clicked() //刪除當前行  
{  
    int curRow = ui->tableView->currentIndex().row();  
    //獲取選中的行  
    model->removeRow(curRow);  
    //刪除該行  
    int ok = QMessageBox::warning(this,tr(“刪除當前行!”),tr(“你確定”  
                                                           “刪除當前行嗎?”),  
                         QMessageBox::Yes,QMessageBox::No);  
    if(ok == QMessageBox::No)  
    {  
       model->revertAll(); //如果不刪除,則撤銷  
    }  
    else model->submitAll(); //否則提交,在數據庫中刪除該行  
} 

這裏刪除行的操作會先保存在model中,當我們執行了submitAll()函數後纔會真正的在數據庫中刪除該行。這裏我們使用了一個警告框來讓用戶選擇是否真得要刪除該行。

運行效果如下:

Qt數據庫 QSqlTableModel實例操作

我們點擊第二行,然後單擊“刪除選中行”按鈕,出現了警告框。這時你會發現,表中的第二行前面出現了一個小感嘆號,表明該行已經被修改了,但是還沒有真正的在數據庫中修改,這時的數據有個學名叫髒數據(Dirty Data)。當我們按鈕“Yes”按鈕後數據庫中的數據就會被刪除,如果按下“No”,那麼更改就會取消。

第五,插入操作。

我們進入“添加記錄”按鈕的單擊事件槽函數,更改如下:

 
void Widget::on_pushButton_3_clicked() //插入記錄  

{  

    int rowNum = model->rowCount(); //獲得表的行數  

   int id = 10;  

    model->insertRow(rowNum); //添加一行  

  model->setData(model->index(rowNum,0),id);  

   //model->submitAll(); //可以直接提交  

} 

我們在表的最後添加一行,因爲在student表中我們設置了id號是主鍵,所以這裏必須使用setData函數給新加的行添加id屬性的值,不然添加行就不會成功。這裏可以直接調用submitAll()函數進行提交,也可以利用“提交修改”按鈕進行提交。

運行程序,效果如下:

Qt數據庫 QSqlTableModel實例操作

按下“添加記錄”按鈕後,就添加了一行,不過在該行的前面有個星號,如果我們按下“提交修改”按鈕,這個星號就會消失。當然,如果我們將上面代碼裏的提交函數的註釋去掉,也就不會有這個星號了。

可以看到這個模型很強大,而且完全脫離了SQL語句,就算你不怎麼懂數據庫,也可以利用它進行大部分常用的操作。我們也看到了,這個模型提供了緩衝區,可以先將修改保存起來,當我們執行提交函數時,再去真正地修改數據庫。當然,這個模型比前面的模型更高級,前面講的所有操作,在這裏都能執行。

本文章原創於www.yafeilinux.com

小結:Qt數據庫 QSqlTableModel實例操作的內容介紹完了,希望本文讀你有所幫助,耕讀資料請參考編輯推薦。

發佈了42 篇原創文章 · 獲贊 41 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章