Qt 之 QSqlQueryModel Class

32 篇文章 1 订阅
31 篇文章 2 订阅

详细描述

QSqlQueryModel 类为SQL结果集提供了一个只读的数据模型。
QSqlQueryModel 提供用于执行SQL语句和遍历结果集的高级接口。它是建立在低层的 QSqlQuery之上并且可以用以提供数据给例如 QTableView之类的视图类。
例如:
    QSqlQueryModel *model = new QSqlQueryModel;
    model->setQuery("SELECT name, salary FROM employee");
    model->setHeaderData(0, Qt::Horizontal, tr("Name"));
    model->setHeaderData(1, Qt::Horizontal, tr("Salary"));

    QTableView *view = new QTableView;
    view->setModel(model);
    view->show();
我们设置了模型的查询,然后设置在视图头中显示的标签。

QSqlQueryModel 还可以通过编程方式访问数据库,而无需将其绑定到视图。
例如:
    QSqlQueryModel model;
    model.setQuery("SELECT * FROM employee");
    int salary = model.record(4).value("salary").toInt();
上面的代码片段从查询(SELECT * from employee)的结果集中的记录4(第4行)提取了salary(薪水)字段。假设salary(工资)是第二列,则以上代码片段可修改为:
    QSqlQueryModel model;
    model.setQuery("SELECT * FROM employee");
    int salary = model.data(model.index(4, 2)).toInt();
该模型默认为只读的。为了使它能够读写,你必须子类化该类并重新实现setData()和flags().另一个选择是使用 QSqlTableModel类,它提供了基于单个数据库表的读写模型。

Query Model Example(可在Qt帮助文档中搜索该demo,后续文章将会讲解这个例子)示例演示了如何使用QSqlQueryModel来显示查询的结果。它还展示了如何对QSqlQueryModel进行子类化,以便在向用户显示数据之前对数据内容进行定制,以及如何创建基于QSqlQueryModel的读写模型。

如果数据库没有返回查询选择的行数,该模型将增量地获取行。更多信息,参阅 fetchMore() API的描述。

相关API

QSqlQueryModel::QSqlQueryModel(QObject * parent = 0)
使用给定的parent创建一个空的QSqlQueryModel 对象。

QSqlQueryModel::~QSqlQueryModel() [virtual]
销毁对象并释放任何已分配的资源。

bool QSqlQueryModel::canFetchMore(const QModelIndex & parent = QModelIndex()) const [virtual]
重新实现 QAbstractItemModel::canFetchMore()。
如果可以从数据库获取更多行返回true。这只会影响不报告查询大小的数据库。参数parent应该始终是一个无效的QModelIndex。

void QSqlQueryModel::clear() [virtual]
清除模型并释放任何已经获得的资源。

int QSqlQueryModel::columnCount(const QModelIndex & index = QModelIndex()) const [virtual]
重新实现QAbstractItemModel::columnCount()获取模型的列数。

QVariant QSqlQueryModel::data(const QModelIndex & item, int role = Qt::DisplayRole) const [virtual]
重新实现 QAbstractItemModel::data()。
返回制定item(项)和role(角色)的值。
如果item超出范围或者如果遇到错误,返回一个无效的 QVariant。

void QSqlQueryModel::fetchMore(const QModelIndex & parent = QModelIndex()) [virtual]
重新实现 QAbstractItemModel::fetchMore()。
从数据库中获取更多的行。这只影响不报告查询大小的数据库。

为了强制获得整个结果集,你可以使用以下代码:
while (myModel->canFetchMore())
    myModel->fetchMore();
参数parent应该始终是无效的 QModelIndex。

QVariant QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const [virtual]
重新实现QAbstractItemModel::headerData()。
将给定角色的头数据返回到标题中指定位置的指定方向。

QModelIndex QSqlQueryModel::indexInQuery(const QModelIndex & item) const [virtual protected]
返回模型中给定项(item)的数据库结果集中的值得索引。
如果没有插入、删除或移动的行或列,返回值和参数item相等。
如果item超出边界或者项目没有指向结果集中的值则返回一个无效的模型索引。

bool QSqlQueryModel::insertColumns(int column, int count, const QModelIndex & parent = QModelIndex()) [virtual]
重新实现QAbstractItemModel::insertColumns()。
在模型的位置column处插入count列。parent参数始终是无效的QModelIndex,因为模型不支持父子关系。
如果列在边界内则返回true,否则返回false。
默认情况下,插入的列是空的。要用数据填充它们,重新实现data()接口并分别处理任何插入的列:
QVariant MyModel::data(const QModelIndex &item, int role) const
{
    if (item.column() == m_specialColumnNo) {
        // handle column separately
    }
    return QSqlQueryModel::data(item, role);
}

QSqlError QSqlQueryModel::lastError() const
返回数据库中发生的最后一条错误信息。

QSqlQuery QSqlQueryModel::query() const
返回与此模型关联的 QSqlQuery。

void QSqlQueryModel::queryChange() [virtual protected]
这个虚函数在查询query更改时被调用。默认实现什么都没做。
query()返回新的查询对象。

QSqlRecord QSqlQueryModel::record(int row) const
返回包含当前查询字段信息的记录。如果行是一个有效行的索引,则记录将从该行开始填充值。如果模型未初始化,将返回空记录。

QSqlRecord QSqlQueryModel::record() const
这是一个重载函数。
返回包含当前查询字段信息的一条空记录。如果模型未初始化,将会返回一条空记录。

bool QSqlQueryModel::removeColumns(int column, int count, const QModelIndex & parent = QModelIndex()) [virtual]
重新实现QAbstractItemModel::removeColumns()。
从模型的位置column处开始移除count列。参数parent始终是无效的 QModelIndex,因为模型不支持父子关系。
removeColumns()(删除列)有效地隐藏了它们。它不影响底层的 QSqlQuery。
如果指定列被成功删除返回true;否则返回false。

int QSqlQueryModel::rowCount(const QModelIndex & parent = QModelIndex()) const [virtual]
重新实现 QAbstractItemModel::rowCount()。
如果数据库支持返回查询的大小,则返回当前查询的行数。否则,返回当前在客户机上缓存的行数。
参数parent始终是一个无效的 QModelIndex。

bool QSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant & value, int role = Qt::EditRole) [virtual]
重新实现QAbstractItemModel::setHeaderData()。
设置指定角色的水平表头的标题为value。如果模型用于在视图中(例如: QTableView)显示数据,这将很有用。
如果参数orientation(方向)是 Qt::Horizontal(水平的)并且参数section(部分)指向一个有效地部分则返回true;否则返回false。
注意该函数不能用于修改数据库里面的值,因为该模型是只读的。

void QSqlQueryModel::setLastError(const QSqlError & error) [protected]
受保护的函数允许派生类设置数据库中发生的最后一条错误的值为参数error。

void QSqlQueryModel::setQuery(const QSqlQuery & query)
重新设置模型并将数据提供者设置为给定的查询query。注意查询query必须是活跃的(active)并且一定不能是isForwardOnly()。
如果查询出现错误可以使用lastError()检索详细的信息。
注意:调用setQuery()将删除任何插入的列。

void QSqlQueryModel::setQuery(const QString & query, const QSqlDatabase & db = QSqlDatabase())
这是一个重载函数。
执行给定数据库连接db的查询query。如果没有指定数据库连接(或者使用的是一个无效的数据库(连接)),则使用默认连接。
如果查询出现错误可以使用lastError()获取详细信息。
例子:
QSqlQueryModel model;
model.setQuery("select * from MyTable");
if (model.lastError().isValid())
    qDebug() << model.lastError();

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在 QSQLQueryModel 中添加一个 checkbox,可以通过在 QSQLQueryModel数据中添加一个布尔值字段来实现。然后,您可以使用 QTableView 和 QStandardItemModel 一起使用,以显示一个带有 checkbox 的视图。以下是一个示例代码: ```python from PyQt5.QtCore import Qt, QAbstractTableModel class MyModel(QAbstractTableModel): def __init__(self, data): QAbstractTableModel.__init__(self) self._data = data def rowCount(self, parent=None): return len(self._data) def columnCount(self, parent=None): return len(self._data[0]) def data(self, index, role=Qt.DisplayRole): if role == Qt.DisplayRole: return str(self._data[index.row()][index.column()]) elif role == Qt.CheckStateRole: if index.column() == 0: return Qt.Checked if self._data[index.row()][0] else Qt.Unchecked def setData(self, index, value, role): if role == Qt.CheckStateRole and index.column() == 0: self._data[index.row()][0] = value self.dataChanged.emit(index, index) return True return False def headerData(self, section, orientation, role=Qt.DisplayRole): if role != Qt.DisplayRole: return None if orientation == Qt.Horizontal: return "Column %d" % section else: return "Row %d" % section ``` 该模型数据作为一个包含布尔值的列表进行存储。然后,在 CheckStateRole 中,我们检查该行中的第一列是否应该被检查。在 setData 中,我们更新数据并发出数据更改信号。最后,我们还覆盖了 headerData 方法以提供表头的标签。 接下来,我们可以将模型QTableView 一起使用,以显示具有 checkbox 的视图,如下所示: ```python from PyQt5.QtWidgets import QApplication, QTableView, QVBoxLayout, QWidget app = QApplication([]) table = QTableView() data = [[True, "Data 1"], [False, "Data 2"], [True, "Data 3"], [False, "Data 4"]] model = MyModel(data) table.setModel(model) layout = QVBoxLayout() layout.addWidget(table) window = QWidget() window.setLayout(layout) window.show() app.exec_() ``` 这将创建一个窗口,其中包含一个具有 checkbox 的表格视图。您可以通过单击 checkbox 来切换其状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值