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