一、QSqlQueryModel模型基本使用
//使用QSqlQueryModel來(lái)高效地查詢數(shù)據(jù)庫(kù)操作
//1、創(chuàng)建QSqlQueryModel對(duì)象,并設(shè)置相關(guān)的表頭信息
QSqlQueryModel* model = new QSqlQueryModel;
//執(zhí)行sql語(yǔ)句,將查詢出來(lái)的結(jié)果轉(zhuǎn)換成model對(duì)象
model->setQuery("select name ,age,address,salary from staff");
//根據(jù)需求設(shè)置表頭信息
model->setHeaderData(0,Qt::Horizontal,"Name");
model->setHeaderData(1,Qt::Horizontal,"Age");
model->setHeaderData(2,Qt::Horizontal,"Address");
model->setHeaderData(3,Qt::Horizontal,"Salary");
//給ui控件設(shè)置一個(gè)模型
QTableView* view = new QTableView(ui->tableView);
view->setFixedSize(QSize(this->width(),this->height()));
view->setModel(model);//相當(dāng)于將數(shù)據(jù)聯(lián)動(dòng)到UI控件上
//將view顯示
view->show();
運(yùn)行后,頁(yè)面就可以顯示出數(shù)據(jù)庫(kù)表格相關(guān)信息了。
二、QSqlQueryModel可編輯接口重寫
默認(rèn)情況下,QSqlQueryModel模型是只讀的。要使它具有可讀寫性,必須繼承它并重新實(shí)現(xiàn)setData()和flags()。另一種選擇是使用QSqlTableModel,它提供了基于單個(gè)數(shù)據(jù)表的讀寫模型。
接口一:
[virtual]bool setData(const QModelIndex &index,const QVariant &value,int role = Qt::EditRole)
接口二:
[override virtual]Qt::ItemFlags flags(const QModelIndex &index)const
創(chuàng)建一個(gè)新的類用于編輯
editquerymodel.h
#ifndef EDITQUERYMODEL_H
#define EDITQUERYMODEL_H
#include
#include
class editQueryModel : public QSqlQueryModel
{
public:
editQueryModel();
//重寫基類的虛函數(shù)
bool setData(const QModelIndex &index,const QVariant &value,int role = Qt::EditRole);
Qt::ItemFlags flags(const QModelIndex &index)const;
private:
//自定義接口函數(shù)
//更新數(shù)據(jù)
void refresh();
//根據(jù)需求來(lái)定義修改表中的內(nèi)容的接口
bool setName(int useId,const QString& name);
};
#endif // EDITQUERYMODEL_H
editquerymodel.c
#include "editquerymodel.h"
editQueryModel::editQueryModel()
{
}
bool editQueryModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
//1、判斷是否為有效列 員工表--id 用戶名 年齡 地址 薪資
if(index.column() < 1 || index.column() > 4)
return false;
//獲取列所對(duì)應(yīng)的id
QModelIndex prinmaryIndex = QSqlQueryModel::index(index.row(),0);
int id = this->data(prinmaryIndex).toInt();
//在修改行時(shí),將數(shù)據(jù)清除,把整個(gè)model清空
this->clear();
bool ok;
//根據(jù)需求修改所對(duì)應(yīng)的列
if(index.column() == 1)
{
ok = setName(id,value.toString());
}
//刷新數(shù)據(jù)
refresh();
return ok;
}
Qt::ItemFlags editQueryModel::flags(const QModelIndex &index) const
{
//1、獲取當(dāng)前單元格的編輯狀態(tài)
Qt::ItemFlags flag = QSqlQueryModel::flags(index);
//2、給現(xiàn)有的標(biāo)志增加一個(gè)可編輯的標(biāo)志
// if(index.column()==1)
flag = flag | Qt::ItemIsEditable;//給它設(shè)置一個(gè)可編輯的狀態(tài)
return flag;
}
void editQueryModel::refresh()
{
//相當(dāng)于將數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢出來(lái),轉(zhuǎn)換成一個(gè)model
this->setQuery("select * from staff");
this->setHeaderData(0,Qt::Horizontal,"ID");
this->setHeaderData(1,Qt::Horizontal,"Name");
this->setHeaderData(2,Qt::Horizontal,"Age");
this->setHeaderData(3,Qt::Horizontal,"Address");
this->setHeaderData(4,Qt::Horizontal,"Salary");
}
bool editQueryModel::setName(int useId, const QString &name)
{
//相當(dāng)于一個(gè)刷新的操作
QSqlQuery query;
query.prepare("update staff set name = ? where id = ?");
query.addBindValue(name);
query.addBindValue(useId);
return query.exec();
}
-
SQL
+關(guān)注
關(guān)注
1文章
768瀏覽量
44177 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3827瀏覽量
64517 -
SQlite
+關(guān)注
關(guān)注
0文章
78瀏覽量
15960
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論