Qt工作笔记-以配置文件的方式动态获取Mysql数据库中的数据

场景

修改配置文件,获取表头,再遍历数据库!

实时监控文件,一旦修改马上重新遍历数据库!

程序运行截图如下:

静态运行图如下:

Qt工作笔记-以配置文件的方式动态获取Mysql数据库中的数据_第1张图片

 

技术原理及源码

使用QFileSystemWatcher对文件进行监控

使用QSqlQuery对数据库进行遍历

文件结构如下:

Qt工作笔记-以配置文件的方式动态获取Mysql数据库中的数据_第2张图片

源码如下:

tableviewmanager.h

#ifndef TABLEVIEWMANAGER_H
#define TABLEVIEWMANAGER_H

#include 
#include 
#include 

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 &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 m_TableHead;
};

#endif // TABLEVIEWMANAGER_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 

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 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

tableviewmanager.cpp

#include "tableviewmanager.h"
#include 
#include 
#include 

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 &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 
#include 
#include 
#include 
#include 

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setWindowTitle("CSDN 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);
    }
}

 

你可能感兴趣的:(C/C++,Qt,工作笔记)