QSqlTableModel 使用方法

QSqlTableModel 使用方法
2013年03月27日 ⁄ 綜合 ⁄ 共 9196字 ⁄ 字型大小 小 中 大 ⁄ 評論關閉

Qt QSqlTableModel 使用心得

連接資料庫

執行sql查詢,條件顯示,排序

獲取記錄數,列數以及記錄內容,欄位內容

新增,修改,刪除,恢復

其它

1---------------連接資料庫(我用的access2003做實驗)

在.pro文件添加

QT +=SQL

win32:CONFIG+=console

------------------------MAIN.CPP---------------

#include <QtGui/QApplication>

#include

#include

#include

#include

#include

#include

#include

#include “mainwindow.h”

int main(intargc, char *argv[])

{

QApplication a(argc, argv);

// MainWindow w;

//w.show();

QSqlDatabase db = QSqlDatabase::addDatabase(“QODBC”);

db.setDatabaseName(“DRIVER={Microsoft AccessDriver (*.mdb)};FIL={MS Access};DBQ=barcode.mdb;UID=’’;PWD=’’”);

bool ok = db.open();

if(ok)

{

qDebug()<<“connect ok!”;

}

else

{

qDebug()<<“connect error!”;

return false;

}

return a.exec();

}

2-----執行sql查詢,條件顯示,排序

查詢:

model = newQSqlTableModel(this);
model->setTable(「student」);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select(); //選取整個表的所有行
// model->removeColumn(1); //不顯示第二列,如果這時添加記錄,則該屬性的值添加不上

QTableView *view= new QTableView;

view->setModel(model);

view->show();

//View->setEditTriggers(QAbstractItemView::NoEditTriggers); 使其不可編輯

條件:(等價於SQL語句的where)

model->setFilter(QObject::tr(「name= 『admin』」).arg(name)); //根據姓名進行篩選
model->select(); //顯示結果

排序:(等價於ORDERBY)
model->setSort(0,Qt::AscendingOrder); //id屬性,即第0列,升序排列
model->select();

model->setSort(0,Qt::DescendingOrder); //id屬性,即第0列,降序排
model->select();

3------獲取記錄數,列數以及記錄內容,欄位內容

記錄數: Model->rowcount

記錄值:

值=model.record(num).value(1).toString();

Qrecord record= QSqlRecord record = tablemodel.record(記錄行數);

值=Record.value(「欄位名或索引」)

欄位數:

欄位值:

4------新增,修改,刪除,提交,撤銷

新增:

int rowNum = model->rowCount();//獲得表的行數
int id = 10;
model->insertRow(rowNum); //添加一行
model->setData(model->index(rowNum,0),id);
//model->submitAll(); //可以直接提交

或者用record添加

QSqlRecord record = tablemodel.record();

record.setValue(“nam”,“new”);

model.insertRecord(1,record);

修改:

首先用條件找到某一條記錄

QSqlRecord record = tablemodel.record(num);

record.setValue(“name”,record.value(“name”).toString()+“2”);

tablemodel.setRecord(num,record);

if(tablemodel.submitAll())

“成功!”

else

“失敗!”

或者用下面方法用setData()來修改,代碼如下:
model.setData(model.index(1,1),“new”);
if(tablemodel.submitAll())
“成功!”
else
“失敗!”

刪除:
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(); //否則提交,在資料庫中刪除該行

如果沒有table

tablemodel.removeRows(起始行, 要刪除的總行數);
model.submitAll();

提交

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->revertAll();

5------其它

SQL模型類-QSqlTableModel模型

QSqlTableModel類繼承至QSqlQueryModel類,該類提供了一個可讀寫單張SQL表的可編輯數據模型,功能:修改,插入,刪除,查詢,和排序

常用函數

QVariantheaderData ( intsection,Qt::Orientationorientation, introle= Qt::DisplayRole ) const 獲取水平頭或垂直頭標題

bool setHeaderData ( intsection,Qt::Orientationorientation, constQVariant&value,
introle= Qt::EditRole ) 設置水平頭或垂直頭標題

int rowCount ( constQModelIndex&parent= QModelIndex() ) const // 返回行數

int columnCount ( constQModelIndex&index= QModelIndex() ) const // 返回列數

virtual bool removeColumns ( int column, int count, const QModelIndex & parent = QModelIndex() ) //model->removeColumns (0)刪除第一列

bool QSqlTableModel::submitAll (),//提交所有被修改的數據,然後修改的數據被保存在資料庫中

void QSqlTableModel::revertAll () //撤銷所有的修改,如果資料庫已經被提交了修改,就不能通過撤銷修改改回來了

virtual void revertRow ( int row ) //恢復指定行的改變

void QSqlTableModel::setFilter ( const QString & filter ) //篩選,按照字元串filter對資料庫進行篩選,相當於SQL中的WHERE語句

bool QSqlTableModel::select () //在篩選和排序的條件下,將資料庫中符合要求的在mode表格中顯示出來

void QSqlTableModel::setSort ( int column, Qt::SortOrder order ) //排序操作。按照列和Qt::SortOrder排序。Qt::SortOrder有升序和降序

bool insertRow ( int row, const QModelIndex & parent = QModelIndex() ) //插入行

bool insertColumn ( intcolumn, constQModelIndex&parent= QModelIndex() ) // 插入列

model->setEditStrategy(QSqlTableModel::OnManualSubmit); //設置保存策略為手動提交

一、在QTableView中顯示資料庫中表的數據

QSqlTableModel *model = new QSqlTableModel(parentObject, database);
// 摘抄自幫助文檔
model->setTable(“employee”);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->removeColumn(0); // don’t show the ID
model->setHeaderData(0, Qt::Horizontal, tr(“Name”));
model->setHeaderData(1, Qt::Horizontal, tr(“Salary”));
QTableView *view = new QTableView;
view->setModel(model);
view->show();
二、修改QTableView中數據後的提交,加入事務處理

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->revertAll(); //撤銷修改
三、查詢操作

相當於SQL語句:SELECT * FROM 表名 WHERE name = “name變數”

model->setFilter(QObject::tr(「name = 『%1′」).arg(name));
//根據姓名進行篩選
model->select(); //顯示結果
for (int i = 0; i < model.rowCount(); ++i)
{
QString name = model.record(i).value(“name”).toString();
// … 在此處理每一條的記錄
}
// 在操作大數據集時,建議通過索引指定欄位
int primaryKeyIndex = model.record().indexOf(“id”);
for (int i = 0; i < model.rowCount(); ++i)
{
QSqlRecord record = model.record(i);
QString name = record.value(“name”).toString();
// … 在此處理每一條的記錄
}
四、排序操作

model->setSort(0,Qt::AscendingOrder); //id屬性,即第0列,升序排列,Qt::DescendingOrder為降序排序
model->select();
五、插入操作

int rowNum = model->rowCount(); //獲得表的行數
int id = 最後一個ID+1;
model->insertRow(rowNum); //添加一行,或者用insertRows(0,1),在0行添加1條記錄,根據表的排序規則,可能移到與指定行不同的行位置上
model->setData(model->index(rowNum,0),id); //因為這裡設置了ID為主鍵,所以必須給新行添加id屬性值,id欄位在第0列上
model->submitAll(); //可以直接提交
六、刪除一條記錄

首先要定位到待刪除的行上

model.setFilter(“id = 10”);
model.select();
if (model.rowCount() == 1)
{
model.removeRows(0,1) // 如果要刪除所有滿足條件的記錄則把1改成model.rowCount()
model.submitAll();
}
在QTableView中刪除選中的一行

int curRow = tableView->currentIndex().row();
model->removeRow(curRow); //刪除一行
在QTableView中刪除選中的多行

QAbstractItemView::SelectionModeselectionMode()const // 原型

QModelIndexListQItemSelectionModel::selectedIndexes()const //原型

QItemSelectionModel *selections = tableView->selectionModel();
//返回當前的選擇模式
QModelIndexList selecteds = selections->selectedIndexes(); //返回所有選定的模型項目索引列表
foreach (QModelIndex index, selecteds)
{
int curRow = index.row(); //刪除所有被選中的行
model->removeRow(curRow);
}
int ok = QMessageBox::warning(this,tr(“刪除選中的行!”),tr(“你確定刪除當前選取中的行嗎?”),QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::Yes)
{
model->submitAll(); //提交,在資料庫中刪除該行
} else {
model->revertAll(); //如果不刪除,則撤銷
}
七、更新記錄

必須先定位記錄

model.setFilter(“id = 10”);
model.select();
if (model.rowCount() == 1)
{
model.setData(model.index(0,1),QObject::tr(“小王”));
model.submitAll();
}
可以看到這個模型很強大,而且完全脫離了SQL語句,就算你不怎麼懂資料庫,也可以利用它進行大部分常用的操作。這個模型提供了緩衝區,可以將所有修改先保存到model中,只有當我們執行提交修改後,才會真正寫入資料庫。當然這也是因為我們在最開始設置了它的保存策略:

model->setEditStrategy(QSqlTableModel::OnManualSubmit);

OnManualSubmit表明我們要提交修改才能使其生效。可以先將修改保存起來,當我們執行提交函數時,再去真正地修改資料庫。當然,這個模型比前面的模型更高級,前面講的所有操作,在這裡都能執行。

he QSqlTableModel class provides an editable data model for a single database table.More…

[cpp]
view plaincopyprint?
<span style="color: rgb(64, 64, 64);"class=“preprocessor”>#include
Inherits: QSqlQueryModel.

Inherited by: QSqlRelationalTableModel.

List of all members, including inherited members

Public Types
enum EditStrategy { OnFieldChange, OnRowChange, OnManualSubmit }

Public Functions
QSqlTableModel ( QObject *parent = 0, QSqlDatabase
db = QSqlDatabase() )
virtual ~QSqlTableModel ()
QSqlDatabase database () const
EditStrategy editStrategy () const
int fieldIndex ( const QString &fieldName ) const
QString filter () const
bool insertRecord ( introw, const QSqlRecord &
record )
bool isDirty ( const QModelIndex &index ) const
QSqlIndex primaryKey () const
virtual void revertRow ( introw )
virtual bool select ()
virtual void setEditStrategy ( EditStrategystrategy )
virtual void setFilter ( const QString &filter )
bool setRecord ( introw, const QSqlRecord &
record )
virtual void setSort ( intcolumn, Qt::SortOrder
order )
virtual void setTable ( const QString &tableName )
QString tableName () const

Reimplemented Public Functions
virtual void clear ()
virtual QVariant data ( const QModelIndex &index, int
role = Qt::DisplayRole ) const
virtual Qt::ItemFlags flags ( const QModelIndex &index ) const
virtual QVariant headerData ( intsection, Qt::Orientation
orientation, int role = Qt::DisplayRole ) const
virtual bool insertRows ( introw, int
count, const QModelIndex & parent = QModelIndex() )
virtual bool removeColumns ( intcolumn, int
count, const QModelIndex & parent = QModelIndex() )
virtual bool removeRows ( introw, int
count, const QModelIndex & parent = QModelIndex() )
virtual int rowCount ( const QModelIndex &parent = QModelIndex() ) const
virtual bool setData ( const QModelIndex &index, const QVariant &
value, int role = Qt::EditRole )
virtual void sort ( intcolumn, Qt::SortOrder
order )
16 public functions inherited from
QSqlQueryModel
2 public functions inherited from
QAbstractTableModel
35 public functions inherited from
QAbstractItemModel
29 public functions inherited from
QObject

Public Slots
virtual void revert ()
void revertAll ()
virtual bool submit ()
bool submitAll ()
2 public slots inherited from
QAbstractItemModel
1 public slot inherited from
QObject

Signals
void beforeDelete ( introw )
void beforeInsert ( QSqlRecord &record )
void beforeUpdate ( introw, QSqlRecord &
record )
void primeInsert ( introw, QSqlRecord &
record )
18 signals inherited from
QAbstractItemModel
1 signal inherited from
QObject

Protected Functions
virtual bool deleteRowFromTable ( introw )
QModelIndex indexInQuery ( const QModelIndex &item ) const
virtual bool insertRowIntoTable ( const QSqlRecord &values )
virtual QString orderByClause () const
virtual QString selectStatement () const
void setPrimaryKey ( const QSqlIndex &key )
void setQuery ( const QSqlQuery &query )
virtual bool updateRowInTable ( introw, const QSqlRecord &
values )

猜你喜欢

转载自blog.csdn.net/qq_43248127/article/details/91870079