設備監控模塊是地圖監控模塊的延伸,只不過是將設備作成一個個的獨立的面板顯示,相似於屏幕同樣,展現的信息會更多一些,好比設備的名稱型號等,有多少個設備就有多少個這樣的設備面板,這個主要是針對不一樣的用戶愛好,有些用戶但願看到的是表格,能夠一個屏幕看到不少設備的數據,有些用戶但願看到的是地圖,更有立體感,有些用戶但願看到的是設備面板,拉動滾動條或者切換設備數切換對應的子設備。mysql
設備面板是一個自定義控件,其實就是個widget,而後裏邊放了一些label和佈局,任何widget均可以做爲一個自定義控件來new出來放到其餘widget中,爲了使得任意的面板組件均可以靈活的放到一個容器中,設定列數,自動拉伸展現,特地封裝了一個自定義控件專門幹這個事情,能自定義產生滾動條,傳入new出來的面板控件的指針便可,由他接管。linux
皮膚開源:https://gitee.com/feiyangqingyun/QWidgetDemo https://github.com/feiyangqingyun/QWidgetDemo 文件名稱:styledemoc++
體驗地址:https://gitee.com/feiyangqingyun/QWidgetExe https://github.com/feiyangqingyun/QWidgetExe 文件名稱:bin_sams.zipgit
void DeviceHelper::initDevicePanel() { if (devicePanel == NULL) { return; } qDeleteAll(widgets); qDeleteAll(devices); widgets.clear(); devices.clear(); devices2.clear(); bool autoWidth = (DBData::NodeInfo_Count >= App::DeviceColumn); if (App::PanelMode == 0) { for (int i = 0; i < DBData::NodeInfo_Count; i++) { frmDeviceNode *widget = new frmDeviceNode; widget->setPositionID(DBData::NodeInfo_PositionID.at(i)); widget->setDeviceName(DBData::NodeInfo_DeviceName.at(i)); widget->setNodeName(DBData::NodeInfo_NodeName.at(i)); widget->setNodeType(DBData::NodeInfo_NodeType.at(i)); widget->setNodeSign(DBData::NodeInfo_NodeSign.at(i)); widget->setOnline(false); if (autoWidth) { widget->setMinimumWidth(150); } else { widget->setFixedWidth(150); } widget->setFixedHeight(widget->sizeHint().height() + 15); widgets << widget; devices << widget; } } else if (App::PanelMode == 1) { for (int i = 0; i < DBData::NodeInfo_Count; i++) { frmDeviceNode2 *widget = new frmDeviceNode2; widget->setPositionID(DBData::NodeInfo_PositionID.at(i)); widget->setDeviceName(DBData::NodeInfo_DeviceName.at(i)); widget->setNodeName(DBData::NodeInfo_NodeName.at(i)); widget->setNodeType(DBData::NodeInfo_NodeType.at(i)); widget->setNodeSign(DBData::NodeInfo_NodeSign.at(i)); widget->setOnline(false); if (autoWidth) { widget->setMinimumWidth(200); } else { widget->setFixedWidth(200); } widget->setFixedHeight(widget->sizeHint().height() - 20); widgets << widget; devices2 << widget; } } else { for (int i = 0; i < DBData::DeviceInfo_Count; i++) { frmDevicePanel *widget = new frmDevicePanel; widget->setPortName(DBData::DeviceInfo_PortName.at(i)); widget->setDeviceName(DBData::DeviceInfo_DeviceName.at(i)); widget->setDeviceAddr(DBData::DeviceInfo_DeviceAddr.at(i)); widget->setDeviceType(DBData::DeviceInfo_DeviceType.at(i)); widget->setNodeNumber(DBData::DeviceInfo_NodeNumber.at(i)); widgets << widget; } } devicePanel->setMargin(3); devicePanel->setSpace(3); devicePanel->setAutoWidth(autoWidth); devicePanel->setWidget(widgets, App::DeviceColumn); } void DeviceHelper::initDeviceStyle() { if (App::PanelMode == 0) { foreach (frmDeviceNode *device, devices) { device->initStyle(); } } else if (App::PanelMode == 1) { foreach (frmDeviceNode2 *device, devices2) { device->initStyle(); } } } void DeviceHelper::deviceOnline(const QString &deviceName, bool online) { //處理設備面板 if (App::PanelMode == 0) { foreach (frmDeviceNode *device, devices) { if (device->getDeviceName() == deviceName) { device->setOnline(online); } } } else if (App::PanelMode == 1) { foreach (frmDeviceNode2 *device, devices2) { if (device->getDeviceName() == deviceName) { device->setOnline(online); } } } //處理設備按鈕 foreach (ButtonDefence *btn, btns) { if (btn->property("deviceName").toString() == deviceName) { if (online) { btn->setButtonStatus(ButtonDefence::ButtonStatus_Arming); } else { btn->setButtonStatus(ButtonDefence::ButtonStatus_Error); btn->setText(btn->property("positionID").toString()); } //雲端數據同步 if (App::UseNetDB) { QString positionID = btn->property("positionID").toString(); QString sql = QString("update NodeData set NodeStatus='%1' where PositionID='%2'").arg(online ? 1 : 0).arg(positionID); DbTcpClientThread::Instance()->append(sql); } } } //處理設備表格 int count = deviceData->rowCount(); for (int i = 0; i < count; i++) { QString name = deviceData->item(i, 2)->text(); if (name == deviceName) { setColor(deviceData->item(i, 7), deviceData->item(i, 9), online ? 1 : 4); } } }