在QML中使用SQL Model

46 篇文章 20 订阅

在C++中,Qt常用的的Sql数据库有QSqlTableModel,QSqlQueryModel等等,用于数据库处理很方便,那么如果需要在QML中显示SQL数据库数据,要怎么处理呢?C++中的SQL处理的Model模块不支持直接给QML使用,需要将其继承后添加数据绑定的部分功能后,再交由QML进行展示。

头文件:qmlsqlquerymodel.h

#ifndef QMLSQLQUERYMODEL_H
#define QMLSQLQUERYMODEL_H

#include <QSqlQueryModel>
#include <QSqlRecord>
#include <QObject>
#include <QDebug>
#include <QQmlPropertyMap>

class QmlSqlQueryModel : public QSqlQueryModel
{
    Q_OBJECT
public:
    QmlSqlQueryModel(QObject *parent = nullptr);
    QVariant data(const QModelIndex &index, int role) const;
    Q_INVOKABLE QVariantList getHeaderList();//获得表头列名
    Q_INVOKABLE bool isSqlModel();//标识符,用于自定义的TableView控件检测

protected:
    QHash<int,QByteArray>roleNames() const;//将列名称暴露给QML

};
#endif 

1、设置roleNames(),将各数据列的名称传递给QML,数据展示中的Delegate按照列名称绑定数据

QHash<int, QByteArray> QmlSqlQueryModel::roleNames() const
{
    QHash<int, QByteArray> roles;
    for (int i = 0; i < this->record().count(); i ++) {
        roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
    }
    return roles;
}

2、将SqlModel中的数据值传递给QML

QVariant QmlSqlQueryModel::data(const QModelIndex &index, int role) const
{
    QVariant value;

    if (index.isValid()) {
        if (role < Qt::UserRole) {
            value = QSqlQueryModel::data(index, role);
        } else {
            int columnIdx = role - Qt::UserRole - 1;
            QModelIndex modelIndex = this->index(index.row(), columnIdx);
            value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
        }
    }
    return value;
}

完成以上两步,在QML中把各列按照列名绑定到对应Delete上即可显示数据,如果觉得自己写数据绑定比较麻烦,且不灵活,当数据库列表结构发生变化时需要修改代码才行,那么可以使用我自己制作的TableView控件,当使用该TableView控件加载model时,控件自动绑定数据列,因此需要添加以下两个功能:

QVariantList QmlSqlQueryModel::getHeaderList()
{
    QVariantList list;
    for(int i=0;i<this->record().count();i++){
        QString key = this->record().fieldName(i);
        list.append(key);
    }
    return list;
}
bool QmlSqlQueryModel::isSqlModel()
{
    return true;
}

至此,配合着TableView使用,基本上达到了C++中使用QTableView加载SQL Model的效果,代码文件我上传了,直接下载添加到工程即可使用,QmlSqulQueryModel和TableView控件的下载地址:

TableView控件介绍:QML 自定义TableView控件(在ListView基础上实现类似QTableView功能)

QmlSqlQueryModel下载地址:QmlSqlQueryModelicon-default.png?t=LA92https://github.com/zjgo007/QmlDemo/tree/master/QmlSqlQueryModel

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵喵叫的猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值