日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

Qt编写可视化大屏电子看板系统25-模块3设备监控

發(fā)布時(shí)間:2023/12/8 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt编写可视化大屏电子看板系统25-模块3设备监控 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

設(shè)備監(jiān)控主要用來實(shí)時(shí)監(jiān)測制造零件等使用的設(shè)備的工作運(yùn)行狀態(tài),每個(gè)設(shè)備都有對應(yīng)的需要、分組名稱、分組編號、設(shè)備名稱、文字1、文字2、工作狀態(tài)(1-開機(jī) 2-待機(jī) 3-維護(hù) 4-空),不同的工作狀態(tài)不同顏色顯示,比如維護(hù)狀態(tài)紅色顯示,待機(jī)狀態(tài)黃色顯示。右側(cè)顯示對應(yīng)設(shè)備分組的稼動(dòng)率、開機(jī)數(shù)量、待機(jī)數(shù)量、維護(hù)數(shù)量。

Qt源自c++,類的思想非常強(qiáng)大,比如這個(gè)設(shè)備監(jiān)控模塊,每個(gè)設(shè)備需要顯示設(shè)備名稱、多種文字等,還有不同狀態(tài)不用背景顏色,這就需要單獨(dú)寫個(gè)設(shè)備類,記錄存儲這些值,并根據(jù)設(shè)定的值做出反應(yīng),最后有多少個(gè)設(shè)備就new多少個(gè)這個(gè)類,放入面板中。

子模塊表名對應(yīng)表:

子模塊標(biāo)題子模塊表名
設(shè)備運(yùn)行狀態(tài)t_3_1_device_runtime
稼動(dòng)率t_3_2_oee

1 設(shè)備運(yùn)行狀態(tài)

表名:t_3_1_device_runtime

字段名中文名類型長度說明
internal_id序號INTEGER11主鍵自增
group_name分組名稱VARCHAR4不為空
no_id分組編號INTEGER11不為空
name名稱VARCHAR255不為空
text_1文字1VARCHAR255
text_2文字2VARCHAR255
status狀態(tài) 1-開機(jī) 2-待機(jī) 3-維護(hù) 4-空INTEGER1不為空

默認(rèn)數(shù)據(jù):

internal_idgroup_nameno_idnametext_1text_2status
1CNC1CNC1190411PID111
2CNC2CNC2190412PID121
3CNC3CNC3190413PID131
4CNC4CNC4190414PID142
5CNC5CNC5190415PID151
6CNC6CNC6190416PID162
7CNC7CNC7190417PID171
8CNC84
9EDM1EDM1190421PID211
10EDM2EDM2190422PID232
11EDM3EDM3190423PID231
12EDM4EDM4190424PID243
13EDM5EDM5190425PID251
14EDM6EDM6190426PID261
15EDM7EDM7190427PID271
16EDM8EDM8190428PID282
17WEDM1WEDM1190431PID281
18WEDM2WEDM2190432PID283
19WEDM3WEDM3190434PID292
20WEDM4WEDM4190435PID301
21WEDM5WEDM5190436PID361
22WEDM6WEDM6190437PID373
23WEDM74
24WEDM84

2 稼動(dòng)率

表名:t_3_2_oee

字段名中文名類型長度說明
internal_id序號INTEGER11主鍵自增
cnc類別-cncINTEGER3不為空
edm類別-edmINTEGER3不為空
wedm類別-wedmINTEGER3不為空

默認(rèn)數(shù)據(jù):1 110 90 90

二、功能特點(diǎn)

  • 采用分層設(shè)計(jì),整體總共分三級界面,一級界面是整體布局,二級界面是單個(gè)功能模塊,三級界面是單個(gè)控件。
  • 子控件包括餅圖、圓環(huán)圖、曲線圖、柱狀圖、柱狀分組圖、橫向柱狀圖、橫向柱狀分組圖、合格率控件、百分比控件、進(jìn)度控件、設(shè)備狀態(tài)面板、表格數(shù)據(jù)、地圖控件、視頻控件等。
  • 二級界面可以自由拖動(dòng)懸浮,支持最小化隱藏、最大化關(guān)閉、響應(yīng)雙擊自定義標(biāo)題欄。
  • 數(shù)據(jù)源支持模擬數(shù)據(jù)(默認(rèn))、數(shù)據(jù)庫采集、串口通信(需定制)、網(wǎng)絡(luò)通信(需定制)、網(wǎng)絡(luò)請求等,可自由設(shè)定每個(gè)子界面的采集間隔即數(shù)據(jù)刷新頻率。
  • 采用純QWidget編寫,親測Qt4.6到Qt6.2任意版本,理論上支持后續(xù)其他Qt版本。
  • 超強(qiáng)跨平臺,親測windows、linux、mac、國產(chǎn)uos、國產(chǎn)銀河麒麟kylin等系統(tǒng),效果完美,同時(shí)還支持嵌入式linux比如樹莓派、香橙派、全志、imx6等。
  • 同時(shí)集成了自定義控件、qchart餅圖、echart地圖等功能。
  • 內(nèi)置多套配色風(fēng)格樣式(紫色、藍(lán)色、深藍(lán)、黑色),默認(rèn)紫色,自適應(yīng)任意分辨率。
  • 可設(shè)置系統(tǒng)標(biāo)題、目標(biāo)分辨率、布局方案,啟動(dòng)立即應(yīng)用。
  • 可設(shè)置主背景顏色、面板顏色、十字線游標(biāo)顏色等各種顏色。
  • 可設(shè)置多條曲線不同顏色,沒有設(shè)置顏色的情況下內(nèi)置多套精美顏色隨機(jī)應(yīng)用。
  • 可設(shè)置標(biāo)題欄背景顏色、文字顏色。
  • 可設(shè)置曲線圖表背景顏色、文字顏色、網(wǎng)格顏色。
  • 可設(shè)置正常顏色、警戒顏色、報(bào)警顏色、禁用顏色、百分比進(jìn)度顏色。
  • 可分別設(shè)置各種字體大小,比如全局字體、軟件名稱、標(biāo)題欄、子標(biāo)題欄、加粗標(biāo)簽等。
  • 可設(shè)置標(biāo)題欄高度、表頭高度、行高度。
  • 曲線支持游標(biāo)、定位線、懸停高亮數(shù)據(jù)點(diǎn)、懸停顯示值。
  • 柱狀圖支持頂部(可設(shè)置頂端、上部、中間、底部)顯示數(shù)據(jù),全部自適應(yīng)計(jì)算位置。
  • 支持平滑曲線,內(nèi)置多種平滑曲線算法,還支持面積圖平滑。
  • 面積圖填充顏色可選多種規(guī)則比如單色透明度填充、透明度漸變填充等。
  • 數(shù)據(jù)庫支持sqlite、mysql、postgresql、oracle、國產(chǎn)人大金倉等數(shù)據(jù)庫。
  • 主界面直接鼠標(biāo)右鍵切換布局、配色方案、關(guān)閉開啟某個(gè)二級窗體。
  • 自動(dòng)記憶所有子窗口的大小和位置,下次啟動(dòng)立即應(yīng)用。
  • 動(dòng)態(tài)加載布局方案菜單,可以動(dòng)態(tài)新建布局、恢復(fù)布局、保存布局、另存布局等,用戶可以制造任意布局。
  • 二級窗體,雙擊從主窗體分離出來浮動(dòng),可以自由調(diào)整大小。再次雙擊標(biāo)題欄最大化,再次雙擊還原。
  • 子模塊也可以全屏顯示作為一個(gè)大屏,這樣就可以一個(gè)大屏拓展出多個(gè)子大屏,放大查看子模塊的數(shù)據(jù)詳情,適用多屏展示。
  • 每個(gè)模塊都可以自定義采集速度,如果是數(shù)據(jù)庫采集會自動(dòng)排隊(duì)處理,后期還可以拓展每個(gè)子模塊都獨(dú)立的數(shù)據(jù)庫采集。
  • 提供系統(tǒng)設(shè)置模塊進(jìn)行整體的配置參數(shù)設(shè)置,效果立即應(yīng)用。
  • 提供精美炫酷的大屏地圖模塊,包括靜態(tài)圖片、閃爍效果、遷徙效果、世界地圖、區(qū)域地圖等,可指定點(diǎn)的經(jīng)緯度坐標(biāo),識別單擊響應(yīng),可以做地圖跳轉(zhuǎn)等,每個(gè)點(diǎn)都可以不同的顏色和提示信息。
  • 除了提供大屏系統(tǒng)外,還將每個(gè)模塊都做了獨(dú)立的模塊示例界面,每個(gè)模塊都可以獨(dú)立學(xué)習(xí)使用,里面用到的控件也單獨(dú)做了控件示例界面,方便學(xué)習(xí)每個(gè)控件如何使用。
  • 非常詳細(xì)的開發(fā)和使用手冊,其中包括數(shù)據(jù)庫說明、模塊對照圖、控件對照圖、項(xiàng)目結(jié)構(gòu)、代碼說明(精確到每個(gè)類)、演示demo、使用方法等。
  • 三、體驗(yàn)地址

  • 體驗(yàn)地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 文件名:bin_bigscreen.zip。
  • 國內(nèi)站點(diǎn):https://gitee.com/feiyangqingyun
  • 國際站點(diǎn):https://github.com/feiyangqingyun
  • 個(gè)人主頁:https://blog.csdn.net/feiyangqingyun
  • 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/
  • 在線文檔:https://feiyangqingyun.gitee.io/qwidgetdemo/bigscreen/
  • 四、效果圖

    五、核心代碼

    #include "frmmodule3.h" #include "ui_frmmodule3.h" #include "quihelper.h" #include "appinit.h"frmModule3::frmModule3(QWidget *parent) : QWidget(parent), ui(new Ui::frmModule3) {ui->setupUi(this);this->initForm();this->initDevice();this->loadDevice(); }frmModule3::~frmModule3() {delete ui; }void frmModule3::initForm() {//設(shè)置對應(yīng)的屬性應(yīng)用特定樣式ui->labTitle1->setProperty("flag", "title");ui->labTitle2->setProperty("flag", "title");ui->labTitle3->setProperty("flag", "title");ui->labTitle4->setProperty("flag", "title");ui->labTitle5->setProperty("flag", "title");ui->labTitle6->setProperty("flag", "title");ui->widgetSub1->setProperty("flag", "sub");ui->widgetSub2->setProperty("flag", "sub");ui->widgetSub3->setProperty("flag", "sub");ui->widgetSub4->setProperty("flag", "sub");ui->widgetResult1->setProperty("flag", "lab");ui->widgetResult2->setProperty("flag", "lab");ui->widgetResult3->setProperty("flag", "lab");//定時(shí)器模擬數(shù)據(jù)timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(loadDevice()));//綁定信號槽處理接收的數(shù)據(jù)+發(fā)送執(zhí)查詢語句connect(DbData::DbLocal, SIGNAL(receiveData(QString, QStringList, int)),this, SLOT(receiveData(QString, QStringList, int)));connect(DbData::DbHttp, SIGNAL(receiveData(QString, QStringList, int)),this, SLOT(receiveData(QString, QStringList, int)));//綁定樣式改變信號重新設(shè)置顏色connect(AppEvent::Instance(), SIGNAL(changeStyle()), this, SLOT(changeStyle())); }void frmModule3::initStatus() {foreach (frmDevice *frm, device1) {frm->setStatus(frm->getStatus());}foreach (frmDevice *frm, device2) {frm->setStatus(frm->getStatus());}foreach (frmDevice *frm, device3) {frm->setStatus(frm->getStatus());} }void frmModule3::changeStyle() {//延時(shí)處理QTimer::singleShot(100, this, SLOT(initStatus())); }void frmModule3::receiveData(const QString &tag, const QStringList &data, int mesc) {int count = data.count();if (tag == "t_3_1_device_runtime") {if (count == 24 * 6) {QList<int> status1, status2, status3;QStringList taskID1, personID1, deviceID1;QStringList taskID2, personID2, deviceID2;QStringList taskID3, personID3, deviceID3;int max1 = 8 * 6, max2 = 16 * 6, max3 = 24 * 6;for (int i = 0; i < max1; i = i + 6) {deviceID1 << data.at(i + 2);taskID1 << data.at(i + 3);personID1 << data.at(i + 4);status1 << data.at(i + 5).toInt();}for (int i = max1; i < max2; i = i + 6) {deviceID2 << data.at(i + 2);taskID2 << data.at(i + 3);personID2 << data.at(i + 4);status2 << data.at(i + 5).toInt();}for (int i = max2; i < max3; i = i + 6) {deviceID3 << data.at(i + 2);taskID3 << data.at(i + 3);personID3 << data.at(i + 4);status3 << data.at(i + 5).toInt();}loadDevice1(taskID1, personID1, deviceID1, status1);loadDevice2(taskID2, personID2, deviceID2, status2);loadDevice3(taskID3, personID3, deviceID3, status3);}} else if (tag == "t_3_2_oee") {if (count == 3) {int value1 = data.at(0).toDouble();int value2 = data.at(1).toDouble();int value3 = data.at(2).toDouble();loadResult(value1, value2, value3);}} }void frmModule3::loadResult(int value1, int value2, int value3) {ui->labcnc1->setText(QString("稼 動(dòng) 率: %1%").arg(value1));ui->labedm1->setText(QString("稼 動(dòng) 率: %1%").arg(value2));ui->labwedm1->setText(QString("稼 動(dòng) 率: %1%").arg(value3)); }void frmModule3::initDevice() {device1 << ui->devicecnc1 << ui->devicecnc2 << ui->devicecnc3 << ui->devicecnc4;device1 << ui->devicecnc5 << ui->devicecnc6 << ui->devicecnc7 << ui->devicecnc8;device2 << ui->deviceedm1 << ui->deviceedm2 << ui->deviceedm3 << ui->deviceedm4;device2 << ui->deviceedm5 << ui->deviceedm6 << ui->deviceedm7 << ui->deviceedm8;device3 << ui->devicewedm1 << ui->devicewedm2 << ui->devicewedm3 << ui->devicewedm4;device3 << ui->devicewedm5 << ui->devicewedm6 << ui->devicewedm7 << ui->devicewedm8;foreach (frmDevice *frm, device1) {frm->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);}foreach (frmDevice *frm, device2) {frm->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);}foreach (frmDevice *frm, device3) {frm->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);} }void frmModule3::loadDevice() {QString tableName = "t_3_1_device_runtime";QString columnName = "group_name,no_id,name,text_1,text_2,status";QString tableName2 = "t_3_2_oee";QString columnName2 = "cnc,edm,wedm";if (AppConfig::WorkMode == "timer") {QList<int> status1, status2, status3;QStringList taskID1, personID1, deviceID1;QStringList taskID2, personID2, deviceID2;QStringList taskID3, personID3, deviceID3;for (int i = 0; i < 8; i++) {taskID1 << QString("TID1%1").arg(i + 1);personID1 << QString("PID1%1").arg(i + 1);deviceID1 << QString("CNC%1").arg(i + 1);status1 << QUIHelper::getRandValue(1, 5);taskID2 << QString("TID2%1").arg(i + 1);personID2 << QString("PID2%1").arg(i + 1);deviceID2 << QString("EDM%1").arg(i + 1);status2 << QUIHelper::getRandValue(1, 5);taskID3 << QString("TID3%1").arg(i + 1);personID3 << QString("PID3%1").arg(i + 1);deviceID3 << QString("WEDM%1").arg(i + 1);status3 << QUIHelper::getRandValue(1, 5);}loadDevice1(taskID1, personID1, deviceID1, status1);loadDevice2(taskID2, personID2, deviceID2, status2);loadDevice3(taskID3, personID3, deviceID3, status3);loadResult(85, 90, 95);} else if (AppConfig::WorkMode == "db") { DbData::DbLocal->select(tableName, columnName, true);DbData::DbLocal->select(tableName2, columnName2, true);} else if (AppConfig::WorkMode == "http") { DbData::DbHttp->select(tableName, columnName, true);DbData::DbHttp->select(tableName2, columnName2, true);} }void frmModule3::loadDevice1(const QStringList &taskID, const QStringList &personID,const QStringList &deviceID, const QList<int> &status) {if (taskID.count() != 8 || personID.count() != 8 || deviceID.count() != 8 || status.count() != 8) {return;}//自動(dòng)統(tǒng)計(jì)開機(jī)待機(jī)維護(hù)數(shù)量int count1 = 0, count2 = 0, count3 = 0;for (int i = 0; i < 8; i++) {device1.at(i)->setTaskID(taskID.at(i));device1.at(i)->setPersonID(personID.at(i));device1.at(i)->setDeviceID(deviceID.at(i));device1.at(i)->setStatus(status.at(i));switch (status.at(i)) {case 1:count1++;break;case 2:count2++;break;case 3:count3++;break;}}ui->labcnc2->setText(QString("開機(jī)數(shù)量: %1").arg(count1));ui->labcnc3->setText(QString("待機(jī)數(shù)量: %1").arg(count2));ui->labcnc4->setText(QString("維護(hù)數(shù)量: %1").arg(count3)); }void frmModule3::loadDevice2(const QStringList &taskID, const QStringList &personID,const QStringList &deviceID, const QList<int> &status) {if (taskID.count() != 8 || personID.count() != 8 || deviceID.count() != 8 || status.count() != 8) {return;}//自動(dòng)統(tǒng)計(jì)開機(jī)待機(jī)維護(hù)數(shù)量int count1 = 0, count2 = 0, count3 = 0;for (int i = 0; i < 8; i++) {device2.at(i)->setTaskID(taskID.at(i));device2.at(i)->setPersonID(personID.at(i));device2.at(i)->setDeviceID(deviceID.at(i));device2.at(i)->setStatus(status.at(i));switch (status.at(i)) {case 1:count1++;break;case 2:count2++;break;case 3:count3++;break;}}ui->labedm2->setText(QString("開機(jī)數(shù)量: %1").arg(count1));ui->labedm3->setText(QString("待機(jī)數(shù)量: %1").arg(count2));ui->labedm4->setText(QString("維護(hù)數(shù)量: %1").arg(count3)); }void frmModule3::loadDevice3(const QStringList &taskID, const QStringList &personID,const QStringList &deviceID, const QList<int> &status) {if (taskID.count() != 8 || personID.count() != 8 || deviceID.count() != 8 || status.count() != 8) {return;}//自動(dòng)統(tǒng)計(jì)開機(jī)待機(jī)維護(hù)數(shù)量int count1 = 0, count2 = 0, count3 = 0;for (int i = 0; i < 8; i++) {device3.at(i)->setTaskID(taskID.at(i));device3.at(i)->setPersonID(personID.at(i));device3.at(i)->setDeviceID(deviceID.at(i));device3.at(i)->setStatus(status.at(i));switch (status.at(i)) {case 1:count1++;break;case 2:count2++;break;case 3:count3++;break;}}ui->labwedm2->setText(QString("開機(jī)數(shù)量: %1").arg(count1));ui->labwedm3->setText(QString("待機(jī)數(shù)量: %1").arg(count2));ui->labwedm4->setText(QString("維護(hù)數(shù)量: %1").arg(count3)); }void frmModule3::start(int interval) {this->loadDevice();//如果間隔太短表示不需要刷新,執(zhí)行一次即可if (interval > 2000) {timer->start(interval);} }void frmModule3::stop() {if (timer->isActive()) {timer->stop();} }

    總結(jié)

    以上是生活随笔為你收集整理的Qt编写可视化大屏电子看板系统25-模块3设备监控的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久人人爽人人人人片 | 久久超碰精品 | 嫩草影院在线视频 | 国产精品美女一区 | 国产又大又黄又爽 | 成人有色视频 | 你懂的在线观看视频 | 午夜视频在线免费播放 | 中文字幕在线不卡视频 | 成年人看的黄色 | 欧美图片第一页 | 成人拍拍拍 | 欧美在线另类 | 中文字幕在线视频免费播放 | 一区二区高清 | 911美女片黄在线观看游戏 | 国产精品一区不卡 | 色多多黄色 | 色多多视频在线观看 | 999国产在线 | 久久国产一区二区 | 国产精品九一 | 黄页av | 黄色三级图片 | 操人视频网站 | 黄色成人影视 | 欧美亚洲专区 | 久久不卡视频 | 亚日韩在线| 人人爽人人爽人人片 | 国产crm系统91在线 | 午夜国产一区二区 | 青青色在线| 久久亚洲成人av | 亚洲精品成 | 日本高清在线一区 | 在线超碰| japanese24hdxxxx中文字幕 | 精品国产乱码一区二区三区99 | 99免费精品 | 手机在线一区二区 | 黄色在线免费网站 | www青青草 | 德国性经典xxxx性hd | 亚洲精品日本 | 国产日韩欧美成人 | 国产伦精品一区二区三区照片91 | 日本欧美激情 | 永久免费汤不热视频 | 中文字幕精品一区二 | 蜜桃啪啪| 又黄又爽的视频在线观看 | 国产69精品久久久久久久久久 | 亚洲色图18p| 在线高清观看免费观看 | 农村少妇无套内谢粗又长 | 一区二区在线观看免费 | 最新视频 - 8mav| 国产白嫩美女无套久久 | 男生吃小头头的视频 | 中国少妇初尝黑人巨大 | 无码国内精品人妻少妇蜜桃视频 | 国产一级一片免费播放 | 亚洲天堂2024 | 91精彩视频在线观看 | 女人的av| 成人在线视频一区 | 精品国产一二三 | 亚洲一线在线观看 | 香蕉久久夜色精品国产使用方法 | 色噜噜在线观看 | 亚洲区在线播放 | 国产精品二区一区二区aⅴ污介绍 | aa一级视频 | 天天爱天天操 | 久久538| 一个人看的www日本高清视频 | 在线色网| 久久久久久福利 | 一区在线观看视频 | 成人性视频网站 | 5a毛片 | 国产乱码在线观看 | 黄页在线播放 | 欧美高跟鞋交xxxxxhd | 亚洲精品h | 国内精品久久久久久久久久久 | 国产乱来视频 | 韩国三级国产 | 国产黑丝91 | 国产亲伦免费视频播放 | 欧美jizzhd欧美18 | 国模小黎自慰gogo人体 | 在线观看日本一区 | 亚洲一区二区国产精品 | 欧美日韩国产网站 | 欧美成人免费在线视频 | 亚洲人av在线 | 一区二区三区在线播放视频 |