QSqlTableModel Class
参考(来自
QtSql
模块)
该类为单个数据表提供一种可编辑的数据模型。
#include <QSqlTableModel>
该类不是
Qt GUI Framework Edition
中的一类。
继承
QSqlQueryModel
被继承
QSqlRelationTableModel
公共类型:
enum EditStrategy{OnFieldChange,OnRowChange,OnManualSubmit}
公共函数:
QSqlTableModel(QObject* parent =0,QSqlDatabase db=QSqlDatabase())
virtual ~QSqlTableModel
QSqlDatabase database() const
EditStrategy editStrategy() const
Int filedIndex(const QString & fieldName)const
QString filter()const
bool insertRecord(int row,const QSqlRecord&record)
bool isDirty(const QModelIndex&index)const
QSqlIndex primaryKey()const
virtual void revertRow(int row)
virtual bool select();
virtual void setEditStrategy(EditStrategy strategy)
virtual void setFilter(const QString&filter)
bool setRecord(int row,const QSqlRecord&record)
virtual void setSort(int column,Qt::SortOrder order)
virtual void setTable(const QString&tableName)
QString tableName()const
重用公共函数
virtual void clear()
virtual QVariant data(cost QModelIndex&index,int role=Qt::DisplayRole)const
virtual Qt::ItemFlags flags(const QModelIndex&index)const
virtual QVariant headerData(int section,Qt::Qrientation orientation,int role=Qt::DisplayRole)const
virtual bool insertRows(int row,int count,const QModelIndex&parent=QModelIndex())
virtual bool removeColumns(int column,int count,const QModelIndex&parent=QModelIndex())
virtual bool removeRows(int row,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(int column,Qt::SortOrder order)
16
个公共函数继承从
QSqlQueryModel
2
个公共函数继承从
QAbstractTableModel
35
个公共函数继承从
QAbstractItemModel
29
个公共函数继承从
QObject
公共槽
virtual void revert()
void revertAll()
virtual bool submit()
bool submitAll()
2
个公共槽继承从
QAbstractItemModel
1
个公共槽继承从
QObject
信号:
void beforeDelete(int row)
void beforeInsert(QSqlRecord&record)
void beforeUpdate(int row,QSqlRecord&record)
void primeInsert(int row,QSqlRecord&record)
18
个信号继承从
QAbstractItemModel
1
个信号继承从
QObject
受保护的函数
virtual bool deleteRowFromTable(int row)
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(int row,const QSqlRecord&values)
3
个受保护的函数继承从
QSqlQueryModel
21
个受保护的函数继承从
QAbstractItemModel
7
个受保护的函数继承从
QObject
附加的继承的成员
1
个特性继承从
QObject
5
个静态公共成员继承从
QObject
详细描述:
该类是一种为从单一数据表读写数据库的高层次的接口。他是建立在低层次的
QSqlQuery
上的,能够被用来提供数据给视图类,例如
QTableView
。
QSqlTableModel *model = new QSqlTableModel;
model->setTable(“employee”); //
查询
employee
这个表
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->removeColumn(0); //
不显示
ID
model->setHeaderData(0,Qt::Horizontal,tr(“Name”));
model->setHeaderData(0,Qt::Horizontal,tr(“Salary”));
QTableView *view = new QTableView;
view->setModel(model);
view->show();
我们设置
SQL
表的名字,编辑策略,然后我们建立显示在标题栏的标签。编辑策略指定当用户在
view
中改变数据时,也同样应用到数据库中。可能的选项是
OnFieldChange,OnRowChange,OnManualSubmit.
QSqlTableModel
也能被用来程序化地进入数据库,不绑定到一个
VIEW.
QSqlTableModel model;
Model.setTable(“employee”);
QString name = model.record(4).value(“name”).toString();
上面的代码段从查询“
select * from employee
”结果中的记录
4
,提取工资域。
可以用
setFilter()
设置过滤器,用
setSort()
修改分类顺序。最后,你必须调用
select()
把数据添加到模型中。
Sql/tablemodel
例子说明怎样用
QSqlTableModel
作为
QTableView
的数据源。
QSqlTableModel
没有提供对外来键的直接支持。用
QSqlRelationTableModel
和
QSqlRelatinalDelegate
来解决外来键的问题。
也看
QSqlRelationTableModel,QSqlQuery,Model/View Programming,Table Model Example,
和
Cached Table Example.
成员类型程序说明
enum QSqlTableModel::EditStrategy
这个
enum
类型描述当编辑数据库的值时,哪一种策略被选择。
QSqlTableModel::OnFieldChange 0
所有改变立即被应用到数据库
QSqlTableModel::OnRowChange 1
在一行的改变将在用户选择另一行时被应用
QSqlTableModel::OnManulSubmit 2
所有改变将被放到缓存,直到调用
submitAll()
或
revertAll()
注意:为阻止只是部分初始化的行插入数据库,对于新插入的行,
OnFieldChange
将和
OnRowChange
作用相同。
也看
setEditStrategy()
成员函数程序说明
QSqlTableModel::QsqlTableModel(QObject *parent=0,QSqlDatabase db=QSqlDatabase())
创建一个空的
QSqlTableModel
,并且设置父系为参数
parent
和数据库为
db
。如果
db
是无效的,缺省的数据库连接将被使用。
缺省的编辑策略是
OnRowChange
QSqlTableModel::~QSqlTableModel() [virtual]
毁掉对象并释放所有被分配的资源
void QSqlTableModel::beforeDelete(int row) [signal]
这个信号在某行从目前活动的数据表被删除时,从
deleteRowFromTable()
发出。
void QSqlTableModel::beforeInsert(QSqlRecord&record) [signal]
这个信号在某行被插入到目前活动的数据表时,被
insertRowIntoTable()
发出。这个即将被插入的值被存储在
record
,在他们将被插入之前能被更改。
void QSqlTableModel::beforeUpdate(int row,QSqlRecord&record) [signal]
这个信号在某行被更新之前,从
updateRowInTable()
发出。
注意:只有被标记为生成的值才被更新。生成标志可通过
QSqlRecord::setGenerated()
设置,并且用
QSqlRecord::isGenerated()
检查。
也看
QSqlRecord::isGenerated()
void QSqlTableModel::clear() [virtual]
重载从
QSqlQueryModel::clear()
Void QSqlQueryModel::clear() [virtual]
清除模型,释放任何获得的资源
QVariant QSqlTableModel::data(const QModelIndex&inex,int role=Qt::DisplayRole)const [virtual]
重载从
QAbstractItemModel:;data()
也看
setData()
QVariant QAbstractItemModel::data(const QModelIndex&index,int role=Qt::DisplayRole)const [pure virtual]
返回数据,该数据存储位置由
index
所指的项目和
role
确定。
注意:如果你没有一个值返回,返回一个无效的
QVariant
代替返回
0
也看
Qt::ItemDataRole,setData()
和
headreData()
QSqlDatabase QSqlTableModel::database() const
如果没有数据库被设置,返回一个指针指向使用的
QSqlDatabase
Bool QSqlTablemodel::deleteRowFromTable(int row) [virtual protected]
删除被给的行从目前的数据表。
这是一个低层次的直接操作数据库的方法,不应该被直接调用。使用
removerow()
或
removeRows()
删除值。当更改数据库时,这个模型将决定依赖他的编辑策略。
如果该行被删除返回真;否则返回假
也看
removeRow()
和
removeRow()
EditStrategy QSqltableModel::editStrategy() const
返回目前的编辑策略
Int QSqlTableModel::fieldIndex(const QString&fieldname) const
返回
filename
所指的域的
index
QString QSqlTableModel::filter() const
返回目前设置的过滤器
Qt::Itemflags QSqlTableModel::flags(const QModelIndex&index)const [virtual]
重载从
QAbstractItemModel::flags()
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex&index)cosnt [virtual]
返回
index
对应项目的标志
这个基类执行返回一个联合体或者标志,这个标志激活项目(
ItemIsEnabled
)并允许它被选择
(ItemIsSelectable)
QVariant QSqlTableModel::headerData(int section,Qt::Orientation orientation,int role=Qt::DisplayRole)cosnt [virtual]
重载
QAbstractItemModel::headerData()
QVariant QAbstractItemModel::headerData(int section,Qt::Orientation orientation,int role=Qt::DisplayRole)const [virtual]
返回数据,根据
role,
在标题的哪个
section,
以及特别的
orientation(
方向
).
对于水平的标题,
section
与列数关联。相似的,对于垂直的标题,
section
和行数关联。
也看
Qt::ItemDataRole,setHeaderData()
和
QHeaderView
QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item)const [protected]
返回
item
在数据库的
index
值。
如果没有行被插入,移动等,这个返回值与
item
是对应相同的
如果
item
不在范围之内或者如果
item
不指向结果集中的一个值,将返回一个无效的
index
也看
QSqlQueryModel::indexInQuery()
Bool QSqlTableMode::insertRecord(int row,const QSqlRecord&record)
在行后插入记录。如果行是拒绝的,记录将被添加到最后。立即调用
insetRows()
和
setRecord()
如果行能被插入,返回真
也看
insertRows()
和
removeRows()
Bool QSqlTableModel::insertRowIntoTable(const QSqlRecord&values) [virtual protected]
插入值到数据表中
这是一个低层次的直接操作数据库的方法,不应该被直接调用。使用
inssertRow()
和
setData()
来插入值。当更改数据库时,这个模型将决定依赖编辑策略。
如果这个值能够被插入,返回真,否则返回假。错误值能被
lastError()
找到
也看
lastError(),insertRow(),insertRows()
Bool QSqlTableModel::insertRows(int row,int count,const QModelIndex&parent=QModelIndex()) [virtual]
重载
QAbstractItemModel::insertRows()
插入
const
空行在位置
row.
注意:
parent
必须是无效的,因为这个模型不支持父子关系
同一时间只有一行被插入,当使用
OnFieldChange
和
OnRowChange
更新策略时
primeInsert()
信号将被发出为每个新行。如果你想初始化新行用缺省值,连接它。
如果参数是不在范围之内,返回假,否则返回真
也看
primeInsert()
和
isnertRecord()
Bool QSqlTableModel::isDirty(const QModelIndex &index)cosnt
如果在
index
的值是
dirty
,返回
true
。
Dirty
值指该值被修改但是没有被写入数据库
如果
index
是无效的或者指向一个不存在的行,返回
false
QString QSqlTableModel::orderByClause()const [virtual protected]
按照目前的排序规则返回一个
sql
也看
setSort()
和
selectStatement()
QSqlIndex QSqlTableModel::primaryKey()const
为目前的表返回逐渐。如果表没有被设置或者没有主键将返回一个空的
QSqlIndex
也看
setTable(),setPrimaryKey(),QSqlDatabase::primaryIndex()
Void QSqlTableModel::primeIndert(int row,QSqlRecord&record)[signal]
这个信号被
insertRows()
发出,当一个插入操作被初始化。
Record
参数能被写,例如填入一些域用缺省值
Bool QSqlTableModel::removeColumns(int column,int count,const QModelIndex&parent=QModelIndex())[virtual]
重载
QAbstractItemModel::removeColumns()
从
column
开始,移除
count
列从
parent
模型,
如果成功移除返回
true
也看
removeRows()
Bool QSqlTableModel::removeRows(int row,int count,cosnt QModelIndex&parent=QModelIndex()) [virtual]
重载从
QAbstractItemModel::removeRows()
从
row
开始,移除
count
行。因为该模型不支持父子模型,所以
parent
必须是一个无效的值
在一个信号被删除之前,发出
beforeDelete()
信号。当编辑策略是
OnManualSubmit
,信号发出被推迟直到
submitAll()
被调用。
如果所有行能被移除,返回真。
Void QSqlTableModel::revert()[virtual slot]
重载从
QAbstractItemModel::revert()
重载通道被项目代表调用,当用户取消编辑目前的行。
如果模型的策略被设置为
OnRowChange
恢复改变。其他的策略,什么也不做。
对于
OnManualSubmit
使用
revertAll()
来恢复所有未决的改变,或者
revertRow()
来恢复一个特别的行。
也看
submit().submitAll().revertRow().revertAll()
Void QSqlTableModel::revertAll() [slot]
恢复所有未决的改变。
Void QSqlTableModel::revertRow(int row) [virtual]
恢复
row
所有的改变
Int QSqlTableModel::rowCount(const QModelIndex&parent=QModelIndex())const [virtual]
重载
QAbstractItemModel::rowCount()
Int QAbstractItemModel::rowCount(cosnt QModelIndex &parent=QModelIndex())cosnt[pure virtual]
返回
parent
的行数。当
parent
是有效的,它意味着
rowCount
将返回
parent
的子项数。
注意:当执行一个基于模型的表,
rowCount()
应该返回
0
当
parent
是有效地。
也看
columnCount()
Bool QSqlTableModel::select() [virtual]
用表中的数据产生模型,使用
setTable(),
用特别的过滤器和排序情况,如果成功返回真,否则返回假。
也看
setTable(),setFilter(),selectStatement()
QString QSqlTableModel::selectStatement()const [virtual protected]
返回用来产生模型的
sql
查询语句。语句包括过滤器和
order by clause
也看
filter()
和
orderByClause()
Bool QSqlTableModel::setData(const QModelIndex &index,const QVariant&value,int role=Qt::EditRole)[virtual]
重载从
QAbstractItemModel::setData()
为
index
,
role
设置数据值。依赖编辑策略,该值可能被马上应用到数据库或者被缓存在模型中
如果值能够被设置,返回真,否则返回
false
也看
editStrategy(),data(),submitAll(),revertRow()
Void QSqlTableModel::setEditStrategy(EditStrategy strategy) [virtual]
设置策略为编辑数据库里的值
这将恢复任何未决的改变
也看
editStrategy(),revertAll()
Void QSqlTableModel::setFilter(const QString&filter) [virtual]
设置过滤器到
filter
过滤器是一个
sql
的
where
语句,没有关键词
where
(例如
name=’joke’
)
如果模型已经产生,那么模型会重新根据过滤器产生新的。否则,过滤器将被应用到下一个
select()
被调用。
也看
filter(),select(),selectStatement(),orderByClause()
Void QSqlTableModel::setPrimaryKey(const QSqlIndex&key) [protected]
受保护的方法,它允许子类来设置主键。
正常的,主索引被自动设置,当你调用
setTable()
也看
primaryKey()
和
QSqlDatabase::primaryIndex()
Void QSqlTableModel::setQuery(const QSqlQuery&query)[protected]
这个函数简单的调用
QSqlQueryModel::setQuery(query)
。正常情况下,你不应该在
QSqlTableModel
上调用它。应该用
setTable(),setSort(),setFilter()
等等。
也看
selectStatement()
Bool QSqlTableModel::setRecord(int row,const QSqlRecord&record)
在
row
设置值给
record
。如果值能够被设定返回真,否则返回假。
也看
record()
Void QSqlTableModel::setTable(const QString&tableName)[virtual]
设置表,表明为
tablename
。不从表中选择数据,但是获得它的域信息。
用表中的数据产生
model
,叫做
select
()
错误信息能被获得用
lastError()
也看
select(),setFilter(),lastError()
Void QSqlTableModel::sort(int column,Qt::SortOrder order) [virtual]
重载从
QAbstractItemModel::sort()
根据
order
按照列排列数据。这将立即选择数据,用
setSort()
来设置顺序而不用数据产生模型。
也看
setSort(),select(),orderByClause()
Bool QSqlTableModel::submit() [virtual]
重载
QAbstractItemModel::submit()
这个重载槽被项目代表调用,当用户停止编辑目前的行。
提交目前的编辑行,如果模型的策略是
OnRowChange
或
OnFieldChange
。对于
OnManualSubmit
什么也不做。
用
submitAll()
来提交所有未决的改变,对于
OnManualSubmit
Bool QSqlTableModel::submitAll() [slot]
提交所有的未决的改变,成功返回真。
成功模型将被重建。任何与之有关的视图将失去他们的选择。
注意:在
OnManualSubmit
,当
submitAll()
失败时,提交的改变不会从缓存里被删除。这允许重新提交而不丢失数据。
QString QSqlTableModel::tableName()const
返回目前被选择的表的名字
Bool QSqltableModel::updateRowInTable(int row,cosnt QSqlRecord&values)[virtual protected]
根据
values,
在目前活动的数据表中更新被给的行。如果成功返回
true
这是一个低层次的直接操作数据库的方法,不应该被直接调用。用
setData()
来更新值。这个模型将决定依赖他的编辑策略,当更改数据库时。
注意:只有那些有生成标志的
values
被更新。生成标志能被设置用
QSqlReord::setGenerated()
和测试用
QSqlRecord::isGenerated()