DiagramDesigner/source/monitorItemsDlg.cpp

269 lines
8.5 KiB
C++
Raw Normal View History

2025-11-14 19:31:09 +08:00
#include "monitorItemsDlg.h"
#include "ui_monitorItemsDlg.h"
#include "dataBase.h"
2025-11-21 19:22:41 +08:00
#include "tools.h"
2025-11-14 19:31:09 +08:00
#include <QToolTip>
MonitorItemsDlg::MonitorItemsDlg(QWidget *parent)
: QDialog(parent)
, ui(new Ui::monitorItemsDlg)
,_modelAll(nullptr)
,_modelSelect(nullptr)
{
ui->setupUi(this);
initial();
}
MonitorItemsDlg::~MonitorItemsDlg()
{
delete ui;
}
void MonitorItemsDlg::initial()
{
_modelAll = new QStandardItemModel(this);
ui->treeView_all->setModel(_modelAll);
ui->treeView_all->setHeaderHidden(true);
_modelSelect = new QStandardItemModel(this);
ui->treeView_select->setModel(_modelSelect);
ui->treeView_select->setHeaderHidden(true);
ui->le_name->setPlaceholderText("输入名称");
connect(ui->btn_generate,&QPushButton::clicked,this,&MonitorItemsDlg::onGenerateClicked);
connect(_modelAll, &QStandardItemModel::itemChanged,this, &MonitorItemsDlg::onItemChanged);
}
2026-03-02 20:15:22 +08:00
void MonitorItemsDlg::onUpdateItems(QList<RelationItem> lst,bool refresh)
2025-11-14 19:31:09 +08:00
{
if(refresh){
QStandardItem *root = _modelAll->invisibleRootItem();
int rowCount = root->rowCount();
if (rowCount > 0) {
_modelAll->removeRows(0, rowCount);
}
2026-03-02 20:15:22 +08:00
// 清空间隔节点缓存
m_mapBayItems.clear();
2025-11-14 19:31:09 +08:00
}
2026-03-02 20:15:22 +08:00
// 先处理间隔节点nCategory == 1
2025-11-14 19:31:09 +08:00
for(auto &info:lst){
auto curItem = info.item;
2026-03-02 20:15:22 +08:00
if(curItem.nCategory == 1){ // 间隔信息
// 查找是否已存在该间隔节点
QStandardItem* pBayItem = findBayItem(curItem.sName);
if(!pBayItem){
// 创建间隔节点
pBayItem = new QStandardItem(curItem.sName);
pBayItem->setCheckable(true); // 启用勾选框
pBayItem->setCheckState(Qt::Unchecked);
pBayItem->setData(curItem.nCategory, Qt::UserRole+1); // 存储类别
pBayItem->setData(curItem.nEquipType, Qt::UserRole+2); // 存储设备类型
pBayItem->setData(curItem.uid, Qt::UserRole+3); // 存储UUID
// 存储到缓存中
m_mapBayItems[curItem.sName] = pBayItem;
_modelAll->appendRow(pBayItem);
2025-11-14 19:31:09 +08:00
}
2026-03-02 20:15:22 +08:00
}
}
// 再处理设备节点nCategory == 0
for(auto &info:lst){
auto curItem = info.item;
if(curItem.nCategory == 0){ // 设备信息
// 获取设备所属的间隔名称
QString bayName = info.parent.sName;
if(!bayName.isEmpty()){
// 查找对应的间隔节点
QStandardItem* pBayItem = findBayItem(bayName);
if(pBayItem){
// 创建设备节点
2025-11-14 19:31:09 +08:00
QStandardItem *pItem = new QStandardItem(curItem.sName);
pItem->setCheckable(true); // 启用勾选框
pItem->setCheckState(Qt::Unchecked);
2026-03-02 20:15:22 +08:00
pItem->setData(curItem.nCategory, Qt::UserRole+1);
pItem->setData(curItem.nEquipType, Qt::UserRole+2);
pItem->setData(curItem.uid, Qt::UserRole+3);
// 不再为母线或独立设备添加子设备
// 所有设备都作为间隔的直接子节点
pBayItem->appendRow(pItem);
2025-11-14 19:31:09 +08:00
}
}
}
}
2026-03-02 20:15:22 +08:00
// 展开所有节点
2025-11-14 19:31:09 +08:00
ui->treeView_all->expandAll();
}
2026-03-02 20:15:22 +08:00
void MonitorItemsDlg::onSelectItems(QList<RelationItem> lst)
2025-11-14 19:31:09 +08:00
{
ui->stackedWidget->setCurrentIndex(0);
2025-11-21 19:22:41 +08:00
resetSelect();
2025-11-14 19:31:09 +08:00
for(auto& info:lst){
2025-11-21 19:22:41 +08:00
QModelIndex itemIndex = findIndex(_modelAll,info.item.uid,Qt::UserRole+3);
if(itemIndex.isValid())
{
QStandardItem *pItem = _modelAll->itemFromIndex(itemIndex);
pItem->setCheckState(Qt::Checked);
2025-11-14 19:31:09 +08:00
}
2025-11-21 19:22:41 +08:00
}
2025-11-14 19:31:09 +08:00
}
void MonitorItemsDlg::onGenerateClicked()
{
QString sName = ui->le_name->text();
if (sName.isEmpty()) {
ui->le_name->setFocus();
return;
}
2026-03-02 20:15:22 +08:00
QList<RelationItem> lst;
2025-11-21 19:22:41 +08:00
QList<QStandardItem*> lstItem = getTreeViewCheckedItems(ui->treeView_all);
for(auto& pItem:lstItem){
2026-03-02 20:15:22 +08:00
RelationItem info;
2025-11-21 19:22:41 +08:00
auto pParent = pItem->parent();
if(pParent){
info.parent.nCategory = pParent->data(Qt::UserRole+1).toInt();
info.parent.nEquipType = pParent->data(Qt::UserRole+2).toInt();
info.parent.uid = pParent->data(Qt::UserRole+3).toUuid();
info.parent.sName = pParent->text();
2025-11-14 19:31:09 +08:00
}
2025-11-21 19:22:41 +08:00
info.item.nCategory = pItem->data(Qt::UserRole+1).toInt();
info.item.nEquipType = pItem->data(Qt::UserRole+2).toInt();
info.item.uid = pItem->data(Qt::UserRole+3).toUuid();
info.item.sName = pItem->text();
auto lstChild = getAllChildren(pItem);
for(auto &child:lstChild){
2026-03-02 20:15:22 +08:00
RelationSturctItem stru;
2025-11-21 19:22:41 +08:00
stru.nCategory = child->data(Qt::UserRole+1).toInt();
stru.nEquipType = child->data(Qt::UserRole+2).toInt();
stru.uid = child->data(Qt::UserRole+3).toUuid();
stru.sName = child->text();
info.subList.append(stru);
}
lst.append(info);
2025-11-14 19:31:09 +08:00
}
2025-11-21 19:22:41 +08:00
emit generateMonitor(sName,lst);
2025-11-14 19:31:09 +08:00
}
2026-03-02 20:15:22 +08:00
void MonitorItemsDlg::onMonitorCreated(QList<RelationItem> lst)
2025-11-14 19:31:09 +08:00
{
/*ui->stackedWidget->setCurrentIndex(1);
ui->listWidget_select->clear();
for(auto& pair:lst){
QListWidgetItem *item = new QListWidgetItem(pair.first);
item->setData(Qt::UserRole,pair.second);
ui->listWidget_select->addItem(item);
}*/
}
void MonitorItemsDlg::onItemChanged(QStandardItem *item)
{
QSignalBlocker blocker(_modelAll);
if (item->isCheckable()) {
Qt::CheckState newState = item->checkState();
// 设置所有子项与父项相同的状态
setChildrenCheckState(item, newState);
}
ui->treeView_all->repaint();
}
void MonitorItemsDlg::setChildrenCheckState(QStandardItem *parent, Qt::CheckState state) {
for (int row = 0; row < parent->rowCount(); ++row) {
QStandardItem *child = parent->child(row, 0); // 第一列
if (child && child->isCheckable()) {
child->setCheckState(state);
setChildrenCheckState(child, state);
}
}
}
2025-11-21 19:22:41 +08:00
void MonitorItemsDlg::traverseSelectStandardItemModel(QStandardItemModel *model,Qt::CheckState check) {
if (!model) return;
// 遍历所有顶层项
for (int row = 0; row < model->rowCount(); ++row) {
for (int col = 0; col < model->columnCount(); ++col) {
QStandardItem *item = model->item(row, col);
item->setCheckState(check);
traverseSelectStandardItem(item, 0,check);
}
}
}
void MonitorItemsDlg::traverseSelectStandardItem(QStandardItem *item, int depth,Qt::CheckState check) {
if (!item) return;
// 遍历子项
for (int row = 0; row < item->rowCount(); ++row) {
for (int col = 0; col < item->columnCount(); ++col) {
QStandardItem *child = item->child(row, col);
child->setCheckState(check);
traverseSelectStandardItem(child, depth + 1,check);
}
}
}
2026-03-02 20:15:22 +08:00
QStandardItem* MonitorItemsDlg::findBayItem(const QString& bayName)
{
// 先从缓存查找
if(m_mapBayItems.contains(bayName)){
return m_mapBayItems[bayName];
}
// 遍历查找
for(int i = 0; i < _modelAll->rowCount(); ++i){
QStandardItem* pItem = _modelAll->item(i);
if(pItem->text() == bayName &&
pItem->data(Qt::UserRole+1).toInt() == 1){ // 类别为间隔
return pItem;
}
}
return nullptr;
}
2025-11-21 19:22:41 +08:00
QList<QStandardItem*> MonitorItemsDlg::getCheckedItems(QStandardItem* parentItem) {
QList<QStandardItem*> checkedItems;
if (!parentItem) return checkedItems;
for (int i = 0; i < parentItem->rowCount(); ++i) {
QStandardItem* childItem = parentItem->child(i);
if (childItem->checkState() == Qt::Checked) {
checkedItems.append(childItem);
}
// 递归检查子项
checkedItems.append(getCheckedItems(childItem));
}
return checkedItems;
}
// 主函数获取treeView中所有checked项
QList<QStandardItem*> MonitorItemsDlg::getTreeViewCheckedItems(QTreeView* treeView) {
QList<QStandardItem*> checkedItems;
QStandardItemModel* model = qobject_cast<QStandardItemModel*>(treeView->model());
if (!model) return checkedItems;
QStandardItem* rootItem = model->invisibleRootItem();
return getCheckedItems(rootItem);
}
2025-11-14 19:31:09 +08:00
void MonitorItemsDlg::resetSelect()
{
2025-11-21 19:22:41 +08:00
traverseSelectStandardItemModel(_modelAll,Qt::Unchecked);
2025-11-14 19:31:09 +08:00
}