QSqlTableModel Class参考(来自QtSql模块)
该类为单个数据表提供一种可编辑的数据模型。
#include
该类不是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()