#include "settingnum.h" #include "spdlog.h" #include "ui_settingnum.h" #include #include #include #include "customcombobox.h" #include "onesettingitem.h" #include "oneshadow.h" #include "ListItem.h" #include "TipWidget.h" SettingNum::SettingNum(QDialog *parent) : QDialog(parent), ui(new Ui::SettingNum) { ui->setupUi(this); m_logger = spdlog::get("EyeMap"); if(m_logger == nullptr) { qDebug() << "获取 EyeMap logger 失败"; return; } /* 注册事件过滤,主要是消除滚轮对comboBox的影响 */ ui->comboBox_rowNum->installEventFilter(this); ui->comboBox_columnNum->installEventFilter(this); /* 设置无边框和背景透明 */ this->setWindowFlags(Qt::FramelessWindowHint); this->setAttribute(Qt::WA_TranslucentBackground); ui->label_warn->hide(); /* 加载QSS */ QFile fileQss(":/qss/SettingNum/SettingNum.qss"); if(fileQss.open(QFile::ReadOnly)) { QString qss = fileQss.readAll(); this->setStyleSheet(qss); fileQss.close(); } else { SPDLOG_LOGGER_ERROR(m_logger, "加载QSS文件失败"); } /* 设置QListWidget拖拽 */ ui->listWidget->setDragDropMode(QAbstractItemView::InternalMove); ui->listWidget->setDragEnabled(true); ui->listWidget->setDropIndicatorShown(true); ui->listWidget->setAcceptDrops(true); ui->listWidget->setSelectionMode(QAbstractItemView::SingleSelection); /* 注册事件过滤器,拦截拖拽事件 */ // ui->listWidget->installEventFilter(this); /* 初始化变量 */ for(auto& item : m_listItem) { item = nullptr; } // ui->pBtn_close->move(ui->widget_top->width() - 40, 13); /* 设置下拉框可选个数 */ QStringList listRow; listRow << "1" << "2" << "3" << "4"; ui->comboBox_rowNum->addItems(listRow); ui->comboBox_columnNum->addItem("1"); ui->comboBox_columnNum->addItem("2"); ui->comboBox_rowNum->setCurrentIndex(1); ui->comboBox_columnNum->setCurrentIndex(1); connect(ui->pBtn_close, &QPushButton::clicked, this, &SettingNum::do_pBtn_close); connect(ui->pBtn_ok, &QPushButton::clicked, this, &SettingNum::do_pBtn_ok); connect(ui->pBtn_cancel, &QPushButton::clicked, this, &SettingNum::do_pBtn_cancel); connect(ui->comboBox_rowNum, QOverload::of(&QComboBox::currentIndexChanged), this, &SettingNum::do_selectRowAndColumn); connect(ui->comboBox_columnNum, QOverload::of(&QComboBox::currentIndexChanged), this, &SettingNum::do_selectRowAndColumn); connect(this, &SettingNum::signal_exec, this, &SettingNum::do_layoutItem); connect(ui->listWidget, &ListItem::signal_dropComplete, this, &SettingNum::do_setItemNum); } SettingNum::~SettingNum() { for(auto item : m_listItem) { if(item == nullptr) { continue; } delete item; item = nullptr; } delete ui; } /* 设置行数和列数 */ void SettingNum::setRowAndColumn(int row, int column) { ui->comboBox_rowNum->setCurrentIndex(row - 1); ui->comboBox_columnNum->setCurrentIndex(column - 1); /* 根据 行 x 列 总数计算需要显示的个数 */ m_row = row; m_column = column; int num = row * column; ui->listWidget->clear(); m_listItem.clear(); for(int i = 1; i <= num; i++) { OneSettingItem *item = new OneSettingItem(ui->listWidget); item->setNum(i); connect(item, &OneSettingItem::signal_select_channel, this, &SettingNum::do_selectChannel); m_listItem.append(item); /* 创建QListWidget的项和项高度,根据编号是否显示,放置到ListWidget中 */ QListWidgetItem *listWidgetItem = new QListWidgetItem(ui->listWidget); listWidgetItem->setSizeHint(QSize(0, 48)); ui->listWidget->setItemWidget(listWidgetItem, item); } /* 移动item的位置 */ // layoutItem(num); } /* 设置每个项的信息 */ void SettingNum::setEveryEyeMapInfo(const QList &listInfo) { for(auto &item : m_listItem) { for(auto &info : listInfo) { if(item->getNum() == info.num) { // SPDLOG_LOGGER_DEBUG(m_logger, "序号:{}, 设置项信息: {}", info.num, info.channelInfo.channelName.toStdString()); item->setItemInfo(info); break; } } } } /* 设置可用的通道信息 */ void SettingNum::setChannelList(const QList &listChannelInfo) { for(auto &item : m_listItem) { item->setChannelList(listChannelInfo); } m_listChannelInfo = listChannelInfo; } /* 刷新布局 */ void SettingNum::refreshLayout() { layoutItem(m_row * m_column); } /* 事件过滤器 */ bool SettingNum::eventFilter(QObject *watched, QEvent *event) { if(watched == ui->comboBox_rowNum || watched == ui->comboBox_columnNum) { if(event->type() == QEvent::Wheel) { return true; } } return QWidget::eventFilter(watched, event); } /* 显示事件 */ void SettingNum::showEvent(QShowEvent *event) { QDialog::showEvent(event); /* 在这个页面显示出来后再设置一次项隐藏才可以 */ emit signal_exec(); } /* 鼠标点击事件 */ void SettingNum::mousePressEvent(QMouseEvent *event) { m_lastPos = event->globalPos(); event->accept(); } /* 鼠标移动事件 */ void SettingNum::mouseMoveEvent(QMouseEvent *event) { auto point = ui->widget_top->mapToGlobal(QPoint(0, 0)); QRect rect(point, ui->widget_top->size()); if(!rect.contains(m_lastPos)) { event->accept(); return; } int dx = event->globalX() - m_lastPos.x(); int dy = event->globalY() - m_lastPos.y(); this->move(this->x() + dx, this->y() + dy); m_lastPos = event->globalPos(); event->accept(); } /* 鼠标释放事件 */ void SettingNum::mouseReleaseEvent(QMouseEvent *event) { event->accept(); } /* 关闭按钮槽函数 */ void SettingNum::do_pBtn_close() { this->close(); } /* 点击了OK按钮 */ void SettingNum::do_pBtn_ok() { /* 取消所有的报警 */ for(auto& it : m_listItem) { it->setChannelNameAlarm(false); it->setChannelSelectAlarm(false); } ui->label_warn->hide(); /* 检查通道选择 */ bool isExit = false; for(auto& it : m_listItem) { if(it->getCurrentChannel().channel == OscChnNum::Osc_None) { // ui->label_warn->setText("请选择示波器通道"); // ui->label_warn->show(); TipWidget::display(TipWidget::OPERATOR_FAIL, "请选择示波器通道", m_parent); it->setChannelSelectAlarm(true); isExit = true; } } if(isExit) { return; } /* 检查自定义的通道名称是否存在,名字是否冲突 */ for(int i = 0; i < m_listItem.size(); i++) { /* 判断通道名称是否为空 */ if(m_listItem.at(i)->getEyeMapInfo().title.isEmpty()) { m_listItem.at(i)->setChannelNameAlarm(true); // ui->label_warn->setText("通道名称不能为空!"); // ui->label_warn->show(); TipWidget::display(TipWidget::OPERATOR_FAIL, "通道名称不能为空", m_parent); return; } for(int j = i + 1; j < m_listItem.size(); j++) { /* 判断通道名称是否重复 */ if(m_listItem.at(i)->getEyeMapInfo().title == m_listItem.at(j)->getEyeMapInfo().title) { m_listItem.at(i)->setChannelNameAlarm(true); m_listItem.at(j)->setChannelNameAlarm(true); // ui->label_warn->setText("通道名称不能重复!"); // ui->label_warn->show(); TipWidget::display(TipWidget::OPERATOR_FAIL, "通道名称不能重复", m_parent); return; } } } isOk = true; m_row = ui->comboBox_rowNum->currentText().toInt(); m_column = ui->comboBox_columnNum->currentText().toInt(); /* 先将所有的眼图模块的序号设置为0 */ GEyeMapInfo.clearAllNum(); /* 更新全局信息 */ for(auto &item : m_listItem) { // SPDLOG_LOGGER_DEBUG(m_logger, "序号: {}, 通道号: {}", item->getNum(), item->getCurrentChannel().channelName.toStdString()); GEyeMapInfo.updateSettingNum(item->getEyeMapInfo()); } this->close(); } /* 点击了取消按钮 */ void SettingNum::do_pBtn_cancel() { isOk = false; this->close(); } /* 选择行和列槽函数 */ void SettingNum::do_selectRowAndColumn(int index) { // SPDLOG_LOGGER_DEBUG(m_logger, "选择了行和列"); m_row = ui->comboBox_rowNum->currentText().toInt(); m_column = ui->comboBox_columnNum->currentText().toInt(); int num = m_row * m_column; // layoutItem(num); showOrHide(num); } /* 通道选择槽函数,选择了一个通道,取消其他项可能已经选择的相同通道 */ void SettingNum::do_selectChannel(const OscChnNum channel, const QString &channelName) { auto sender = qobject_cast(QObject::sender()); for(auto item : m_listItem) { if((item->getCurrentChannel().channel == channel) && (item != sender)) { // item->setCurrentChannel(GEyeMapInfo.getChannelName(OscChnNum::Osc_None)); item->setCurrentChannel(OscChnNum::Osc_None); } } } /* 刷新listWidget */ void SettingNum::do_layoutItem() { layoutItem(m_row * m_column); } /* 重新设置序号并刷新显示 */ void SettingNum::do_setItemNum() { // SPDLOG_LOGGER_DEBUG(m_logger, "重新设置序号"); resetItemNum(); /* 打印listWidget和序号 */ for(int i = 0; i < ui->listWidget->count(); i++) { auto item = qobject_cast(ui->listWidget->itemWidget(ui->listWidget->item(i))); SPDLOG_LOGGER_DEBUG(m_logger, "序号: {}, 通道: {}", item->getNum(), item->getCurrentChannel().channelName.toStdString()); } } /** * @brief 布局item * * @param num 需要显示的几个item */ void SettingNum::layoutItem(int num) { for(auto item : m_listItem) { // auto dy = (item->getNum() - 1) * 48; // item->move(0, dy); if(item->getNum() > num) { item->hide(); } else { item->show(); } } } /* 重新设置Item序号 */ void SettingNum::resetItemNum() { for(int i = 0; i < ui->listWidget->count(); i++) { auto item = qobject_cast(ui->listWidget->itemWidget(ui->listWidget->item(i))); item->setNum(i + 1); } } /* 显示或隐藏选项 */ void SettingNum::showOrHide(int num) { if(num > m_listItem.size()) { for(int i = m_listItem.size(); i < num; i++) { OneSettingItem *item = new OneSettingItem(ui->listWidget); item->setNum(i + 1); /* 设置可选通道列表 */ item->setChannelList(m_listChannelInfo); /* 设置默认选项 */ item->setItemInfo(GEyeMapInfo.getOneEyeMapInfo(i + 1)); connect(item, &OneSettingItem::signal_select_channel, this, &SettingNum::do_selectChannel); m_listItem.append(item); /* 创建QListWidget的项和项高度 */ QListWidgetItem *listWidgetItem = new QListWidgetItem(ui->listWidget); listWidgetItem->setSizeHint(QSize(0, 48)); ui->listWidget->setItemWidget(listWidgetItem, item); } } else { for(int i = m_listItem.size() - 1; i >= num; i--) { ui->listWidget->takeItem(i); for(auto& it : m_listItem) { if(it->getNum() == i + 1) { auto widget = it; m_listItem.removeOne(it); delete widget; break; } } } } }