#include #include #include #include "diagramView.h" #include "ui_diagramView.h" #include "tools.h" #include "projectManager.h" #include "dataBase.h" #include #include DiagramView::DiagramView(QWidget *parent) : QDialog(parent) , ui(new Ui::diagramView) ,_pModel(nullptr) { ui->setupUi(this); _pModel = new QStandardItemModel(this); ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu); _count = 0; } DiagramView::~DiagramView() { delete ui; } void DiagramView::initial() { QStyle *style = QApplication::style(); m_iconUnsaved = style->standardIcon(QStyle::SP_DialogNoButton); m_iconSaved = style->standardIcon(QStyle::SP_DialogYesButton); connect(ui->treeView, &QTreeView::customContextMenuRequested, this, &DiagramView::onIndexRbtnClicked); connect(ui->treeView, &QTreeView::clicked, this, &DiagramView::onItemClicked); connect(_pModel, &QStandardItemModel::itemChanged, this, &DiagramView::onItemChanged); connect(ui->btn_new, &QPushButton::clicked, this, &DiagramView::onNewHMIClicked); connect(ui->btn_save, &QPushButton::clicked, this, &DiagramView::onSaveHMIClicked); ui->treeView->setHeaderHidden(true); // 设置模型的列数 _pModel->setColumnCount(3); _pModel->setHorizontalHeaderLabels({"名称", "状态", "修改时间"}); QList lst = DataBase::GetInstance()->getAllHMI(); for(auto& info:lst) { QString sLastSave = info.context["lastSave"].toString(); QList rowItems; QStandardItem* pItem = new QStandardItem(info.name); //名称 pItem->setData(info.uid,Qt::UserRole); rowItems.append(pItem); QStandardItem *stateItem = new QStandardItem(); //状态 updateState(stateItem,1); rowItems.append(stateItem); stateItem->setEditable(false); QStandardItem *timeItem = new QStandardItem(sLastSave); //修改时间 rowItems.append(timeItem); timeItem->setEditable(false); _pModel->appendRow(rowItems); } // 创建树视图 ui->treeView->setModel(_pModel); // 展开所有节点 ui->treeView->expandAll(); // 显示树视图 ui->treeView->setWindowTitle(QObject::tr("组态列表")); ui->treeView->header()->setStretchLastSection(false); ui->treeView->header()->setSectionResizeMode(0, QHeaderView::Stretch); ui->treeView->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents); ui->treeView->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents); } void DiagramView::onIndexRbtnClicked(const QPoint &pos) { // 获取当前点击的位置对应的索引 QMenu menu; QModelIndex index = ui->treeView->indexAt(pos); if (index.isValid()) { QStandardItem* item = _pModel->itemFromIndex(index); QVariant parentId = item->data(Qt::UserRole+1); if(item) { QAction *saveAction = new QAction("保存", this); QAction *delAction = new QAction("删除", this); connect(delAction,&QAction::triggered,this,[&](){ QModelIndex currentIndex = ui->treeView->currentIndex(); if(currentIndex.isValid()) { QStandardItem* pItem = _pModel->itemFromIndex(currentIndex); QVariant id = pItem->data(Qt::UserRole+1); QString sName = pItem->text(); if(pItem) { QString str = item->text(); DiagramInfo info; //todo:具体信息 info.id = id; //新建的随机赋予临时id info.sName = sName; info.sTag = sName; info.parentId = parentId; emit diagramDelete(info); QStandardItem* pParent = item->parent(); if(pParent) { pParent->removeRow(currentIndex.row()); } } } }); menu.addAction(saveAction); menu.addAction(delAction); } } // 在点击位置显示菜单 menu.exec(ui->treeView->mapToGlobal(pos)); } void DiagramView::onItemChanged(QStandardItem *item) { int nLevel = getLevel(item); QString str = item->text(); //名称可能修改 DiagramInfo info; info.id = item->data(Qt::UserRole).toUuid(); info.sName = str; emit diagramChange(info); } void DiagramView::onItemClicked(const QModelIndex &index) { QModelIndex firstIndex = index.sibling(0,index.column()); //取行首item if(firstIndex.isValid()){ QStandardItem* item = _pModel->itemFromIndex(firstIndex); QStandardItem* parent = item->parent(); if(item) { DiagramInfo info; info.id = item->data(Qt::UserRole).toUuid(); info.sName = item->text(); if(parent) info.parentId = parent->data(Qt::UserRole).toInt(); emit diagramSelected(info); } } } void DiagramView::onNewHMICreated(const QString& str,QUuid id) { QList rowItems; QStandardItem* pItem = new QStandardItem(str); //名称 pItem->setData(id,Qt::UserRole); rowItems.append(pItem); QStandardItem *stateItem = new QStandardItem(); //状态 updateState(stateItem,0); rowItems.append(stateItem); stateItem->setEditable(false); QStandardItem *timeItem = new QStandardItem(); //修改时间 rowItems.append(timeItem); timeItem->setEditable(false); _pModel->appendRow(rowItems); } void DiagramView::onHMIUpdated(const QString& str,QUuid id,int nState,QString sTime) { int rowCount = _pModel->rowCount(); for (int row = 0; row < rowCount; ++row) { // 获取第一列(名称列)的item QStandardItem *nameItem = _pModel->item(row, 0); if (nameItem) { QString name = nameItem->text(); if(name == str){ QStandardItem *stateItem = _pModel->item(row, 1); stateItem->setText(nState?"已保存":"未保存"); QStandardItem *timeItem = _pModel->item(row, 2); timeItem->setText(sTime); break; } } } } void DiagramView::onHMISaved(const QString& strPro,const QString& autor,QUuid uid,QString sTime) { } void DiagramView::onNewHMIClicked() { emit prepareCreateHMI(); } void DiagramView::onSaveHMIClicked() { } void DiagramView::updateState(QStandardItem* p,int n) { if(p){ if(n == 0){ //未保存 p->setText("未保存"); p->setIcon(m_iconUnsaved); } else if(n == 1){ //已保存 p->setText("已保存"); p->setIcon(m_iconSaved); } } } void DiagramView::updateSaveTime(QStandardItem* p,QString s) { if(p){ p->setText(s); } } QString DiagramView::generateName() { QString sName = QString::fromWCharArray(L"组态图_")+QString::number(_count); QModelIndex Idx = findIndex(_pModel,sName); if(Idx.isValid()) //已存在 { _count += 1; return generateName(); } else { return sName; } }