Qt工作笔记-以配置文件的方式动态获取Mysql数据库中的数据
场景
修改配置文件,获取表头,再遍历数据库!
实时监控文件,一旦修改马上重新遍历数据库!
程序运行截图如下:
静态运行图如下:
技术原理及源码
使用QFileSystemWatcher对文件进行监控
使用QSqlQuery对数据库进行遍历
文件结构如下:
源码如下:
tableviewmanager.h
#ifndef TABLEVIEWMANAGER_H
#define TABLEVIEWMANAGER_H
#include <QObject>
#include <QVector>
#include <QString>
QT_BEGIN_NAMESPACE
class QFileSystemWatcher;
QT_END_NAMESPACE
class TableViewManager: public QObject
{
Q_OBJECT
public:
static TableViewManager *createInstance();
~TableViewManager();
void analysisFile(const QString fileName);
QVector<QString> &getTableHead();
signals:
void changeTableData();
protected slots:
void onFileChanged(const QString &path);
protected:
TableViewManager();
void loadFile(const QString &path);
private:
static int m_flag;
QFileSystemWatcher *m_fileWatcher;
QVector<QString> m_TableHead;
};
#endif // TABLEVIEWMANAGER_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSqlDatabase>
QT_BEGIN_NAMESPACE
class QStandardItemModel;
QT_END_NAMESPACE
class TableViewManager;
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
public slots:
void tableDataChanged();
protected:
void addModelItem(const int row, const QStringList list);
private:
Ui::Widget *ui;
TableViewManager *m_tableViewManager;
QStandardItemModel *m_model;
QSqlDatabase m_db;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
tableviewmanager.cpp
#include "tableviewmanager.h"
#include <QFileSystemWatcher>
#include <QFile>
#include <QDebug>
int TableViewManager::m_flag = 0;
TableViewManager *TableViewManager::createInstance()
{
if(0 == m_flag){
m_flag = 1;
return new TableViewManager;
}
return Q_NULLPTR;
}
TableViewManager::~TableViewManager()
{
m_flag = 0;
}
void TableViewManager::analysisFile(const QString fileName)
{
m_fileWatcher->addPath(fileName);
loadFile(fileName);
}
QVector<QString> &TableViewManager::getTableHead()
{
return m_TableHead;
}
void TableViewManager::onFileChanged(const QString &path)
{
loadFile(path);
}
TableViewManager::TableViewManager()
{
m_fileWatcher = new QFileSystemWatcher;
connect(m_fileWatcher, &QFileSystemWatcher::fileChanged, this, &TableViewManager::onFileChanged);
}
void TableViewManager::loadFile(const QString &path)
{
if(path.isEmpty() || !QFile::exists(path))
return;
QFile file(path);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
qDebug() << "open filed!";
return;
}
QStringList list = QString(file.readAll()).split("\n");
for(int i = 0; i < list.size(); i++){
if(list[i].isEmpty()){
list.removeAt(i);
}
}
m_TableHead.clear();
for(int i = 0; i < list.size(); i++)
m_TableHead << list[i];
file.close();
emit changeTableData();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "tableviewmanager.h"
#include <QDebug>
#include <QSqlQuery>
#include <QStandardItem>
#include <QStandardItemModel>
#include <QSqlError>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("**** IT1995");
m_tableViewManager = TableViewManager::createInstance();
m_model = new QStandardItemModel;
m_tableViewManager->analysisFile("E:\\Qt2018\\TableViewManager\\data.txt");
m_db = QSqlDatabase::addDatabase("QMYSQL");
m_db.setHostName("127.0.0.1");
m_db.setDatabaseName("tabletest");
m_db.setUserName("root");
m_db.setPassword("root");
if(m_db.open()){
qDebug() << "succssful";
m_db.exec("SET NAMES 'gbk'");
}
else{
qDebug() << m_db.lastError().text();
return;
}
connect(m_tableViewManager, SIGNAL(changeTableData()), this, SLOT(tableDataChanged()));
tableDataChanged();
}
Widget::~Widget()
{
delete m_model;
delete m_tableViewManager;
delete ui;
}
void Widget::tableDataChanged()
{
QStringList headList;
QString sqlStart = "select ";
QString middata;
QString sqlEnd = " from people";
m_model->clear();
for(int i = 0; i < m_tableViewManager->getTableHead().size(); i++){
headList << m_tableViewManager->getTableHead()[i];
middata += m_tableViewManager->getTableHead()[i] + ",";
}
middata = middata.left(middata.size() - 1);
qDebug() << sqlStart + middata + sqlEnd;
m_model->setHorizontalHeaderLabels(headList);
//updateContent
int rowCount = 0;
QSqlQuery query(sqlStart + middata + sqlEnd);
while (query.next()) {
QStringList data;
for(int i = 0; i < headList.size(); i++){
data << query.value(headList[i]).toString();
}
addModelItem(rowCount, data);
rowCount++;
}
ui->tableView->setModel(m_model);
}
void Widget::addModelItem(const int row, const QStringList list)
{
if(m_tableViewManager->getTableHead().size() != list.size()){
return;
}
for(int i = 0; i < list.size(); i++){
QStandardItem *item = new QStandardItem(list[i]);
m_model->setItem(row, i, item);
}
}