Qt工作笔记-以配置文件的方式动态获取Mysql数据库中的数据
生活随笔
收集整理的這篇文章主要介紹了
Qt工作笔记-以配置文件的方式动态获取Mysql数据库中的数据
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
場景
修改配置文件,獲取表頭,再遍歷數(shù)據(jù)庫!
實時監(jiān)控文件,一旦修改馬上重新遍歷數(shù)據(jù)庫!
程序運行截圖如下:
靜態(tài)運行圖如下:
?
技術(shù)原理及源碼
使用QFileSystemWatcher對文件進(jìn)行監(jiān)控
使用QSqlQuery對數(shù)據(jù)庫進(jìn)行遍歷
文件結(jié)構(gòu)如下:
源碼如下:
tableviewmanager.h
#ifndef TABLEVIEWMANAGER_H #define TABLEVIEWMANAGER_H#include <QObject> #include <QVector> #include <QString>QT_BEGIN_NAMESPACE class QFileSystemWatcher; QT_END_NAMESPACEclass TableViewManager: public QObject {Q_OBJECTpublic: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_Hwidget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase>QT_BEGIN_NAMESPACE class QStandardItemModel; QT_END_NAMESPACEclass TableViewManager;namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic: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_Hmain.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("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);//updateContentint 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);} }?
總結(jié)
以上是生活随笔為你收集整理的Qt工作笔记-以配置文件的方式动态获取Mysql数据库中的数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-QTableWidget设
- 下一篇: Python工作笔记-dictionar