Qt物聯(lián)網(wǎng)管理平臺之實(shí)現(xiàn)數(shù)據(jù)查詢導(dǎo)出打印
一、前言
本系統(tǒng)存儲的三大類記錄,運(yùn)行日志、報(bào)警日志、用戶日志,這些不同類似的記錄,都需要提供查詢功能,可以按照記錄的時(shí)間范圍等條件查詢,查詢的記錄需要做分頁顯示,為了分頁顯示還特意花了很多時(shí)間專門封裝了一個(gè)通用分頁控件,分兩部分,一部分專門的分頁UI展示,顯示頁碼,可以單擊頁碼直接跳轉(zhuǎn)到對應(yīng)頁,也可以直接數(shù)碼頁碼跳轉(zhuǎn),還可以上一頁、下一頁、第一頁、末一頁按鈕跳轉(zhuǎn)。一部分是分頁功能,專門按照不同的數(shù)據(jù)庫組合sql分頁語句查詢。關(guān)于分頁語句,sqlite和mysql用的是limit,sqlserver用的是top,postgresql用的是limit+offset,oracle比較復(fù)雜需要用rownum字段組合。
查詢出來的數(shù)據(jù)除了展示外,還需要導(dǎo)出到xls或者pdf文件,以及打印,可以復(fù)用之前的查詢所用的sql語句,查詢出來的數(shù)據(jù)集合發(fā)給導(dǎo)出和打印類,直接按照一行行的表格形式,導(dǎo)出到xls文件可以用通用的xml形式的數(shù)據(jù),這樣可以做到不依賴任何office組件。而導(dǎo)出到pdf其實(shí)就是和打印一起的,俗稱打印到pdf文件,里面的內(nèi)容也是一樣的,都是采用html格式的數(shù)據(jù),比如html中的table,也基本上是table格式就行。
二、功能特點(diǎn)
2.1 軟件模塊
- 設(shè)備監(jiān)控模塊,包括數(shù)據(jù)監(jiān)控(表格形式展示)、設(shè)備面板(面板形式展示)、地圖監(jiān)控(地圖形式展示)、曲線監(jiān)控(曲線形式展示)。
- 數(shù)據(jù)查詢模塊,包括報(bào)警記錄、運(yùn)行記錄、操作記錄。
- 系統(tǒng)設(shè)置模塊,包括基本設(shè)置、端口管理、控制器管理、探測器管理、報(bào)警聯(lián)動、類型設(shè)置等。
- 其他設(shè)置模塊,包括用戶管理、地圖管理、位置調(diào)整、組態(tài)設(shè)計(jì)、設(shè)備調(diào)試等。
2.2 基礎(chǔ)功能
- 設(shè)備數(shù)據(jù)采集,支持串口、網(wǎng)絡(luò),串口可設(shè)置串口號、波特率,網(wǎng)絡(luò)可設(shè)置IP地址、通訊端口。
- 每個(gè)端口支持采集周期時(shí)間,默認(rèn)1秒鐘一個(gè)設(shè)備。
- 支持設(shè)置通訊超時(shí)次數(shù),默認(rèn)3次。
- 支持最大重連時(shí)間,用于重新讀取離線的設(shè)備。
- 控制器信息,能夠添加控制器名稱,選擇控制器地址、控制器型號,設(shè)置該控制器下面的探測器數(shù)量。
- 探測器信息,能夠添加位號、探測器型號、氣體種類、氣體符號、高報(bào)值、低報(bào)值、緩沖值、清零值、是否啟用、報(bào)警聲音、背景地圖、存儲周期、數(shù)值換算小數(shù)點(diǎn)位數(shù)、報(bào)警延時(shí)時(shí)間、報(bào)警的類型(HH,LL,HL)等。
- 類型管理可配置控制器型號、探測器型號、氣體種類、氣體符號等。
- 地圖支持導(dǎo)入和刪除,所有的探測器在地圖上的位置可自由拖動保存。
- 端口信息、控制器信息、探測器信息、類型信息、用戶信息等,都支持導(dǎo)入、導(dǎo)出、導(dǎo)出到excel、打印。
- 運(yùn)行記錄、報(bào)警記錄、操作記錄,都支持多條件組合查詢,比如時(shí)間段、控制器、探測器等,所有記錄支持導(dǎo)出到excel/pdf和打印。
- 運(yùn)行記錄、報(bào)警記錄、操作記錄都可刪除指定時(shí)間范圍內(nèi)的數(shù)據(jù)。
- 系統(tǒng)設(shè)置可選擇對應(yīng)表最大保存記錄數(shù),自動清理早期數(shù)據(jù),留出足夠的空間存儲重要的數(shù)據(jù)。
- 報(bào)警短信轉(zhuǎn)發(fā),支持多個(gè)接收手機(jī)號碼,可設(shè)定發(fā)送間隔,比如即時(shí)發(fā)送或者6個(gè)小時(shí)發(fā)送一次所有的報(bào)警信息,短信內(nèi)容過長,自動拆分多條短信。
- 報(bào)警郵件轉(zhuǎn)發(fā),支持多個(gè)接收郵箱,可設(shè)定發(fā)送間隔,比如即時(shí)發(fā)送或者6個(gè)小時(shí)發(fā)送一次所有的報(bào)警信息,支持附件發(fā)送。
- 設(shè)置軟件的中文標(biāo)題、英文標(biāo)題、logo路徑、版權(quán)所有等。
- 開關(guān)設(shè)置開機(jī)運(yùn)行、報(bào)警聲音、自動登錄、記住密碼等。
- 報(bào)警聲音可設(shè)置播放次數(shù),界面風(fēng)格樣式提供18套皮膚文件選擇。
- 用戶管理,包括用戶權(quán)限配置,不同用戶可以有不同模塊的權(quán)限。
- 用戶登錄和用戶退出,可以記住密碼和自動登錄,超過三次報(bào)錯(cuò)提示并關(guān)閉程序。
- 四種監(jiān)控模式,設(shè)備面板監(jiān)控、地圖監(jiān)控、表格數(shù)據(jù)監(jiān)控、曲線數(shù)據(jù)監(jiān)控,可自由切換,四種模式下都實(shí)時(shí)展示采集到的數(shù)據(jù),報(bào)警閃爍等。
- 報(bào)警繼電器聯(lián)動,一個(gè)位號可以跨串口聯(lián)動多個(gè)模塊和繼電器號,支持多對多。
2.3 特色功能
- 通信協(xié)議支持modbus_com、modbus_tcp_rtu,后期拓展mqtt等協(xié)議。
- 數(shù)據(jù)源除了真實(shí)的硬件設(shè)備采集,還可選數(shù)據(jù)庫采集,這樣用戶可以安排其他程序員比如java程序員將前端采集好的數(shù)據(jù)放到數(shù)據(jù)庫,本系統(tǒng)直接從數(shù)據(jù)庫采集即可。數(shù)據(jù)庫采集模式可以作為通用的系統(tǒng)使用,更適合多人多系統(tǒng)協(xié)作。
- 智能跳過超時(shí)的設(shè)備,加快對在線設(shè)備的采集速度,當(dāng)設(shè)備數(shù)量很多的時(shí)候尤其有用。
- 對智能跳過的超時(shí)的設(shè)備,在設(shè)定的重連時(shí)間自動采集一次,以便探測設(shè)備是否又重新上線。
- 每個(gè)探測器可控是否啟用,不啟用則不會采集,也不會在界面顯示,相當(dāng)于運(yùn)行階段臨時(shí)關(guān)閉。
- 探測器可設(shè)置緩沖值和報(bào)警延時(shí)時(shí)間,在該值附近波動產(chǎn)生的報(bào)警,不計(jì)入報(bào)警,只有持續(xù)處于報(bào)警值且超過報(bào)警延時(shí)時(shí)間才算真正報(bào)警,這樣可以規(guī)避很多波動導(dǎo)致的誤報(bào)。
- 探測器可設(shè)置存儲周期,按照設(shè)定的時(shí)間來存儲一條運(yùn)行記錄,可以按照重要程度對重要性高的設(shè)定存儲周期短一些,不重要的設(shè)定大一些,這樣可以節(jié)省不少的存儲空間,也保證了重要的數(shù)據(jù)及時(shí)存儲。
- 探測器可設(shè)置清零值,在一些高精度高靈敏的設(shè)備可能出廠的時(shí)候默認(rèn)值未必是0,需要設(shè)定清零值來表示初始值。
- 探測器可設(shè)置小數(shù)點(diǎn),用于計(jì)算后的真實(shí)數(shù)據(jù)控制小數(shù)點(diǎn)點(diǎn)位顯示,相當(dāng)于除以10、除以100、除以1000,這樣大部分的探測器數(shù)據(jù)直接通過小數(shù)點(diǎn)位設(shè)置控制真實(shí)換算后的值,極個(gè)別的需要特殊轉(zhuǎn)換的可以在通信協(xié)議中約定。
- 探測器報(bào)警的類型支持多種,有些設(shè)備是高于某個(gè)值高報(bào),低于某個(gè)值低報(bào),而有些設(shè)備是在最小值最大值范圍內(nèi)是高報(bào),低于最小值低報(bào),高于最大值正常。這樣可以分情況處理,涵蓋各種報(bào)警類型。
- 原創(chuàng)數(shù)據(jù)導(dǎo)入、導(dǎo)出、打印機(jī)制,跨平臺不依賴任何組件,瞬間導(dǎo)出數(shù)據(jù)。
- 導(dǎo)出到excel的記錄支持所有excel、wps等表格文件版本,不依賴excel等軟件。
- 高報(bào)顏色、低報(bào)顏色、正常顏色、默認(rèn)值顏色等,都可以自由設(shè)置。
- 支持云端數(shù)據(jù)同步,將本地采集到的數(shù)據(jù)實(shí)時(shí)同步到云端。
- 支持網(wǎng)絡(luò)轉(zhuǎn)發(fā)和網(wǎng)絡(luò)接收,網(wǎng)絡(luò)接收開啟后,軟件從udp接收數(shù)據(jù)進(jìn)行解析。網(wǎng)絡(luò)轉(zhuǎn)發(fā)支持多個(gè)目標(biāo)IP,這樣就實(shí)現(xiàn)了本地采集的軟件,自由將數(shù)據(jù)轉(zhuǎn)到客戶端,隨時(shí)查看采集到的數(shù)據(jù)。
- 自動記住用戶最后停留的界面以及其他配置信息,重啟后自動應(yīng)用。
- 報(bào)警自動切換到對應(yīng)的地圖,探測器按鈕閃爍,表格數(shù)據(jù)對應(yīng)顏色顯示。
- 雙擊探測器圖標(biāo),彈出對應(yīng)探測器詳細(xì)信息,可以根據(jù)需要定制回控操作。
- 數(shù)據(jù)庫支持多種,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金倉等。
- 本地設(shè)備采集到的數(shù)據(jù)實(shí)時(shí)上傳到云端,以便手機(jī)APP或者web等其他方式提取。
- 自帶設(shè)備模擬工具,支持不同型號的多個(gè)設(shè)備數(shù)據(jù)模擬,同時(shí)還帶數(shù)據(jù)庫數(shù)據(jù)模擬,以便在沒有設(shè)備的時(shí)候測試數(shù)據(jù)。
- 標(biāo)準(zhǔn)modbus協(xié)議,各種控制器類型、探測器類型、種類、符號等全部自定義,非常靈活和強(qiáng)大,通信協(xié)議示例數(shù)據(jù)非常完整,通用各種modbus協(xié)議系統(tǒng),適用于各種應(yīng)用場景接入。
- 同時(shí)集成了串口通信、網(wǎng)絡(luò)通信、數(shù)據(jù)庫通信、數(shù)據(jù)導(dǎo)入導(dǎo)出打印、通信協(xié)議解析、界面UI、全局換膚等眾多組件和知識點(diǎn),非常適合新手入門和進(jìn)階。
- 支持xp、win7、win10、、win11、linux、mac、各種國產(chǎn)系統(tǒng)(UOS、中標(biāo)麒麟、銀河麒麟等)、嵌入式linux等系統(tǒng)。
- 注釋完整,項(xiàng)目結(jié)構(gòu)清晰,超級詳細(xì)完整的使用開發(fā)手冊,精確到每個(gè)代碼文件的功能說明,不斷持續(xù)迭代版本。
三、體驗(yàn)地址
國內(nèi)站點(diǎn):https://gitee.com/feiyangqingyun
國際站點(diǎn):https://github.com/feiyangqingyun
體驗(yàn)地址:https://pan.baidu.com/s/1foas7ytSXh7gHOTDqDREjQ 提取碼:axip 文件名:bin_iotsystem.zip。
四、效果圖



五、相關(guān)代碼
void DataHelper::dataout(const QString &fileName, const QString &sheetName, const QString &title,
const QList<QString> &columnNames, const QList<int> &columnWidths,
const QStringList &content, bool landscape)
{
DataContent dataContent;
dataContent.fileName = fileName;
dataContent.sheetName = sheetName;
dataContent.title = title;
dataContent.columnNames = columnNames;
dataContent.columnWidths = columnWidths;
dataContent.content = content;
dataContent.landscape = landscape;
dataout(dataContent);
}
QString DataHelper::dataout(QTableView *table, QStandardItemModel *model, quint8 type, const QString &file, const QString &title, const QString &sheet)
{
//從數(shù)據(jù)模型拿到行列
int row = model->rowCount();
int column = model->columnCount();
if (row == 0 || column == 0) {
return QString();
}
//獲取數(shù)據(jù)集合
QStringList content;
for (int i = 0; i < row; ++i) {
QStringList list;
for (int j = 0; j < column; ++j) {
list << model->item(i, j)->text();
}
//每行數(shù)據(jù)作為一個(gè)整體字符串帶分割符 ; 存入
content << list.join(";");
}
//獲取列名和列寬
QList<QString> columnNames;
QList<int> columnWidths;
for (int i = 0; i < column; ++i) {
columnNames << model->headerData(i, Qt::Horizontal).toString();
columnWidths << table->columnWidth(i);
}
return dataout(type, file, title, sheet, content, columnNames, columnWidths);
}
QString DataHelper::dataout(QTableWidget *table, quint8 type, const QString &file, const QString &title, const QString &sheet)
{
//從數(shù)據(jù)模型拿到行列
int row = table->rowCount();
int column = table->columnCount();
if (row == 0 || column == 0) {
return QString();
}
//獲取數(shù)據(jù)集合
QStringList content;
for (int i = 0; i < row; ++i) {
QStringList list;
for (int j = 0; j < column; ++j) {
list << table->item(i, j)->text();
}
//每行數(shù)據(jù)作為一個(gè)整體字符串帶分割符 ; 存入
content << list.join(";");
}
//獲取列名和列寬
QList<QString> columnNames;
QList<int> columnWidths;
for (int i = 0; i < column; ++i) {
columnNames << table->horizontalHeaderItem(i)->text();
columnWidths << table->columnWidth(i);
}
return dataout(type, file, title, sheet, content, columnNames, columnWidths);
}
QString DataHelper::dataout(quint8 type, const QString &file, const QString &title,
const QString &sheet, const QStringList &content,
const QStringList &columnNames, const QList<int> &columnWidths)
{
//設(shè)置結(jié)構(gòu)體數(shù)據(jù)
DataContent dataContent;
//填充內(nèi)容
dataContent.content = content;
//設(shè)置列名列寬
dataContent.columnNames = columnNames;
dataContent.columnWidths = columnWidths;
//設(shè)置標(biāo)題
dataContent.title = title;
//設(shè)置默認(rèn)對齊
dataContent.defaultAlignment = 0;
//如果是導(dǎo)出數(shù)據(jù)則先判斷文件名稱是否為空,為空則彈出文件對話框選擇
QString fileName = file;
if (fileName.isEmpty() && type < 3) {
//不同的格式后綴
QString filter = "all files (*.*)";
if (type == 0) {
filter = "csv files (*.csv)";
} else if (type == 1) {
filter = "xls files (*.xls)";
} else if (type == 2) {
filter = "pdf files (*.pdf)";
}
fileName = QFileDialog::getSaveFileName(0, "選擇保存文件", "", filter);
if (fileName.isEmpty()) {
return fileName;
}
}
//設(shè)置文件名
dataContent.fileName = fileName;
//xls還需要設(shè)置表名
dataContent.sheetName = sheet;
//調(diào)用靜態(tài)函數(shù)
if (type == 0) {
//重新組織內(nèi)容,前面寫入標(biāo)題,分隔符換成csv的定義的分隔符
QStringList list;
//把標(biāo)題加到內(nèi)容中
list << columnNames.join(DataCsv::CsvSpliter);
//重新更換分隔符
foreach (QString text, content) {
text.replace(";", DataCsv::CsvSpliter);
list << text;
}
DataCsv::outputData(fileName, list);
} else if (type == 1) {
DataXls::saveXls(dataContent);
} else if (type == 2) {
DataPrint::savePdf(dataContent);
} else if (type == 3) {
DataPrint::print(dataContent);
}
return fileName;
}
到此這篇關(guān)于Qt物聯(lián)網(wǎng)管理平臺之實(shí)現(xiàn)數(shù)據(jù)查詢導(dǎo)出打印的文章就介紹到這了,更多相關(guān)Qt數(shù)據(jù)查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
openCV中meanshift算法查找目標(biāo)的實(shí)現(xiàn)
本文主要介紹了openCV中meanshift算法查找目標(biāo)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C語言數(shù)據(jù)結(jié)構(gòu)實(shí)例講解單鏈表的實(shí)現(xiàn)
單鏈表是后面要學(xué)的雙鏈表以及循環(huán)鏈表的基礎(chǔ),要想繼續(xù)深入了解數(shù)據(jù)結(jié)構(gòu)以及C++,我們就要奠定好這塊基石!接下來就和我一起學(xué)習(xí)吧2022-03-03
C++實(shí)現(xiàn)水仙花數(shù)判斷實(shí)例
大家好,本篇文章主要講的是C++實(shí)現(xiàn)水仙花數(shù)判斷實(shí)例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01
C語言數(shù)據(jù)結(jié)構(gòu)經(jīng)典10大排序算法刨析
這篇文章主要介紹了C語言中常用的10種排序算法及代碼實(shí)現(xiàn),開發(fā)中排序的應(yīng)用需要熟練的掌握,因?yàn)槭腔A(chǔ)內(nèi)容,那C語言有哪些排序算法呢?本文小編就來詳細(xì)說說,需要的朋友可以參考一下2022-02-02
使用WindowsAPI實(shí)現(xiàn)播放PCM音頻的方法
這篇文章主要介紹了使用WindowsAPI實(shí)現(xiàn)播放PCM音頻的方法,很實(shí)用的一個(gè)功能,需要的朋友可以參考下2014-08-08

