QSqlQueryModel的使用方法小结(与QtableView相交互)

Qt 5.9.9
vs 2015
C++
Qt
sqlite

QSqlQueryModel的使用方法

本文简要介绍如何将sqlite数据库中的表查询出来并显示在QTableview中

首先,连接数据库(方法有很多种,不管你用什么方法连上就行)

话不多说,直接上代码(我的连接方法):
.h文件

#ifndef MDATABASEMANAGER_H
#define MDATABASEMANAGER_H

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QString>

class MDataBaseManager
{
public:
    MDataBaseManager();

    ~MDataBaseManager();
    bool BulidConnect(const QString type);
    bool ExeSql(QString sqlStr, QString infoStr = QString());
    bool ExeSql(QString sqlStr, QSqlQuery &sqlQuery, QString &errorStr);

public:
    QSqlDatabase m_db;
};

#endif  // MDATABASEMANAGER_H

.cpp文件

#include "MDataBaseManager.h"
#include <QDebug>
#include <QSqlError>

MDataBaseManager::MDataBaseManager() {}

MDataBaseManager::~MDataBaseManager()
{
    if (m_db.isOpen()) {
        m_db.close();
    }
}

bool MDataBaseManager::BulidConnect(const QString type)
{
    if (!QSqlDatabase::contains(type)) {
        m_db = QSqlDatabase::addDatabase("QSQLITE");
        m_db.setDatabaseName("LxTsspLog.db");  //里面填写数据库路径,我这默认放到build目录下
        if (!m_db.isOpen()) {
            if (m_db.open()) {
                qDebug() << QString("%1 open db success").arg(type);
                return true;
            }
            else {
                qDebug() << QString("%1 oepn db fail").arg(type);
                return false;
            }
        }
        else {
            return true;
        }
    }

    return false;
}

bool MDataBaseManager::ExeSql(QString sqlStr, QString infoStr)
{
    QSqlQuery sqlQuery(m_db);
    if (!sqlQuery.exec(sqlStr)) {
        qDebug() << QString("%1: fail/nDBError:%2").arg(infoStr).arg(sqlQuery.lastError().text());
        return false;
    }
    return true;
}

bool MDataBaseManager::ExeSql(QString sqlStr, QSqlQuery &sqlQuery, QString &errorStr)
{
    sqlQuery = QSqlQuery(m_db);
    if (!sqlQuery.exec(sqlStr)) {
        errorStr = sqlQuery.lastError().text();
        qDebug() << errorStr;
        return false;
    }
    return true;
}

连接成功后,就可以根据你的表结构,自动跟你设到TableView中了

QSqlQueryModel *model = new QSqlQueryModel(this);
    model->setQuery("select * from LogTable20210408");
    model->setHeaderData(0, Qt::Vertical, tr("0"));
    model->setHeaderData(1, Qt::Vertical, tr("1"));
    model->setHeaderData(2, Qt::Vertical, tr("2"));
    model->setHeaderData(3, Qt::Vertical, tr("3"));
    model->setHeaderData(4, Qt::Vertical, tr("4"));
    model->setHeaderData(5, Qt::Vertical, tr("5"));
    model->setHeaderData(6, Qt::Vertical, tr("6"));
    model->setHeaderData(7, Qt::Vertical, tr("7"));
    model->setHeaderData(8, Qt::Vertical, tr("8"));

    ui->tableView->setModel(model);

图片

原本数据库表结构:
在这里插入图片描述
点击按钮,加载数据库表里面的内容如下:

有人会有疑问?如果我不想某一个字段显示出来的是1,2,3这样的数字咋办,例如我这WarningLevel,警告等级,1代表通知,2代表警告

此时就需要重写两个函数了! 上代码!

QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
Qt::ItemFlags flags(const QModelIndex &index) const;

我这就新建了一个名为: Table 的类,继承于 QObject 和 QSqlQueryModel

Table.h

#ifndef TABLE_H
#define TABLE_H

#include <QObject>
#include <QSqlQueryModel>
#include <QTableView>

class Table : public QSqlQueryModel
{
    Q_OBJECT
public:
    explicit Table(QObject *parent = nullptr);

    ///重写
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;
    void initTable();

private:
    QTableView *tableview = nullptr;
signals:
};

#endif  // TABLE_H

Table.cpp

#include "Table.h"
#include <QDateTime>
#include <QDebug>
#include <QSqlQuery>

///参考博客 https://blog.csdn.net/kangshuaibing/article/details/85160683
/// 调用的时候:
/// 只需将QSqlQueryModel *model = new QSqlQueryModel(this);写成MySqlQuery *model=new
/// MySqlQuery(this);即可

Table::Table(QObject *parent) : QSqlQueryModel(parent) {}

///重写
QVariant Table::data(const QModelIndex &index, int role) const
{
    QVariant value = QSqlQueryModel::data(index, role);

    if (role == Qt::DisplayRole && index.column() == 0) {
        auto utc_time = value.toInt();
        value = QDateTime::currentDateTime().fromTime_t(utc_time).toString("yyyy-MM-dd hh:mm:ss");
        return value;
    }
    if (role == Qt::DisplayRole && index.column() == 5) {
        value = ((value.toInt() == 1) ? "通知" : "警告");
        // qDebug()<<value.toInt();
        return value;
    }
    if (role == Qt::DisplayRole && index.column() == 6) {
        value = ((value.toInt() == 1) ? "用户操作" : "设备操作");
        // qDebug()<<value.toInt();
        return value;
    }
    return value;
}

Qt::ItemFlags Table::flags(const QModelIndex &index) const
{

    Qt::ItemFlags flags = QSqlQueryModel::flags(index);
    if (index.column() != 6 && index.column() != 7)  //可编辑状态
        flags |= Qt::ItemIsEditable;
    return flags;
}

void Table::initTable()
{
    Table *model = new Table(this);
    model->setQuery("select * from LogTable20210408");
    model->setHeaderData(0, Qt::Vertical, tr("表头1")); //表头名字可以自己随便取,我这随便取的
    model->setHeaderData(1, Qt::Vertical, tr("表头2"));
    model->setHeaderData(2, Qt::Vertical, tr("2"));
    model->setHeaderData(3, Qt::Vertical, tr("3"));
    model->setHeaderData(4, Qt::Vertical, tr("4"));
    model->setHeaderData(5, Qt::Vertical, tr("5"));
    model->setHeaderData(6, Qt::Vertical, tr("6"));
    model->setHeaderData(7, Qt::Vertical, tr("7"));
    model->setHeaderData(8, Qt::Vertical, tr("8"));
    tableview = new QTableView();
    tableview->resize(1014, 570);
    tableview->setModel(model);
    tableview->show();
}

调用的时候:

只需将QSqlQueryModel *model = new QSqlQueryModel(this);写成MySqlQuery *model=new MySqlQuery(this);即可

接下来再在主界面的按钮点击事件下 show 一下 就行了

下面上对比图:

在这里插入图片描述
小伙伴们看出开差异了吗?

参考博客
[1]: https://blog.csdn.net/kangshuaibing/article/details/85160683

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值