#include "plancard.h" #include "ui_plancard.h" #include "UIStyleManager.h" #include "LHQLogAPI.h" /* 重载比较函数 */ bool CSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { /* 先比较是正常日还是特殊日 */ auto leftDay = sourceModel()->data(left, UserRole_WeekDay).toInt(); auto rightDay = sourceModel()->data(right, UserRole_WeekDay).toInt(); if(leftDay != rightDay) { return leftDay < rightDay; /* 比较周几 */ } /* 日期类型相等,再比较时间 */ auto leftTime = sourceModel()->data(left, UserRole_Time).toDateTime(); auto rightTime = sourceModel()->data(right, UserRole_Time).toDateTime(); if(leftDay == static_cast(enum_WeekDay::WeekDay_Special)) { /* 特殊日,比较日期和时间 */ return leftTime < rightTime; }else { /* 正常日,只比较时间 */ return leftTime.time() < rightTime.time(); } } PlanCard::PlanCard(QWidget *parent) : QWidget(parent), ui(new Ui::PlanCard) { ui->setupUi(this); /* 初始化视图模型 */ m_model = new QStandardItemModel(this); m_model->setColumnCount(2); /* 两列 */ m_sortModel = new CSortModel(this); m_sortModel->setSourceModel(m_model); m_sortModel->sort(0, Qt::AscendingOrder); /* 默认升序 */ /* 设置排序数据 */ m_sortModel->setSortRole(QtUserRole::UserRole_Time); /* 设置排序角色 */ ui->tableView->setModel(m_sortModel); /* 设置每列的高度 */ ui->tableView->verticalHeader()->setMinimumHeight(34); ui->tableView->verticalHeader()->setMaximumHeight(34); ui->tableView->verticalHeader()->setDefaultSectionSize(34); /* 设置两列一样宽 */ auto horWidth = ui->tableView->width(); ui->tableView->horizontalHeader()->setDefaultSectionSize(horWidth / 2); /* 连接信号和槽 */ connect(&EPUIStyle, &UIStyleManager::signal_qssChanged, this, &PlanCard::do_setUIStyle); /* 设置默认的皮肤 */ do_setUIStyle(); } PlanCard::~PlanCard() { delete ui; } /* 设置频率信息 */ void PlanCard::setChannelInfo(const ChannelInfo& info) { m_channelInfo = info; /* 设置标题 */ ui->label_title->setText(m_channelInfo.ChannelName); } /* 添加一项 */ void PlanCard::addPlanItem(const enum_WeekDay weekDay, const QDateTime& time, const enum_OnOff onOff) { QString strTime; switch(weekDay) { case enum_WeekDay::WeekDay_Mon: strTime = QString("星期一 %1").arg(time.toString("hh:mm:ss")); break; case enum_WeekDay::WeekDay_Tue: strTime = QString("星期二 %1").arg(time.toString("hh:mm:ss")); break; case enum_WeekDay::WeekDay_Wed: strTime = QString("星期三 %1").arg(time.toString("hh:mm:ss")); break; case enum_WeekDay::WeekDay_Thu: strTime = QString("星期四 %1").arg(time.toString("hh:mm:ss")); break; case enum_WeekDay::WeekDay_Fri: strTime = QString("星期五 %1").arg(time.toString("hh:mm:ss")); break; case enum_WeekDay::WeekDay_Sat: strTime = QString("星期六 %1").arg(time.toString("hh:mm:ss")); break; case enum_WeekDay::WeekDay_Sun: strTime = QString("星期天 %1").arg(time.toString("hh:mm:ss")); break; case enum_WeekDay::WeekDay_Special: strTime = QString("%1").arg(time.toString("yy-MM-dd hh:mm:ss")); break; default: strTime = QString("未知 %1").arg(time.toString("hh:mm:ss")); break; } /* 创建两个项 */ QStandardItem* item = new QStandardItem(); item->setText(strTime); item->setData(static_cast(weekDay), UserRole_WeekDay); /* 设置周几 */ item->setData(time, UserRole_Time); /* 设置时间 */ item->setData(static_cast(onOff), UserRole_OnOff); /* 设置开关状态 */ /* 添加一个项 */ m_model->setRowCount(m_model->rowCount() + 1); /* 添加一行 */ if(onOff == enum_OnOff::On) { m_model->setItem(m_model->rowCount(), 0, item); }else { m_model->setItem(m_model->rowCount(), 1, item); } } /* 取出所有的计划信息 */ void PlanCard::getAllPlanInfo(QList& list) { int rowCount = m_model->rowCount(); for(int i = 0; i < rowCount; i++) { auto item1 = m_model->item(i, 0); auto item2 = m_model->item(i, 1); ExecPlanItemInfo info1; info1.ChannelID = m_channelInfo.ChannelID; info1.WeekDay = static_cast(item1->data(UserRole_WeekDay).toInt()); info1.dateTime = item1->data(UserRole_Time).toDateTime(); info1.actionID = item1->data(UserRole_OnOff).toInt(); info1.actionName = g_ActionName.value(info1.actionID); list.append(info1); ExecPlanItemInfo info2; info2.ChannelID = m_channelInfo.ChannelID; info2.WeekDay = static_cast(item2->data(UserRole_WeekDay).toInt()); info2.dateTime = item2->data(UserRole_Time).toDateTime(); info2.actionID = item2->data(UserRole_OnOff).toInt(); info2.actionName = g_ActionName.value(info2.actionID); list.append(info2); } } /* 设置计划列表 */ void PlanCard::setPlanList(const QList& list) { for(const auto& it : list) { addPlanItem(it.WeekDay, it.dateTime, static_cast(it.actionID)); } } /* 更改UI外观 */ void PlanCard::do_setUIStyle() { this->setStyleSheet(EPUIStyle.StrQSS_PlanCard); }