Quellcode durchsuchen

V1.3.6
1、完成了导入和导出模版的UI页面

Apple vor 2 Monaten
Ursprung
Commit
b7464384aa

+ 9 - 2
SwitchOnOff.sql

@@ -30,6 +30,12 @@ SELECT EP."TemplateName", EP.ChannelID
 FROM tExecPlanTemplate AS EP
 GROUP BY EP."TemplateName", EP."ChannelID";
 
+#获取某个频率的模版名称
+SELECT EP."TemplateName", EP.ChannelID
+FROM tExecPlanTemplate AS EP
+WHERE EP.ChannelID = :channelID
+GROUP BY EP."TemplateName", EP."ChannelID";
+
 
 #通过模板名称获取模板数据
 SELECT *
@@ -41,8 +47,8 @@ INSERT INTO "tExecPlanTemplate" ("TemplateName", "ChannelID", "OnWeekDay", "OnDa
 VALUES ('模版1', '2', '1', '2025-02-09', '09:00:00', '1', '2025-02-09', '09:00:01');
 
 #插入数据,使用参数
-INSERT INTO "tExecPlanTemplate" ("TemplateName", "ChannelID", "OnWeekDay", "OnDate", "OnTime", "OffWeekDay", "OffDate", "OffTime")
-VALUES (:templateName, :channelID, :onWeekDay, :onDate, :onTime, :offWeekDay, :offDate, :offTime);
+INSERT INTO "tExecPlanTemplate" ("TemplateName", "ChannelID", "ChannelName", "OnWeekDay", "OnDate", "OnTime", "OffWeekDay", "OffDate", "OffTime")
+VALUES (:templateName, :channelID, :channelName, :onWeekDay, :onDate, :onTime, :offWeekDay, :offDate, :offTime);
 
 
 #删除表格中的所有数据
@@ -79,6 +85,7 @@ CREATE TABLE IF NOT EXISTS "EQM_CESHI"."tExecPlanTemplate"
 (
     "TemplateName" VARCHAR(255) NOT NULL,
     "ChannelID" INT NOT NULL,
+    "ChannelName" VARCHAR(255),
     "OnWeekDay" INT NOT NULL,
     "OnDate" VARCHAR(255) NOT NULL,
     "OnTime" VARCHAR(255) NOT NULL,

+ 10 - 0
TransmitterSwitch/ExecPlanData/PlanData.cpp

@@ -58,6 +58,16 @@ void PlanData::clearAllPlanItem()
     }
 }
 
+/* 清空所有卡片选中状态 */
+void PlanData::clearAllSelectedCard()
+{
+    for(auto& it : m_mapPlanCard)
+    {
+        it->setSelected(false);
+    }
+    m_currentFrequencyID = 0;
+}
+
 /* 查找卡片 */
 PlanCard* PlanData::findPlanCard(int channelID)
 {

+ 3 - 0
TransmitterSwitch/ExecPlanData/PlanData.h

@@ -29,6 +29,9 @@ public:
     void clearOnePlanItem(int channelID);
     /* 清空所有的计划 */
     void clearAllPlanItem();
+    /* 清空所有卡片选中状态 */
+    void clearAllSelectedCard();
+    
 
     /* 查找卡片 */
     PlanCard* findPlanCard(int channelID);

+ 3 - 0
TransmitterSwitch/ExecPlanData/plancard.h

@@ -98,6 +98,9 @@ public:
     int getSelectedRow() const;
     PlanInfo getSelectedPlan();
 
+    /* 获取计划是否为空 */
+    bool isPlanEmpty() const { return m_isSpace; }
+
     /* 设置自身被选中 */
     void setSelected(bool isSelected);
     /* 自身被点击了,给外部调用,发送点击信号 */

+ 16 - 14
TransmitterSwitch/Resource/QSS/dark/importtemplate.qss

@@ -106,29 +106,25 @@ QPushButton#pBtn_ok:hover
 
 QTableWidget
 {
-    background: green;
+    background: transparent;
     padding-left: 16px;
     border: 0px solid #E6E9F4;
     text-align: left;
 }
 
-QHeaderView
+/* 设置标题栏,如果不生效,可能是在UI里面设置了样式表,导致冲突了 */
+QTableWidget QHeaderView
 {
-    background: red;
+    background: transparent;
 }
 
-/* 标题栏 */
-QHeaderView::section {
+QTableWidget QHeaderView::section
+{
     background: transparent;
-
+    padding-left: 16px;
     font-weight: 500;
     font-size: 14px;
     color: #D2D2D2;
-    line-height: 22px;
-    text-align: left;
-    font-style: normal;
-
-    padding-left: 16px;
     
     border: 0px solid #E6E9F4;
     border-top: 1px solid rgba(255,255,255,0.15);
@@ -136,10 +132,9 @@ QHeaderView::section {
 }
 
 
-
 QTableWidget::item
 {
-    padding-left: 12px;
+    padding-left: 16px;
     padding-right: 0px;
     padding-top: 0px;
     padding-bottom: 0px;
@@ -154,7 +149,14 @@ QTableWidget::item
 QTableWidget::item:selected
 {
     color: #EBEBEB;
-    /* background: rgba(231,236,255,0.5); */
     background: #438EFF;
 }
 
+/* QCheckBox::indicator
+{
+    width: 16px;
+    height: 16px;
+    border-radius: 4px;
+    background: #B3C0E7;
+} */
+

+ 9 - 8
TransmitterSwitch/Resource/QSS/dark/savetotemplate.qss

@@ -1,9 +1,7 @@
 QWidget
 {
-    background: #FFFFFF;
-    border-radius: 8px;
-    /* font-family: 思源黑体R; */
-    /* font-weight: 400; */
+    background: transparent;
+    
     font-size: 14px;
     color: #D2D2D2;
     line-height: 21px;
@@ -14,16 +12,19 @@ QWidget
 
 QWidget#widget
 {
-    background-color: #313539;
+    background: #464649;
+    border-radius: 8px 8px 8px 8px;
 }
 
 QWidget#widget_Top
 {
-    background: rgba(108,105,124,0.2);
-    border-top-left-radius: 10px;
-    border-top-right-radius: 10px;
+    background: transparent;
+    border-top-left-radius: 8px;
+    border-top-right-radius: 8px;
     border-bottom-left-radius: 0px;
     border-bottom-right-radius: 0px;
+
+    border-bottom: 1px solid rgba(255,255,255,0.15);
 }
 
 QLabel#label_title

+ 88 - 90
TransmitterSwitch/Template/importtemplate.cpp

@@ -13,6 +13,7 @@
 #include "OneShadowEffect.h"
 #include "TransmitterSwitchInfo.h"
 #include "UIStyleManager.h"
+#include "template.h"
 
 ImportTemplate::ImportTemplate(QWidget *parent) :
     QDialog(parent),
@@ -41,19 +42,19 @@ ImportTemplate::ImportTemplate(QWidget *parent) :
     QStringList headerList;
     headerList << "频率名称" << "模版名称" << "选择";
     ui->tableWidget->setHorizontalHeaderLabels(headerList);
+    ui->tableWidget->horizontalHeader()->setSectionsClickable(false);
+    ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
+
     /* 设置列表头高度 */
     ui->tableWidget->horizontalHeader()->setDefaultSectionSize(40);
-    /* 设置列宽间距 */
-    ui->tableWidget->setColumnWidth(0, 274);
-    ui->tableWidget->setColumnWidth(1, 274);
-    ui->tableWidget->setColumnWidth(2, 88);
+    /* 设置列宽间距,在显示事件中设置 */
     /* 设置列宽度固定 */
     ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
     ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
     ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Fixed);
 
     //设置行高
-    ui->tableWidget->verticalHeader()->setDefaultSectionSize(48);
+    ui->tableWidget->verticalHeader()->setDefaultSectionSize(40);
     
     //设置不可编辑
     ui->tableWidget->setEditTriggers(QTableWidget::NoEditTriggers);
@@ -61,8 +62,6 @@ ImportTemplate::ImportTemplate(QWidget *parent) :
     ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
     //设置只能选中一行
     ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
-    //隐藏竖滚动条
-    // ui->tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
     //隐藏横滚动条
     ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
     //隐藏网格线
@@ -79,33 +78,10 @@ ImportTemplate::ImportTemplate(QWidget *parent) :
     connect(ui->pBtn_close,SIGNAL(clicked()),this,SLOT(close()));
     connect(ui->pBtn_cancel,SIGNAL(clicked()),this,SLOT(close()));
     connect(ui->pBtn_ok,SIGNAL(clicked()),this,SLOT(do_ok()));
-    connect(ui->tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(do_seletctRow(int,int)));
-    connect(&EPUIStyle, &UIStyleManager::signal_qssChanged, this, &ImportTemplate::do_setUIStyle);
-
-
-    /* 取出当前可用的模版,主要是区分正常日和特殊日 */
-    // QStringList list;
-    // for(auto begin = tabList.begin(); begin != tabList.end(); begin++)
-    // {
-    //     // LH_WRITE_LOG_DEBUG(QString("模版名称:%1, 类型:%2").arg(begin.key()).arg(begin.value()));
-    //     if(begin.value() != m_type)
-    //     {
-    //         continue;
-    //     }
-    //     list.append(begin.key());
-    // }
-    // /* 先设置表格的行数 */
-    // ui->tableWidget->setRowCount(list.count());
-    // for(int i = 0;i < list.count();i++)
-    // {
-    //     createRow(i, i + 1, list.at(i));
-    // }
 
     /* 注册事件过滤器 */
     ui->pBtn_close->installEventFilter(this);
 
-    /* 设置默认的皮肤 */
-    do_setUIStyle();
 }
 
 ImportTemplate::~ImportTemplate()
@@ -115,77 +91,73 @@ ImportTemplate::~ImportTemplate()
 
 void ImportTemplate::do_ok()
 {
-    
+    /* 获取已选中的模版列表 */
+    for(auto it : m_listCheckBox)
+    {
+        if(it->isChecked())
+        {
+            auto chnID = it->property(m_propertyChnID.c_str()).toInt();
+            auto tmpName = it->property(m_propertytmpName.c_str()).toString();
+            OneTemplateInfo info;
+            info.channelInfo.ChannelID = chnID;
+            info.templateName = tmpName;
+            m_listTemplate.append(info);
+        }
+    }
+
+
     m_isOk = true;
     emit signal_templateName(m_templateName);
     this->close();
 }
 
-/* 选中一行 */
-void ImportTemplate::do_seletctRow(int row, int col)
+/* 点击了一个checkBox,取消其他同频率的checkBox */
+void ImportTemplate::do_checkBox_stateChanged(int state)
 {
-    if(col == 2)
+    if(state != Qt::Checked)
     {
-        /* 弹出框提示确定要删除 */
-        std::shared_ptr<Warning> w = std::make_shared<Warning>(this);
-        w->setQSS(EPUIStyle.getQSSPath());
-        w->setText("是否删除模板?");
-        bool flag = false;
-        connect(w.get(), &Warning::signal_ok,this,[&](){
-            flag = true;
-        });
-
-        w->exec();
-        if(!flag)
-        {
-            return;
-        }
-        emit signal_deleteTemplate(ui->tableWidget->item(row,1)->text());
-        /* 删除一行 */
-        ui->tableWidget->removeRow(row);
-        // LH_WRITE_LOG_DEBUG(QString("剩余模版个数:%1").arg(ui->tableWidget->rowCount()));
-        /* 对模版重新编号 */
-        for(int i = 0 ;i < ui->tableWidget->rowCount();i++)
+        return;
+    }
+    auto checkBox = qobject_cast<QCheckBox*>(sender());
+    if(checkBox == nullptr)
+    {
+        return;
+    }
+    auto chnID = checkBox->property(m_propertyChnID.c_str()).toInt();
+    /* 取消其他同频率的checkBox */
+    for(auto it : m_listCheckBox)
+    {
+        if(it != checkBox && it->property(m_propertyChnID.c_str()).toInt() == chnID)
         {
-            ui->tableWidget->item(i,0)->setData(Qt::DisplayRole, i+1);
+            it->setChecked(false);
         }
-        /* 强制重新绘制表格 */
-        ui->tableWidget->repaint();
-    }else
-    {
-        m_templateName = ui->tableWidget->item(row,1)->text();
     }
 }
 
-/* 设置样式表 */
-void ImportTemplate::do_setUIStyle()
+/* 显示事件 */
+void ImportTemplate::showEvent(QShowEvent *event)
 {
-    setQSSPath(EPUIStyle.getQSSPath());
+    /* 设置列宽度 */
+    int width = (ui->tableWidget->width() - 88) / 2;
+    ui->tableWidget->setColumnWidth(0, width);
+    ui->tableWidget->setColumnWidth(1, width);
+    ui->tableWidget->setColumnWidth(3, 88);
 }
 
 
-/* 创建一行数据 */
-void ImportTemplate::createRow(int row,int num,const QString &text)
+/* 设置模版列表 */
+void ImportTemplate::setTemplateList(const QMultiMap<int, OneTemplateInfo>& mapTemplate)
 {
-    /* 获取亮色还是暗色 */
-    bool isDark = (EPUIStyle.getUIStyle() == enum_UIStyle::UI_Dark ? true : false);
-
-    QTableWidgetItem* item = new QTableWidgetItem;
-    item->setData(Qt::DisplayRole,num);
-    ui->tableWidget->setItem(row,0,item);
-
-    item = new QTableWidgetItem(text);
-    ui->tableWidget->setItem(row,1,item);
-
-    item = new QTableWidgetItem("删除");
-    // item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
-    if(isDark)
+    for(auto it = mapTemplate.begin(), end = mapTemplate.end(); it != end; it++)
     {
-        item->setForeground(QColor(95, 158, 255));
-    }else {
-        item->setForeground(Qt::blue);
+        createRow(it.value());
     }
-    ui->tableWidget->setItem(row,2,item);
+}
+
+/* 获取选中的模板列表 */
+QList<OneTemplateInfo>& ImportTemplate::getSelectedTemplateList()
+{
+    return m_listTemplate;
 }
 
 /* 设置QSS */
@@ -205,16 +177,42 @@ void ImportTemplate::setQSSPath(const QString& qssPath)
     }else 
     {
         LH_WRITE_ERROR(QString("Open %1 failed").arg(qssFile));
-    }   
+    }
+
+    // if(EPUIStyle.getUIStyle() == enum_UIStyle::UI_Dark)
+    // {
+    //     /* 手动设置表头的qss */
+    //     ui->tableWidget->horizontalHeader()->setStyleSheet(m_qssHeaderView_dark);
+    // }else {
+    //     ui->tableWidget->horizontalHeader()->setStyleSheet(m_qssHeaderView_dark);
+    // }
 }
 
-/* 绘画事件 */
-// void ImportTemplate::paintEvent(QPaintEvent *event)
-// {
-//     QPainter painter(this);
-//     painter.setRenderHint(QPainter::Antialiasing);
-//     painter.drawImage(QPoint(0, 0), m_shadow->image());
-// }
+
+
+/* 添加一行 */
+void ImportTemplate::createRow(const OneTemplateInfo& info)
+{
+    /* 设置表格的行数 */
+    int row = ui->tableWidget->rowCount();
+    ui->tableWidget->setRowCount(row + 1);
+    /* 设置行高 */
+    ui->tableWidget->setRowHeight(row, 40);
+
+    QTableWidgetItem* item0 = new QTableWidgetItem(info.channelInfo.ChannelName);
+    // item->setData(Qt::DisplayRole, info.channelInfo.ChannelName);
+    QTableWidgetItem* item1 = new QTableWidgetItem(info.templateName);
+    ui->tableWidget->setItem(row, 0, item0);
+    ui->tableWidget->setItem(row, 1, item1);
+    auto checkBox = new QCheckBox();
+    checkBox->setProperty(m_propertyChnID.c_str(), info.channelInfo.ChannelID);
+    checkBox->setProperty(m_propertytmpName.c_str(), info.templateName);
+    /* 连接信号和槽 */
+    connect(checkBox, &QCheckBox::stateChanged, this, &ImportTemplate::do_checkBox_stateChanged);
+    ui->tableWidget->setCellWidget(row, 2, checkBox);
+
+    m_listCheckBox.append(checkBox);
+}
 
 /* 事件过滤器 */
 bool ImportTemplate::eventFilter(QObject *watched, QEvent *event)

+ 25 - 14
TransmitterSwitch/Template/importtemplate.h

@@ -2,9 +2,11 @@
 #define IMPORTTEMPLATE_H
 
 #include <QDialog>
+#include <QCheckBox>
 
 class TemplateItem;
 class OneShadow;
+class OneTemplateInfo;
 
 namespace Ui {
 class ImportTemplate;
@@ -18,32 +20,37 @@ public:
     explicit ImportTemplate(QWidget *parent = nullptr);
     ~ImportTemplate();
 
-    void createRow(int row,int num,const QString& text);                    /* 创建一行数据 */
+    
 
     /* 是否点下了OK */
     bool isOk() const { return m_isOk; }
     /* 获取选择的模板名称 */
     QString getTemplateName() const { return m_templateName; }
 
+    /* 设置模版列表 */
+    void setTemplateList(const QMultiMap<int, OneTemplateInfo>& mapTemplate);
+    /* 获取选中的模板列表 */
+    QList<OneTemplateInfo>& getSelectedTemplateList();
+
     /* 设置QSS */
     void setQSSPath(const QString& qssPath);
     
 signals:
     /* 选择一个模版 */
     void signal_templateName(QString name);
-    /* 删除一个模版 */
-    void signal_deleteTemplate(QString name);
+
+private:
+    /* 添加一行 */
+    void createRow(const OneTemplateInfo& info);
 
 private slots:
     void do_ok();
-    /* 选中一行 */
-    void do_seletctRow(int row,int col);
-    /* 设置样式表 */
-    void do_setUIStyle();
+    /* 点击了一个checkBox,取消其他同频率的checkBox */
+    void do_checkBox_stateChanged(int state);
 
 protected:
-    /* 绘画事件 */
-    // void paintEvent(QPaintEvent *event) override;
+    /* 显示事件 */
+    void showEvent(QShowEvent *event) override;
     /* 事件过滤器 */
     bool eventFilter(QObject *watched, QEvent *event) override;
     /* 鼠标点击事件 */
@@ -56,12 +63,16 @@ protected:
 private:
     Ui::ImportTemplate *ui;
 
-    bool m_isOk = false;                                                    /* 是否点下了OK */
-    QString m_templateName;                                                 /* 模版名称 */
-    int m_type = -1;                                                        /* 模版类型 */
-    // OneShadow* m_shadow = nullptr;                                          /* 阴影 */
+    bool m_isOk = false;                                /* 是否点下了OK */
+    QString m_templateName;                             /* 模版名称 */
+    int m_type = -1;                                    /* 模版类型 */
+
+    QPoint m_lastPos;                                   /* 鼠标点击的位置 */
+    const std::string m_propertyChnID = "ChannelID";    /* 属性名称 */
+    const std::string m_propertytmpName = "TemplateName";/* 属性名称 */
 
-    QPoint m_lastPos;                       /* 鼠标点击的位置 */
+    QList<QCheckBox*> m_listCheckBox;                  /* checkBox列表 */
+    QList<OneTemplateInfo> m_listTemplate;              /* 模版列表 */
 };
 
 #endif // IMPORTTEMPLATE_H

+ 1 - 3
TransmitterSwitch/Template/importtemplate.ui

@@ -14,9 +14,7 @@
    <string>Dialog</string>
   </property>
   <property name="styleSheet">
-   <string notr="true">QDialog#ImportTemplate{
-background:transparent;
-}</string>
+   <string notr="true"/>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <property name="spacing">

+ 13 - 37
TransmitterSwitch/Template/savetotemplate.cpp

@@ -6,7 +6,6 @@
 #include <QPainter>
 #include <QMouseEvent>
 
-// #include "lhstylemanager.h"
 #include "LHQLogAPI.h"
 #include "OneShadowEffect.h"
 
@@ -21,14 +20,6 @@ SaveToTemplate::SaveToTemplate(QWidget *parent) :
     /* 设置底层样式表 */
     this->setAttribute(Qt::WA_TranslucentBackground);
 
-    /* 加载样式表 */
-    // QFile file(":/QSS/QSS/savetotemplate_light.qss");
-    // if(file.open(QFile::ReadOnly))
-    // {
-    //     QString styleSheet = file.readAll();
-    //     this->setStyleSheet(styleSheet);
-    //     file.close();
-    // }
     /* 创建阴影,这里大小使用最外面的大小减去阴影宽度 */
     QSize size = this->size();
     size.setWidth(size.width() - 32);
@@ -37,7 +28,7 @@ SaveToTemplate::SaveToTemplate(QWidget *parent) :
     auto pShadow = new OneShadowEffect(this);
     this->setGraphicsEffect(pShadow);
 
-    m_templateNameList.clear();
+    m_list.clear();
 
     ui->label_warn->hide();
 
@@ -57,11 +48,6 @@ SaveToTemplate::~SaveToTemplate()
     delete ui;
 }
 
-/* 设置周几 */
-void SaveToTemplate::setWeekDay(int weekDay)
-{
-    m_weekDay = weekDay;
-}
 
 /* 传入计划项是否为空 */
 void SaveToTemplate::setItemEmpty(bool flag)
@@ -71,19 +57,9 @@ void SaveToTemplate::setItemEmpty(bool flag)
 
 
 /* 传入所有的模板名称,会进行判断,只传入相同类型的模板名称 */
-void SaveToTemplate::setTemplateName(const QMap<QString, int> list, int type)
+void SaveToTemplate::setTemplateList(QList<OneTemplateInfo>& list)
 {
-    // m_templateNameList.clear();
-    // for(auto begin = list.begin(); begin != list.end(); begin++)
-    // {
-    //     if(begin.value() != type)
-    //     {
-    //         continue;
-    //     }
-    //     m_templateNameList.insert(begin.key(), begin.value());
-    // }
-
-    m_templateNameList = list;
+    m_list = list;
     // for(auto begin = m_templateNameList.begin(), end = m_templateNameList.end(); begin != end; ++begin)
     // {
     //     LH_WRITE_LOG_DEBUG(QString("模板名称:%1, 类型:%2").arg(begin.key()).arg(begin.value()));
@@ -119,14 +95,14 @@ void SaveToTemplate::do_ok()
     m_templateName.clear();
     ui->label_warn->hide();
     setWarning(false);
-    /* 检查这一页的项是否为空 */
-    if(m_itemEmpty)
-    {
-        ui->label_warn->setText("当前页没有计划项!");
-        ui->label_warn->show();
-        setWarning(true);
-        return;
-    }
+    /* 检查这一页的项是否为空,不用再这里检查了,在外面检查完成了 */
+    // if(m_itemEmpty)
+    // {
+    //     ui->label_warn->setText("当前页没有计划项!");
+    //     ui->label_warn->show();
+    //     setWarning(true);
+    //     return;
+    // }
 
     /* 检查名称是否是空的 */
     m_templateName = ui->lineEdit->text();
@@ -139,9 +115,9 @@ void SaveToTemplate::do_ok()
     }
     /* 检查模板名称是否重复 */
     bool flag = false;
-    for(auto begin = m_templateNameList.begin(), end = m_templateNameList.end(); begin != end; ++begin)
+    for(auto begin = m_list.begin(), end = m_list.end(); begin != end; ++begin)
     {
-        if(begin.key() == m_templateName)
+        if(begin->templateName == m_templateName)
         {
             flag = true;
             break;

+ 4 - 5
TransmitterSwitch/Template/savetotemplate.h

@@ -5,6 +5,8 @@
 #include <qchar.h>
 #include <QMap>
 
+#include "TransmitterSwitchInfo.h"
+
 class OneShadow;
 
 namespace Ui {
@@ -21,12 +23,10 @@ public:
     explicit SaveToTemplate(QWidget *parent = nullptr);
     ~SaveToTemplate();
 
-    /* 设置周几 */
-    void setWeekDay(int weekDay);
     /* 传入计划项是否为空 */
     void setItemEmpty(bool flag);
     /* 传入所有的模板名称 */
-    void setTemplateName(const QMap<QString, int> list, int type);
+    void setTemplateList(QList<OneTemplateInfo>& list);
 
     /* 获取是否点击了确定 */
     bool isOk() { return m_isOk; }
@@ -62,11 +62,10 @@ private:
 
     bool m_itemEmpty;                       /* 计划项是否为空 */
     int m_weekDay;                          /* 周几 */
-    QMap<QString, int> m_templateNameList;         /* 所有的模板名称 */
+    QList<OneTemplateInfo> m_list;
 
     bool m_isOk = false;                    /* 是否点击了确定 */
     QString m_templateName;                 /* 模板名称 */
-    // OneShadow* m_shadow = nullptr;          /* 阴影 */
 
     QPoint m_lastPos;                       /* 鼠标点击的位置 */
 };

+ 28 - 0
TransmitterSwitch/Template/template.h

@@ -0,0 +1,28 @@
+#ifndef TEMPLATE_H
+#define TEMPLATE_H
+
+#include <QString>
+
+const QString m_qssHeaderView_dark = R"(
+    QTableWidget QHeaderView
+        {
+            background: transparent;
+        }
+
+        QTableWidget QHeaderView::section
+        {
+            background: transparent;
+            padding-left: 16px;
+            font-weight: 500;
+            font-size: 14px;
+            color: #D2D2D2;
+            
+            border: 0px solid #E6E9F4;
+            border-top: 1px solid rgba(255,255,255,0.15);
+            border-bottom: 1px solid rgba(255,255,255,0.15);
+        }
+    )";
+
+
+
+#endif // TEMPLATE_H

+ 2 - 2
TransmitterSwitch/TransmitterSwitchInfo.cpp

@@ -270,13 +270,13 @@ void MapDevice::deleteDevice(const QString& devName)
     }
 }
 
-TemplateInfo::TemplateInfo(const TemplateInfo& info)
+OneTemplateInfo::OneTemplateInfo(const OneTemplateInfo& info)
 {
     channelInfo = info.channelInfo;
     templateName = info.templateName;
 }
 
-TemplateInfo& TemplateInfo::operator=(const TemplateInfo& info)
+OneTemplateInfo& OneTemplateInfo::operator=(const OneTemplateInfo& info)
 {
     if(this == &info)
         return *this;

+ 4 - 4
TransmitterSwitch/TransmitterSwitchInfo.h

@@ -348,14 +348,14 @@ private:
  * @brief 模版结构体
  * 
  */
-struct TemplateInfo
+struct OneTemplateInfo
 {
     ChannelInfo channelInfo;                /* 频率信息 */
     QString templateName;                   /* 模版名称 */
 
-    TemplateInfo() : channelInfo(), templateName("") {}
-    TemplateInfo(const TemplateInfo& info);
-    TemplateInfo& operator=(const TemplateInfo& info);
+    OneTemplateInfo() : channelInfo(), templateName("") {}
+    OneTemplateInfo(const OneTemplateInfo& info);
+    OneTemplateInfo& operator=(const OneTemplateInfo& info);
 };
 
 

+ 82 - 17
TransmitterSwitch/WebAPI/FromWebAPI.cpp

@@ -127,7 +127,7 @@ bool FromWebAPI::getDeviceInfo(QMap<QString, DeviceInfo>& mapDevice)
             DevInfo.ChannelID = it["chnid"].is_null() ? -1 : it["chnid"].get<int>();
             if(DevInfo.ChannelID <= 0)
             {
-                LH_WRITE_LOG_DEBUG(QString("通道ID错误:%1").arg(DevInfo.ChannelID));
+                // LH_WRITE_LOG_DEBUG(QString("通道ID错误:%1").arg(DevInfo.ChannelID));
                 continue;
             }
 
@@ -135,7 +135,7 @@ bool FromWebAPI::getDeviceInfo(QMap<QString, DeviceInfo>& mapDevice)
             auto devType = DevTypeContainer.getDevType(DevInfo.PTTypeCode);
             if(devType.PTTypeCode < 0)
             {
-                LH_WRITE_LOG_DEBUG(QString("未找到设备类型:%1").arg(DevInfo.PTTypeCode));
+                // LH_WRITE_LOG_DEBUG(QString("未找到设备类型:%1").arg(DevInfo.PTTypeCode));
                 continue;
             }
 
@@ -672,8 +672,8 @@ bool FromWebAPI::getConfigData(QMap<int, ConfigData>& list)
         return false;
     }
     /* 解析获取到的JSON数据 */
-    LH_WRITE_LOG_DEBUG(QString("Ret:%1").arg(ret));
-    LH_WRITE_LOG_DEBUG(strRet);
+    // LH_WRITE_LOG_DEBUG(QString("Ret:%1").arg(ret));
+    // LH_WRITE_LOG_DEBUG(strRet);
     try{
         nJson json1 = nJson::parse(strRet.toStdString());
         int retCode = json1["code"].get<int>();
@@ -849,7 +849,7 @@ bool FromWebAPI::getEQMTemplateID(QList<int>& listId)
 
 
 /* 保存到模板 */
-bool FromWebAPI::saveTemplate(const QString& templateName, const int type, QList<OnePlanItemInfo>& list)
+bool FromWebAPI::saveTemplate(const QString& templateName, QList<OnePlanItemInfo>& list)
 {
     if(m_httpApi == nullptr)
     {
@@ -861,17 +861,19 @@ bool FromWebAPI::saveTemplate(const QString& templateName, const int type, QList
     for(const auto& it : list)
     {
         nJson json1;
-        json1["opName"] = "TMS_ExecPlanSaveToTemplate";
+        json1["opName"] = "TMS_InsertToExecPlanTemplate";
         json1["Key"] = QUuid::createUuid().toString().toStdString();
         nJson json2;
 
-        // json2["templateName"] = templateName.toStdString();
-        // json2["templateType"] = type;
-        // json2["execDate"] = it.dateTime.date().toString("yyyy-MM-dd").toStdString();
-        // json2["execTime"] = it.dateTime.time().toString("hh:mm:ss").toStdString();
-        // json2["deviceName"] = it.devName.toStdString();
-        // json2["actionName"] = it.actionName.toStdString();
-        // json2["actionID"] = static_cast<int>(it.actionID);
+        json2["templateName"] = templateName.toStdString();
+        json2["channelID"] = it.ChannelID;
+        json2["channelName"] = it.ChannelName.toStdString();
+        json2["onWeekDay"] = it.onWeekDay;
+        json2["onDate"] = it.onDateTime.date().toString("yyyy-MM-dd").toStdString();
+        json2["onTime"] = it.onDateTime.time().toString("hh:mm:ss").toStdString();
+        json2["offWeekDay"] = it.offWeekDay;
+        json2["offDate"] = it.offDateTime.date().toString("yyyy-MM-dd").toStdString();
+        json2["offTime"] = it.offDateTime.time().toString("hh:mm:ss").toStdString();
 
         json1["paramList"] = json2;
         json0.push_back(json1);
@@ -891,7 +893,7 @@ bool FromWebAPI::saveTemplate(const QString& templateName, const int type, QList
         LH_WRITE_ERROR(QString("保存到模板失败:%1, 错误信息:%2").arg(ret).arg(m_httpApi->DoGetLastError(&ret)));
         return false;
     }
-    LH_WRITE_LOG("保存到模板成功,模板名称:" + templateName + ", 类型:" + QString::number(type) + ", 计划数目:" + QString::number(list.size()));
+    // LH_WRITE_LOG("保存到模板成功,模板名称:" + templateName + ", 计划数目:" + QString::number(list.size()));
 
     return true;
     
@@ -973,7 +975,7 @@ bool FromWebAPI::getTemplate(QString templateName, QList<OnePlanItemInfo>& list)
 }
 
 /* 获取模板列表 */
-bool FromWebAPI::getTemplateList(QMultiMap<int, TemplateInfo>& mapTemplate)
+bool FromWebAPI::getTemplateList(QMultiMap<int, OneTemplateInfo>& mapTemplate)
 {
     if(m_httpApi == nullptr)
     {
@@ -992,7 +994,7 @@ bool FromWebAPI::getTemplateList(QMultiMap<int, TemplateInfo>& mapTemplate)
         return false;
     }
     /* 解析获取到的JSON数据 */
-    LH_WRITE_LOG_DEBUG(strRet);
+    // LH_WRITE_LOG_DEBUG(strRet);
     try 
     {
         nJson json1 = nJson::parse(strRet.toStdString());
@@ -1005,7 +1007,7 @@ bool FromWebAPI::getTemplateList(QMultiMap<int, TemplateInfo>& mapTemplate)
         nJson result = json1["result"];
         for(auto& it : result)
         {
-            TemplateInfo info;
+            OneTemplateInfo info;
             info.channelInfo.ChannelID = it["channelID"].get<int>();
             info.templateName = QString::fromStdString(it["templateName"].get<std::string>());
             mapTemplate.insert(info.channelInfo.ChannelID, info);
@@ -1034,6 +1036,69 @@ bool FromWebAPI::getTemplateList(QMultiMap<int, TemplateInfo>& mapTemplate)
     return true;
 }
 
+
+/* 获取某个频率的模版列表 */
+bool FromWebAPI::getTemplateList(int chnID, QList<OneTemplateInfo>& listTemplate)
+{
+    if(m_httpApi == nullptr)
+    {
+        LH_WRITE_ERROR("WebAPI is nullptr");
+        return false;
+    }
+
+    nJson json0;
+    json0["opName"] = "TMS_GetExecPlanOneTemplateList";
+    nJson jsonParam;
+    jsonParam["channelID"] = chnID;
+    json0["paramList"] = jsonParam;
+    /* 发送请求 */
+    QString strCmd = QString::fromStdString(json0.dump());
+    QString strRet;
+    auto ret = m_httpApi->DBDoInterface(enDBOperatorType::EDBOT_Select, strCmd, strRet, true);
+    if(ret != 0)
+    {
+        LH_WRITE_ERROR(QString("获取模板列表失败:%1, 错误信息:%2").arg(ret).arg(m_httpApi->DoGetLastError(&ret)));
+        return false;
+    }
+    /* 解析获取到的JSON数据 */
+    // LH_WRITE_LOG_DEBUG(strRet);
+    try 
+    {
+        nJson json1 = nJson::parse(strRet.toStdString());
+        int retCode = json1["code"].get<int>();
+        if(retCode != 0)
+        {
+            LH_WRITE_ERROR("获取模板列表失败");
+            return false;
+        }
+        nJson result = json1["result"];
+        for(auto& it : result)
+        {
+            OneTemplateInfo info;
+            info.channelInfo.ChannelID = it["channelID"].get<int>();
+            info.templateName = QString::fromStdString(it["templateName"].get<std::string>());
+            listTemplate.append(info);
+        }
+
+    } catch (const nJson::parse_error& e) {
+        LH_WRITE_ERROR(QString("解析模板列表失败:%1").arg(e.what()));
+        return false;
+    }
+    catch (const nJson::exception& e)
+    {
+        LH_WRITE_ERROR(QString("解析模板列表失败:%1").arg(e.what()));
+        return false;
+    }
+    catch(...)
+    {
+        LH_WRITE_ERROR("解析模板列表失败");
+        return false;
+    }
+
+
+    return true;
+}
+
 /* 删除一个模板 */
 bool FromWebAPI::deleteTemplate(const QString& name)
 {

+ 4 - 2
TransmitterSwitch/WebAPI/FromWebAPI.h

@@ -44,11 +44,13 @@ public:
     
 
     /* 保存到模板 */
-    bool saveTemplate(const QString& templateName, const int type, QList<OnePlanItemInfo>& list);
+    bool saveTemplate(const QString& templateName, QList<OnePlanItemInfo>& list);
     /* 获取模板内容 */
     bool getTemplate(QString templateName, QList<OnePlanItemInfo>& list);
     /* 获取模板列表 */
-    bool getTemplateList(QMultiMap<int, TemplateInfo>& mapTemplate);
+    bool getTemplateList(QMultiMap<int, OneTemplateInfo>& mapTemplate);
+    /* 获取某个频率的模版列表 */
+    bool getTemplateList(int chnID, QList<OneTemplateInfo>& listTemplate);
     /* 删除一个模板 */
     bool deleteTemplate(const QString& name);
 

+ 88 - 63
TransmitterSwitch/transmitterswitch.cpp

@@ -142,7 +142,7 @@ void TransmitterSwitch::setWebAPIInfo(const QString &url, const QString &serverI
     }
     m_fromWebAPI->initWebApi(url, serverID, serverKey);
     /* 获取支持的设备 */
-    m_fromWebAPI->getDeviceInfo(DeviceContainer.getMapDevice());
+    // m_fromWebAPI->getDeviceInfo(DeviceContainer.getMapDevice());
     m_fromWebAPI->getChannelInfo(ChnContainer.getMapChannel());
 
     /* 创建获取到的卡片信息 */
@@ -539,17 +539,47 @@ void TransmitterSwitch::do_pBtnClearPlan()
 /* 导入数据 */
 void TransmitterSwitch::do_importData()
 {
-    /* 获取模版列表 */
-    QMultiMap<int, TemplateInfo> tabList;
-    if(!m_fromWebAPI->getTemplateList(tabList))
+    QMultiMap<int, OneTemplateInfo> tabList;
+    /* 判断有没有选中卡片 */
+    auto pCard = PData.getCurrentPlanCard();
+    bool isSuccess = true;
+    if(pCard == nullptr)
+    {
+        /* 没有选中卡片,获取全部的频率 */
+        if(!m_fromWebAPI->getTemplateList(tabList))
+        {
+            isSuccess = false;
+        }
+    }else {
+        /* 选中了卡片,只获取这个卡片的频率列表 */
+        QList<OneTemplateInfo> list;
+        if(m_fromWebAPI->getTemplateList(pCard->getChannelInfo().ChannelID, list))
+        {
+            for(auto it = list.begin(), end = list.end(); it != end; it++)
+            {
+                tabList.insert(it->channelInfo.ChannelID, *it);
+            }
+        }else {
+            isSuccess = false;
+            LH_WRITE_ERROR(QString("获取频率ID为%1的模版列表失败").arg(pCard->getChannelInfo().ChannelID));
+        }
+    }
+
+    if(isSuccess == false)
     {
         TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版列表失败", this);
         return;
     }
-    /* 将模板列表添加频率信息 */
     
-
+    /* 将模板列表添加频率信息 */
+    for(auto it = tabList.begin(), end = tabList.end(); it != end; it++)
+    {
+        auto chnInfo = ChnContainer.getChannel(it->channelInfo.ChannelID);
+        it->channelInfo = chnInfo;
+    }
     std::shared_ptr<ImportTemplate> it = std::make_shared<ImportTemplate>();
+    it->setQSSPath(EPUIStyle.getQSSPath());
+    it->setTemplateList(tabList);
 
     it->exec();
 }
@@ -557,55 +587,52 @@ void TransmitterSwitch::do_importData()
 /* 导出数据 */
 void TransmitterSwitch::do_exportData()
 {
-    // /* 先获取所有的模板名称 */
-    // QMap<QString, int> tabList;
-    // m_fromWebAPI->getTemplateList(tabList);
-    // /* 弹出导出页面 */
-    // std::shared_ptr<SaveToTemplate> stt = std::make_shared<SaveToTemplate>(this);
-    // stt->setQSS(EPUIStyle.getQSSPath());
-    // /* 注册事件过滤器 */
-    // stt->installEventFilter(this);
-    // int weekDay = ui->stackedWidget_items->currentIndex();
-    // /* 设置周几 */
-    // stt->setWeekDay(weekDay);
-    // /* 判断当前页是否有计划 */
-    // if(IData.getOneDay(weekDay)->size() == 0)
-    // {
-    //     stt->setItemEmpty(true);
-    // }else
-    // {
-    //     stt->setItemEmpty(false);
-    // }
-    // /* 判断当前是正常日还是特殊日 */
-    // int type = -1;
-    // if(weekDay < 7 && weekDay >= 0)
-    // {
-    //     type = 0;
-    // }else if(weekDay == 7)
-    // {
-    //     type = 1;
-    // }
-    // /* 获取所有的模板名称,并设置 */
-    // stt->setTemplateName(tabList, type);
-
-    // stt->exec();
-    // if(stt->isOk())
-    // {
-    //     /* 获取一天的数据 */
-    //     auto list = IData.getOneDayExecPlan(weekDay);
-    //     /* 保存到模板 */
-    //     if(m_fromWebAPI->saveTemplate(stt->getTemplateName(), type, list))
-    //     {
-    //         TipWidget::display(TipWidget::OPERATOR_OK, "保存模版成功", this);
-    //     }else {
-    //         TipWidget::display(TipWidget::OPERATOR_FAIL, "保存模版失败", this);
-    //     }
-    //     /* 调用回调函数 */
-    //     if(m_trackCB != nullptr)
-    //     {
-    //         m_trackCB(3, g_mapTrack.value(3));
-    //     }
-    // }
+    /* 先获取选中的卡片 */
+    auto pCard = PData.getCurrentPlanCard();
+    if(pCard == nullptr)
+    {
+        LH_WRITE_ERROR("没有选中频率卡片");
+        TipWidget::display(TipWidget::OPERATOR_WARN, "未选中频率卡片", this);
+        return;
+    }
+    /* 判断该卡片的计划列表是否为空 */
+    if(pCard->isPlanEmpty())
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, "当前频率没有计划", this);
+        return;
+    }
+    int chnID = pCard->getChannelInfo().ChannelID;
+    /* 获取所有的模板名称 */
+    QList<OneTemplateInfo> list;
+    if(!m_fromWebAPI->getTemplateList(chnID, list))
+    {
+        LH_WRITE_ERROR(QString("获取频率ID为%1的模版列表失败").arg(chnID));
+        TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版列表失败", this);
+        return;
+    }
+    /* 弹出导出页面 */
+    std::shared_ptr<SaveToTemplate> stt = std::make_shared<SaveToTemplate>(this);
+    stt->setQSS(EPUIStyle.getQSSPath());
+    stt->setTemplateList(list);
+    stt->exec();
+    if(stt->isOk())
+    {
+        /* 获取一天的数据 */
+        QList<OnePlanItemInfo> listTmp;
+        pCard->getAllPlanInfo(listTmp);
+        /* 保存到模板 */
+        if(m_fromWebAPI->saveTemplate(stt->getTemplateName(), listTmp))
+        {
+            TipWidget::display(TipWidget::OPERATOR_OK, "保存模版成功", this);
+        }else {
+            TipWidget::display(TipWidget::OPERATOR_FAIL, "保存模版失败", this);
+        }
+        /* 调用回调函数 */
+        if(m_trackCB != nullptr)
+        {
+            m_trackCB(3, g_mapTrack.value(3));
+        }
+    }
 }
 
 /* 删除一个模板 */
@@ -664,14 +691,6 @@ void TransmitterSwitch::do_selectFrequencyBtn()
     {
         return;
     }
-    /* 判断是否是“所有频率”按钮 */
-    bool isAllFrequency = false;
-    if(btn != ui->pBtn_allFrequency)
-    {
-        ui->pBtn_allFrequency->setChecked(false);
-    }else {
-        isAllFrequency = true;
-    }
     /* 取消其他按钮的选择 */
     for(auto& it : m_listFrequencyBtn)
     {
@@ -680,13 +699,19 @@ void TransmitterSwitch::do_selectFrequencyBtn()
             it->setChecked(false);
         }
     }
+
     if(btn != ui->pBtn_allFrequency)
     {
+        ui->pBtn_allFrequency->setChecked(false);
         /* 设置当前按钮的选择状态 */
         btn->setChecked(true);
         /* 设置该按钮对应的卡片状态 */
         auto pCard = static_cast<PBtnUserData2*>(btn->userData(m_userData_Btn))->getCard();
         pCard->clickedCard();
+    }else {
+        ui->pBtn_allFrequency->setChecked(true);
+        /* 取消所有的卡片选择状态 */
+        PData.clearAllSelectedCard();
     }
 
     /* 显示当前按钮对应的卡片,隐藏其他卡片 */

+ 3 - 0
show1/widget.cpp

@@ -40,6 +40,9 @@ Widget::Widget(QWidget *parent) :
     InitData initData;
     initData.url = "http://192.1.3.133:31000/v6/";
     initData.serverID = "2e36b53ccd2a433b9a803b98d683ed91";
+
+    // initData.url = "http://192.1.3.136:31000/v6/";
+    // initData.serverID = "2e36b53ccd2a433b9a803b98d683ed91";
     initData.serverKey = "TMS";
 
     m_tSwitch->DoInit(&initData);