行业 网站 方案,Wordpress排版混乱,微信营销的成功案例,全国住房和城乡建设部网站【QSqlTableModel】数据库的高级API
描述
QSqlTableModel是用于从单个表读取和写入数据库记录的高级接口。它构建在较低级别的QSqlQuery之上#xff0c;可用于为视图类#xff08;如QTableView#xff09;提供数据。例如#xff1a; QSqlTableModel *model new QSqlTabl…【QSqlTableModel】数据库的高级API
描述
QSqlTableModel是用于从单个表读取和写入数据库记录的高级接口。它构建在较低级别的QSqlQuery之上可用于为视图类如QTableView提供数据。例如 QSqlTableModel *model new QSqlTableModel;model-setTable(employee);model-setEditStrategy(QSqlTableModel::OnManualSubmit);model-select();model-setHeaderData(0, Qt::Horizontal, tr(Name));model-setHeaderData(1, Qt::Horizontal, tr(Salary));QTableView *view new QTableView;view-setModel(model);view-hideColumn(0); // dont show the IDview-show();我们设置SQL表的名称和编辑策略然后设置显示在视图标题中的标签。编辑策略规定了用户在视图中所做的更改实际应用于数据库的时间。可能的值有OnFieldChange、OnRowChange和OnManualSubmit。 QSqlTableModel也可以用于以编程方式访问数据库而无需将其绑定到视图
QSqlTableModel model;model.setTable(employee);model.select();int salary model.record(4).value(salary).toInt();上面的代码片段从来自employee的查询SELECT* 的结果集中的记录4中提取了salary字段。 可以使用setFilter()设置筛选器也可以使用setSort()修改排序顺序。最后您必须调用select()来用数据填充模型。 QSqlTableModel不直接支持外键。如果要解析foreign key请使用QSqlRelationalTableModel和QSqlRelationalDelegate。 注foreign key就是表与表之间的某种约定的关系由于这种关系的存在能够让表与表之间的数据更加的完整关联性更强。
tablemodel示例说明了如何使用QSqlTableModel作为QTableView的数据源。 实例如下
成员类型的文档
enum QSqlTableModel::EditStrategy
枚举类型描述了当在数据库中编辑值时的选择策略。
目录Value描述QSqlTableModel::OnFieldChange0模型所有的改变都立即应用到数据库中QSqlTableModel::OnRowChange1当用户选择一个不同的行行的更改将被应用QSqlTableModel::OnManualSubmit2所有更改都将缓存在模型中直到调用submitAll()或revertAll()为止。
为了防止在数据库中只插入部分初始化的行对于新插入的行OnFieldChange的行为将类似于OnRowChange。
成员函数
信号signal
QSqlTableModel::QSqlTableModel(QObject *parent nullptr, QSqlDatabase db QSqlDatabase())
//创建一个空的QSqlTableModel并将父对象设置为父对象将数据库连接设置为db。如果数据库无效将使用默认的数据库连接。默认的编辑方法是OnRowChange.
void QSqlTableModel::beforeDelete(int row)
//在从当前活动的数据库表中删除行之前deleteRowFromTable()会发出他的信号。
void QSqlTableModel::beforeInsert(QSqlRecord record)
//在将新行插入当前活动的数据库表之前insertRowIntoTable()会发出此信号。将要插入的值存储在记录中并且可以在插入之前进行修改。
void QSqlTableModel::beforeUpdate(int row, QSqlRecord record)
//在使用记录中的值更新当前活动数据库表中的行之前updateRowInTable会发出此信号。
//请注意只有标记为已生成的值才会更新。生成的标志可以用QSqlRecord::setGenerated()设置也可以用QSqlRecord::isGenerated()检查。
void QSqlTableModel::primeInsert(int row, QSqlRecord record)
//当在当前活动数据库表的给定行中启动插入时insertRows()会发出此信号。记录参数可以写入因为它是一个引用例如用默认值填充一些字段并设置字段的生成标志。在处理此信号时不要试图通过其他方式如setData或setRecord编辑记录。
void QSqlTableModel::revert()重载虚函数
//当用户取消编辑当前行时项代理将调用此重新实现的槽。
//如果模型的策略设置为OnRowChange或OnFieldChange则还原更改。对OnManualSubmit策略没有任何作用。
//使用revertAll()恢复OnManualSubmit策略的所有挂起更改或使用revertRow()恢复特定行。
void QSqlTableModel::revertAll()
//恢复所有挂起的更改。
bool QSqlTableModel::select()
//使用指定的筛选器和排序条件使用通过setTable设置的表中的数据填充模型如果成功则返回true否则返回false。
bool QSqlTableModel::selectRow(int row)
//使用与主键值匹配的数据库表行中的值刷新模型中的行。如果没有主键则所有列值都必须匹配。如果没有找到匹配的行则模型将显示一个空行。如果成功则返回true否则返回false。
bool QSqlTableModel::submit()
//当用户停止编辑当前行时项代理将调用此重新实现的槽。
//如果模型的策略设置为OnRowChange或OnFieldChange则提交当前编辑的行。对OnManualSubmit策略没有任何作用。
//使用submitAll提交OnManualSubmit策略的所有挂起的更改。
//成功时返回true否则返回false。使用lastError查询详细的错误信息。
//不会自动重新填充模型。提交的行在成功时从数据库中刷新。
bool QSqlTableModel::submitAll()
//提交所有挂起的更改并在成功时返回true。错误时返回false可以使用lastError获取详细的错误信息。
//在OnManualSubmit中成功后将重新填充模型。任何呈现它的视图都将丢失其选择。
//注意在OnManualSubmit模式下submitAll失败时不会从缓存中清除已提交的更改。这允许在不丢失数据的情况下回滚和重新提交事务。
void QSqlTableModel::clear() void QSqlQueryModel::clear()
//清除模型并释放所有获取的资源
QVariant QSqlTableModel::data(const QModelIndex index, int role Qt::DisplayRole) const
//返回特定的值对于index和role如果错误或者index溢出返回无效的QVariant.
QSqlDatabase QSqlTableModel::database() const
//返回数据库的连接
bool QSqlTableModel::deleteRowFromTable(int row)
//从当前数据库表中删除给定的行
//这是一个直接在数据库上操作的低级方法不应直接调用。使用removeRow或removeRows删除值。模型将根据其编辑策略决定何时修改数据库。
//如果行被删掉返回true其他返回false
QSqlTableModel::EditStrategy QSqlTableModel::editStrategy() const
//返回当前的编辑策略
int QSqlTableModel::fieldIndex(const QString fieldName) const
//返回字段fileName的索引如果模型中不存在相应的字段则返回-1.
QString QSqlTableModel::filter() const
//返回当前设置的筛选器
Qt::ItemFlags QSqlTableModel::flags(const QModelIndex index) const
//返回指定索引的项标志QVariant QSqlTableModel::headerData(int section, Qt::Orientation orientation, int role Qt::DisplayRole) const
//返回标头中指定方向部分中给定角色的标头数据。
QModelIndex QSqlTableModel::indexInQuery(const QModelIndex item) const
//返回模型中给定项的数据库结果集中值的索引。
//如果没有插入、删除或移动任何列或行则返回值与item相同。
//如果item超出边界或item没有指向结果集中的值则返回无效的模型索引。
bool QSqlTableModel::insertRecord(int row, const QSqlRecord record)
//在位置行插入记录。如果row为负数则将该记录追加到末尾。
//内部调用insertRows()和setRecord()。如果记录可以插入则返回true否则返回false。bool QSqlTableModel::insertRowIntoTable(const QSqlRecord values)
//将值插入到当前活动的数据库表中。这是一个直接在数据库上操作的低级方法不应该直接调用。
//使用insertRow()和setdata)来插入值。模型将根据其编辑策略决定何时修改数据库。
//如果值可以插入则返回true否则返回false。可以使用lastError()检索错误信息。bool QSqlTableModel::insertRows(int row, int count, const QModelIndex parent QModelIndex())
//插入行
bool QSqlTableModel::isDirty(const QModelIndex index) const
//脏数据是数据表中存在错误、不一致或无效的数据行。会导致数据查询、分析和处理的不准确性和不稳定性。
//数据是否为脏数据
QString QSqlTableModel::orderByClause() const
//根据当前设置的排列顺序返回SQL ORDDER BY子句。
QSqlIndex QSqlTableModel::primaryKey() const
//返回当前表的主键如果没有设置主键则返回空QSQLIndex。
QSqlRecord QSqlTableModel::primaryValues(int row) const
//返回一条记录该记录包含主键中表示的字段并设置为第一行的值如果没有定义主键返回的记录将包含所有字段
QSqlRecord QSqlTableModel::record() const
//检索记录的字段名
QSqlRecord QSqlTableModel::record(int row)
//返回模型中第一行的记录如果row是有效行的索引则将使用该行的值填充记录
bool QSqlTableModel::removeColumns(int column, int count, const QModelIndex parent QModelIndex())
//从父模型中删除计数列从索引列开始。返回列是否已成功删除否则返回false。
bool QSqlTableModel::removeRows(int row, int count, const QModelIndex parent QModelIndex())
//移除行从row开始的Count行
void QSqlTableModel::revertRow(int row)
//还原指定行的所有更改。
int QSqlTableModel::rowCount(const QModelIndex parent QModelIndex()) const
//返回行数
bool QSqlTableModel::setData(const QModelIndex index, const QVariant value, int role Qt::EditRole)
void QSqlTableModel::setEditStrategy(QSqlTableModel::EditStrategy strategy)
//将编辑数据库中值的策略设置为策略。这将恢复任何挂起的更改。void QSqlTableModel::setFilter(const QString filter)
//将当前过滤器设置为过滤。
//筛选器是一个不带关键字WHERE的SQL WHERE子句例如nameJosephine。
//如果模型已经用数据库中的数据填充则模型会使用新的过滤器重新选择它。否则下次调用select时将应用该筛选器。
void QSqlTableModel::setPrimaryKey(const QSqlIndex key)
//受保护的方法允许子类将主键设置为键。
//通常无论何时调用setTable都会自动设置主索引。
void QSqlTableModel::setQuery(const QSqlQuery query)bool QSqlTableModel::setRecord(int row, const QSqlRecord values)
//将值应用于模型中的行。源字段和目标字段是按字段名称映射的而不是按记录中的位置映射的。
//请注意值中生成的标志将被保留以确定在将更改提交到数据库时是否使用相应的字段。默认情况下对于QSqlRecord中的所有字段它都设置为true。必须对值中的任何值使用setGeneratedfalse将标志设置为false才能将更改保存回数据库。
//对于编辑策略OnFieldChange和OnRowChange只有当没有其他行具有缓存的更改时行才能接收到更改。更改将立即提交。提交的更改在失败时不会恢复。
//如果可以设置所有值则返回true否则返回false。void QSqlTableModel::setSort(int column, Qt::SortOrder order)
//设置要排序的列的排序顺序。这不会影响当前数据要使用新的排序顺序刷新数据请调用select。
void QSqlTableModel::setTable(const QString tableName)
//将模型操作的数据库表设置为tableName。不从表中选择数据而是获取其字段信息。
//要用表的数据填充模型请调用select。
//可以使用lastError检索错误信息。
void QSqlTableModel::sort(int column, Qt::SortOrder order)
//按照排序顺序按列对数据进行排序。这将立即选择数据使用setSort设置排序顺序而不使用数据填充模型。QString QSqlTableModel::tableName()
//返回当前所选表的名称。
bool QSqlTableModel::updateRowInTable(int row, const QSqlRecord values)
//使用指定的值更新当前活动数据库表中的给定行。如果成功则返回true否则返回false。
//这是一个直接在数据库上操作的低级方法不应直接调用。使用setData更新值。模型将根据其编辑策略决定何时修改数据库。
//请注意只有设置了生成标志的值才会更新。
//生成的标志可以用QSqlRecordsetGenerated设置也可以用QSqlRecordisGenerated测试。