瀏覽代碼

edit node

chengxr 1 年之前
父節點
當前提交
22d2d96002

+ 10 - 0
QFD/CCanvas/CMind.cpp

@@ -115,6 +115,16 @@ void CMind::removeNode(int number)
     }
 }
 
+void CMind::updateNode(CNodeData n)
+{
+    for (int i = 0; i < m_nodeList.count(); i++) {
+        if (n.id == m_nodeList[i].id) {
+            m_nodeList.replace(i, n);
+            break;
+        }
+    }
+}
+
 CNodeData CMind::root() const
 {
     return node(minNumber());

+ 1 - 0
QFD/CCanvas/CMind.h

@@ -25,6 +25,7 @@ public:
     bool canAddNode(CNodeData n);
     void addNode(CNodeData n);
     void removeNode(int number);
+    void updateNode(CNodeData n);
 
     CNodeData root() const;
 

+ 10 - 0
QFD/CCanvas/CMindView.cpp

@@ -82,6 +82,16 @@ void CMindView::addNode(CNodeData n)
     refreshItems();
 }
 
+void CMindView::updateNode(CNodeData n)
+{
+    m_mind->updateNode(n);
+    CNodeItem *item = m_root->subNode(n.number);
+    if (item != nullptr) {
+        item->setData(n);
+        refreshItems();
+    }
+}
+
 void CMindView::clear()
 {
     m_mind->clear();

+ 2 - 0
QFD/CCanvas/CMindView.h

@@ -22,6 +22,8 @@ public:
 
     void addNode(CNodeData n);  // 添加一个节点
 
+    void updateNode(CNodeData n);  // 更新
+
     void clear();  // 清空
 
     void refreshItems();

+ 25 - 0
QFD/CCanvas/CNodeItem.cpp

@@ -12,6 +12,7 @@
 CNodeItem::CNodeItem(const CNodeData data, CNodeItem *parent) : QObject(parent), m_data(data)
 {
     m_rectItem = new CRectItem();
+    m_rectItem->setToolTip(data.remark);
     m_textItem = new CTextItem(data.name, m_rectItem);
     m_lineItem = new CLineItem(m_rectItem);
     updateItemsGeometry();
@@ -23,6 +24,13 @@ CNodeData CNodeItem::data() const
     return m_data;
 }
 
+void CNodeItem::setData(CNodeData data)
+{
+    m_data = data;
+    m_textItem->setPlainText(data.name);
+    m_rectItem->setToolTip(data.remark);
+}
+
 void CNodeItem::addSubNode(CNodeItem *n)
 {
     if (n == nullptr) {
@@ -51,6 +59,23 @@ void CNodeItem::removeNode(int number)
     }
 }
 
+CNodeItem *CNodeItem::subNode(int number)
+{
+    if (data().number == number) {
+        return this;
+    }
+
+    for (QObject *obj : children()) {
+        CNodeItem *t   = dynamic_cast<CNodeItem *>(obj);
+        CNodeItem *sub = t->subNode(number);
+        if (sub != nullptr) {
+            return sub;
+        }
+    }
+
+    return nullptr;
+}
+
 CRectItem *CNodeItem::rectItem() const
 {
     return m_rectItem;

+ 3 - 0
QFD/CCanvas/CNodeItem.h

@@ -18,10 +18,13 @@ public:
     explicit CNodeItem(const CNodeData data, CNodeItem *parent = nullptr);
 
     CNodeData data() const;
+    void setData(CNodeData data);
 
     void addSubNode(CNodeItem *n);
     void removeNode(int number);
 
+    CNodeItem *subNode(int number);
+
     CRectItem *rectItem() const;
     CTextItem *textItem() const;
     CLineItem *lineItem() const;

+ 101 - 1
QFD/widgets/EditNodeWidget.cpp

@@ -1,3 +1,103 @@
 #include "EditNodeWidget.h"
 
-EditNodeWidget::EditNodeWidget(CNodeData n, QWidget *parent) { }
+#include <Widgets/LineEdit.h>
+#include <Widgets/Button.h>
+
+#include <QLabel>
+#include <QBoxLayout>
+#include <QGridLayout>
+
+#include <QDebug>
+
+EditNodeWidget::EditNodeWidget(QWidget *parent) : QDialog(parent)
+{
+    initWindow();
+    initWidgets();
+    initLayout();
+    connectSignalsAndSlots();
+}
+
+CNodeData EditNodeWidget::node() const
+{
+    return m_node;
+}
+
+void EditNodeWidget::setNode(CNodeData n)
+{
+    m_node = n;
+    m_name->setText(n.name);
+    m_remark->setText(n.remark);
+    m_confirm->setEnabled(false);
+}
+
+void EditNodeWidget::initWindow()
+{
+    setWindowTitle("编辑节点");
+    //    setWindowFlags(Qt::Window);
+    //    setWindowFlag(Qt::WindowMinMaxButtonsHint, false);
+
+    setModal(true);
+    setWindowFlags(Qt::Dialog);
+    setWindowFlag(Qt::WindowContextHelpButtonHint, false);
+    setFixedSize(350, 250);
+}
+
+void EditNodeWidget::initWidgets()
+{
+    m_nameLabel   = new QLabel("名称:", this);
+    m_name        = new LineEdit(this);
+    m_remarkLabel = new QLabel("内涵:", this);
+    m_remarkLabel->setContentsMargins(0, 10, 0, 10);
+    m_remark  = new TextEdit(this);
+    m_confirm = new PushButton("保存", this);
+    m_cancel  = new PushButton("取消", this);
+}
+
+void EditNodeWidget::initLayout()
+{
+    m_layout = new QVBoxLayout(this);
+    m_layout->setMargin(20);
+    m_gridLayout = new QGridLayout();
+    m_layout->addLayout(m_gridLayout);
+    m_layout->addSpacing(20);
+    m_btnLayout = new QHBoxLayout();
+    m_layout->addLayout(m_btnLayout);
+
+    m_name->setMinimumWidth(280);
+    m_remark->setMinimumWidth(280);
+    m_gridLayout->addWidget(m_nameLabel, 0, 0, 1, 1, Qt::AlignRight);
+    m_gridLayout->addWidget(m_name, 0, 1, 1, 1, Qt::AlignLeft);
+    m_gridLayout->addWidget(m_remarkLabel, 1, 0, 1, 1, Qt::AlignRight | Qt::AlignTop);
+    m_gridLayout->addWidget(m_remark, 1, 1, 1, 1, Qt::AlignLeft);
+
+    m_btnLayout->addStretch();
+    m_btnLayout->addWidget(m_confirm);
+    m_btnLayout->addSpacing(20);
+    m_btnLayout->addWidget(m_cancel);
+}
+
+void EditNodeWidget::connectSignalsAndSlots()
+{
+    connect(m_name, &LineEdit::textChanged, this, &EditNodeWidget::slotEditChanged);
+    connect(m_remark, &TextEdit::textChanged, this, &EditNodeWidget::slotEditChanged);
+    connect(m_confirm, &PushButton::clicked, this, &EditNodeWidget::slotConfirmCLicked);
+    connect(m_cancel, &PushButton::clicked, this, &EditNodeWidget::slotConcelClicked);
+}
+
+void EditNodeWidget::slotEditChanged()
+{
+    m_confirm->setEnabled(true);
+    m_node.name   = m_name->text();
+    m_node.remark = m_remark->toPlainText();
+}
+
+void EditNodeWidget::slotConfirmCLicked()
+{
+    emit sigSaveNode(m_node);
+    close();
+}
+
+void EditNodeWidget::slotConcelClicked()
+{
+    close();
+}

+ 44 - 1
QFD/widgets/EditNodeWidget.h

@@ -5,18 +5,61 @@
 
 #include <CNode.h>
 
+class LineEdit;
+class PushButton;
+class TextEdit;
+
+class QLabel;
+class QVBoxLayout;
+class QHBoxLayout;
+class QGridLayout;
+
+/**
+ * @brief The EditNodeWidget class
+ * 编辑节点
+ */
 class EditNodeWidget : public QDialog
 {
     Q_OBJECT
 public:
-    EditNodeWidget(CNodeData n, QWidget *parent = nullptr);
+    EditNodeWidget(QWidget *parent = nullptr);
 
     CNodeData node() const;
 
     void setNode(CNodeData n);
 
+    void initWindow();
+
+    void initWidgets();
+
+    void initLayout();
+
+    void connectSignalsAndSlots();
+
+public slots:
+
+    void slotEditChanged();
+    void slotConfirmCLicked();
+    void slotConcelClicked();
+
+signals:
+    void sigSaveNode(CNodeData n);
+
 private:
     CNodeData m_node;
+
+    QLabel *m_nameLabel = nullptr;
+    LineEdit *m_name    = nullptr;
+
+    QLabel *m_remarkLabel = nullptr;
+    TextEdit *m_remark    = nullptr;
+
+    PushButton *m_confirm = nullptr;
+    PushButton *m_cancel  = nullptr;
+
+    QVBoxLayout *m_layout     = nullptr;
+    QGridLayout *m_gridLayout = nullptr;
+    QHBoxLayout *m_btnLayout  = nullptr;
 };
 
 #endif  // EDITNODEWIDGET_H

+ 19 - 1
QFD/widgets/IndexSystemWidget.cpp

@@ -1,5 +1,7 @@
 #include "IndexSystemWidget.h"
 
+#include "EditNodeWidget.h"
+
 #include <dbService/ClassSet.h>
 #include <dbService/CNodeDataService.h>
 
@@ -73,13 +75,17 @@ void IndexSystemWidget::setupTabWidget()
     }
 }
 
-void IndexSystemWidget::initWidgets() { }
+void IndexSystemWidget::initWidgets()
+{
+    m_editNode = new EditNodeWidget(this);
+}
 
 void IndexSystemWidget::initLayout() { }
 
 void IndexSystemWidget::connectSignalsAndSlots()
 {
     connect(m_tab, &QTabWidget::currentChanged, this, &IndexSystemWidget::slotTabCurrentChanged);
+    connect(m_editNode, &EditNodeWidget::sigSaveNode, this, &IndexSystemWidget::slotNodeEdited);
 }
 
 void IndexSystemWidget::addNode(CNodeData node)
@@ -118,6 +124,8 @@ void IndexSystemWidget::slotCreateRootNode()
 void IndexSystemWidget::slotEditNode(CNodeData n)
 {
     qDebug() << __FUNCTION__ << __LINE__ << n.name << endl;
+    m_editNode->setNode(n);
+    m_editNode->show();
 }
 
 void IndexSystemWidget::slotAddSubNode(int pNumber)
@@ -141,3 +149,13 @@ void IndexSystemWidget::slotRemoveNode(int id)
 {
     CNodeDataService().DeleteCNodeDataById(id);
 }
+
+void IndexSystemWidget::slotNodeEdited(CNodeData node)
+{
+    // 在弹窗中编辑节点后, 先保存数据库, 再更新界面
+    bool ret = CNodeDataService().UpdateCNodeData(node);
+    if (ret) {
+        CMindView *m = (CMindView *)m_tab->currentWidget();
+        m->updateNode(node);
+    }
+}

+ 5 - 0
QFD/widgets/IndexSystemWidget.h

@@ -7,6 +7,8 @@
 
 class CMindView;
 
+class EditNodeWidget;
+
 /**
  * @brief The IndexSystemWidget class
  * 指标体系
@@ -49,7 +51,10 @@ public slots:
 
     void slotRemoveNode(int id);
 
+    void slotNodeEdited(CNodeData node);
+
 private:
+    EditNodeWidget *m_editNode = nullptr;
 };
 
 #endif  // INDEXSYSTEMWIDGET_H