#include "plancard.h" #include "ui_plancard.h" #include #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); /* 设置去掉标题 */ ui->tableView->horizontalHeader()->setVisible(false); /* 设置空白图片和文字的位置 */ setSpaceImageAndTextRect(); /* 连接信号和槽 */ 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; } /* 创建一个item */ 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); } m_isSpace = false; /* 有数据了 */ } /* 删除一项 */ void PlanCard::deletePlanItem(const enum_WeekDay weekDay, const QDateTime& time, const enum_OnOff onOff) { for(auto& it : m_model->findItems(QString(), Qt::MatchContains, 0)) { auto item = it->data(UserRole_WeekDay).toInt(); if(item == static_cast(weekDay) && it->data(UserRole_Time).toDateTime() == time) { /* 删除该行 */ m_model->removeRow(it->row()); break; } } /* 判断数据有没有空 */ if(m_model->rowCount() == 0) { m_isSpace = true; /* 没有数据了 */ } } /* 取出所有的计划信息 */ 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); /* 打开图片 */ if(EPUIStyle.getUIStyle() == enum_UIStyle::UI_Light) { m_spaceImage = QPixmap(":/ICON/ICON/space_light.png"); }else { m_spaceImage = QPixmap(":/ICON/ICON/space_dark.png"); } } /* 设置空白图片和文字的位置 */ void PlanCard::setSpaceImageAndTextRect() { /* 设置图片大小 */ m_rectSpaceImage.setSize(QSize(108, 87)); /* 设置文本区域大小 */ m_rectSpaceText.setSize(QSize(72, 19)); /* 设置空白图片位置 */ QPoint pointTable = ui->tableView->mapToParent(QPoint(0, 0)); /* 设置空白图片位置,居中显示 */ int x = pointTable.x() + (ui->tableView->width() - m_rectSpaceImage.width()) / 2; int y = pointTable.y() + (ui->tableView->height() - m_rectSpaceImage.height() - m_rectSpaceText.height() - 5) / 2; m_rectSpaceImage.moveTo(x, y); /* 设置空白文字位置 */ x = pointTable.x() + (ui->tableView->width() - m_rectSpaceText.width()) / 2; y = m_rectSpaceImage.y() + m_rectSpaceImage.height() + 5; m_rectSpaceText.moveTo(x, y); } /* 绘制事件 */ void PlanCard::paintEvent(QPaintEvent *event) { if(m_isSpace) { QPainter painter(this); /* 绘制图片 */ painter.drawPixmap(m_rectSpaceImage, m_spaceImage); /* 绘制文字 */ QFont font = painter.font(); font.setPixelSize(12); painter.setFont(font); painter.drawText(m_rectSpaceText, Qt::AlignCenter, "暂无相关信息"); } QWidget::paintEvent(event); } /* 大小缩放事件 */ void PlanCard::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); /* 设置空白图片和文字的位置 */ setSpaceImageAndTextRect(); } /* 显示事件,这里获取到的控件大小信息是正确的 */ void PlanCard::showEvent(QShowEvent *event) { QWidget::showEvent(event); /* 设置空白图片和文字的位置 */ setSpaceImageAndTextRect(); }