123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 |
- #include "settingnum.h"
- #include "spdlog.h"
- #include "ui_settingnum.h"
- #include <QDebug>
- #include <QFile>
- #include <QPainter>
- #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<int>::of(&QComboBox::currentIndexChanged), this, &SettingNum::do_selectRowAndColumn);
- connect(ui->comboBox_columnNum, QOverload<int>::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<OneEyeMapInfo> &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<OneChannelInfo> &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<OneSettingItem*>(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<OneSettingItem*>(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<OneSettingItem*>(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;
- }
- }
- }
- }
- }
|