// ***************************************************************************** // 版权所有(C)2023~2099 上海骄成超声波技术有限公司 // 保留所有权利 // ***************************************************************************** // 作者 : 杨坚 // 版本 : 1.0 // 功能说明: // // ***************************************************************************** #include "ShowTemperaturePage.h" #include "ShowTemperatureWnd.h" #include "ShowTemperatureListNumberWnd.h" #include "Src/RewriteControl/JListWidget.h" #include "QTimer" ShowTemperaturePage::ShowTemperaturePage(QWidget *parent) : QWidget(parent) { ui.setupUi(this); ui.addValBut->hide(); QTimer::singleShot(800, this, [&]() { Init(); }); } ShowTemperaturePage::~ShowTemperaturePage() {} void ShowTemperaturePage::Init() { // 排序 auto Fun = [&](QListWidget* p) { // 1. 创建一个临时的 vector 来保存重新排序的数据 std::vector tempVector(m_vecTemperatureListPage.size()); // 2. 遍历 listWidget,根据当前 listWidget 的顺序将数据复制到 tempVector for (int i = 0; i < p->count(); ++i) { QString itemText = p->item(i)->text(); // 在原始 dataVector 中找到该 itemText 对应的索引 //auto it = std::find(m_vecTemperatureListPage.begin(), m_vecTemperatureListPage.end(), itemText); //if (it != m_vecTemperatureListPage.end()) //{ // int index = std::distance(m_vecTemperatureListPage.begin(), it); // //tempVector[i] = m_vecTemperatureListPage[index]; // 使用原始数据 vector 中的值,避免引用问题 //} } // 3. 将 tempVector 赋值回 dataVector,完成排序 m_vecTemperatureListPage = tempVector; }; // 拖拽关联 //connect(ui.SerialNumberList, &JListWidget::itemsReordered, [&]() // { // Fun(ui.SerialNumberList); // // 先清空 // ui.showlist->clear(); // for (int i = 0; i < m_vecTemperatureListPage.size(); i++) // { // AddListItem(m_vecTemperatureListPage[i], // i, ui.SerialNumberList, QSize(370, 48)); // } //}); connect(ui.SerialNumberList, &QListWidget::itemSelectionChanged, [&]() { bool isDel = false; QListWidgetItem* selectedItem = ui.SerialNumberList->currentItem(); if (selectedItem) { int row = ui.SerialNumberList->row(selectedItem); if (m_isDel) { if (m_row == row) { isDel = true; } } else { row = m_row; std::vector vecTemperatureList = m_vecTemperatureListPage; if (vecTemperatureList.size() > 0 && vecTemperatureList.size() >= row) { // 更改 if (ui.showlist->count() > 0) { // 表示有的情况 ShowTemperatureWnd* pShow = qobject_cast(ui.showlist->itemWidget(ui.showlist->item(0))); //pShow->SetTemperaturePar(vecTemperatureList[row], row); } else { AddListItem(vecTemperatureList[row], 0, ui.showlist, QSize(370, 393)); } /*m_row = row;*/ } else { isDel = true; } /*m_row = row;*/ } } else { isDel = true; } if (isDel) { if (ui.showlist->count() > 0) { DeleteSelectedItem(-1, ui.showlist); } } }); m_manageDB = ns_db::CManageDB::GetInstance(); if (m_manageDB == nullptr) return; m_pProduct = m_manageDB->GetCProduct(); if (m_pProduct == nullptr) return; UpTemperList(-1); setStyleSheet( //"QWidget { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #F1F4FD, stop: 1 #E5E4F6); }" "QDoubleSpinBox { background: #FFFFFF; border: 1px solid #BABBDC; border-radius: 6px; padding: 2px 5px; }" "QSpinBox { background: #FFFFFF; border: 1px solid #BABBDC; border-radius: 6px; padding: 2px 5px; }" "QLineEdit { background: #FFFFFF; border: 1px solid #BABBDC; border-radius: 6px; padding: 2px 5px; }" "QCheckBox::indicator { width: 20px; height: 20px; }" "QCheckBox::indicator:unchecked { background-color: #FFFFFF; border-radius: 2px; }" "QComboBox { background: #FFFFFF; border: 1px solid #BABBDC; border-radius: 6px; padding: 2px 5px; }" "QComboBox::drop-down { width: 20px; }" "QPushButton { background: #D0D0E8; border: 1px solid #BABBDC; border-radius: 6px; padding: 2px 5px; }" // Button background color "QPushButton:hover { background-color: #B0B0D8; }" // Lighter color on hover "QPushButton:pressed { background-color: #A0A0C8; }" // Darker color on press ); } //void ShowTemperaturePage::AddTemperList(const ns_db::TEMPERATURE_LIST_STRUCT& temperaturePar, int nIndex) //{ // ShowTemperatureWnd* pWnd = new ShowTemperatureWnd(this); // pWnd->SetTemperaturePar(temperaturePar, nIndex); // connect(pWnd, &ShowTemperatureWnd::SendDelTemperatureListSingals, this, // &ShowTemperaturePage::GetDelTemperatureListSlots); // // connect(pWnd, &ShowTemperatureWnd::SendAddTemperatureListSingals, this, // &ShowTemperaturePage::GetAddTemperatureListSlots); // // connect(pWnd, &ShowTemperatureWnd::SendModifyTemperatureListSingals, this, // &ShowTemperaturePage::GetModifyTemperatureListSlots); // // QListWidgetItem *item = new QListWidgetItem(); // item->setSizeHint(QSize(370, 393)); // ui.showlist->addItem(item); // ui.showlist->setItemWidget(item, pWnd); //} // //void ShowTemperaturePage::AddListNumberList(const ns_db::TEMPERATURE_LIST_STRUCT& temperaturePar, int nIndex) //{ // ShowTemperatureListNumberWnd* pWnd = new ShowTemperatureListNumberWnd(this); // connect(pWnd, &ShowTemperatureListNumberWnd::SendDelTemperatureListSingals, this, // &ShowTemperaturePage::GetDelTemperatureListSlots); // // connect(pWnd, &ShowTemperatureListNumberWnd::SendAddTemperatureListSingals, this, // &ShowTemperaturePage::GetAddTemperatureListSlots); // // connect(pWnd, &ShowTemperatureListNumberWnd::SendModifyTemperatureListSingals, this, // &ShowTemperaturePage::GetModifyTemperatureListSlots); // // pWnd->SetTemperaturePar(temperaturePar, nIndex); // QListWidgetItem* item = new QListWidgetItem(); // item->setSizeHint(QSize(370, 48)); // ui.SerialNumberList->addItem(item); // ui.SerialNumberList->setItemWidget(item, pWnd); //} template void ShowTemperaturePage::AddListItem(const ns_db::TEMPERATURE_LIST_STRUCT& temperaturePar, int nIndex, QListWidget* listWidget, const QSize& sizeHint) { Y* pWnd = new Y(this); connect(pWnd, &Y::SendDelTemperatureListSingals, this, &ShowTemperaturePage::GetDelTemperatureListSlots); connect(pWnd, &Y::SendAddTemperatureListSingals, this, &ShowTemperaturePage::GetAddTemperatureListSlots); connect(pWnd, &Y::SendModifyTemperatureListSingals, this, &ShowTemperaturePage::GetModifyTemperatureListSlots); // pWnd->SetTemperaturePar(temperaturePar, nIndex); QListWidgetItem* item = new QListWidgetItem(); item->setSizeHint(sizeHint); listWidget->addItem(item); listWidget->setItemWidget(item, pWnd); } void ShowTemperaturePage::UpTemperList(int nID) { ui.showlist->clear(); ui.SerialNumberList->clear(); std::vector vecTemperatureList = m_pProduct->GetAllTemperatureList(); if (vecTemperatureList.size() <= 0) { for (int i = 0; i < 11; i++) { ns_db::TEMPERATURE_LIST_STRUCT _a = {}; _a.iId = i; _a.iId = i + 1; vecTemperatureList.push_back(_a); } } if (nID == -1) { m_nInit = true; // 不能直接用0, 找不到? nID = vecTemperatureList.size() > 0 ? vecTemperatureList[0].iId : 0; ui.idListComboBox->clear(); } else { m_nInit = false; } int nAdd = 0; int nNumb = 0; for (const auto a : vecTemperatureList) { if (nID == a.iId) { m_vecTemperatureListPage.push_back(a); AddListItem(a, nAdd, ui.showlist, QSize(370, 393)); //AddListItem(a, nAdd, // ui.SerialNumberList, QSize(370, 48)); nAdd++; } if (m_nInit) { ui.idListComboBox->addItem(QString::number(nNumb)); nNumb++; } } if (ui.showlist->count() > 0) { ui.showlist->item(0)->setSelected(true); } m_row = 0; AddListItem(vecTemperatureList[0], 0, ui.SerialNumberList, QSize(370, 48)); if (m_nInit) { m_nInit = false; } } void ShowTemperaturePage::DeleteSelectedItem(int nIndex, QListWidget* pListWidget /*= nullptr*/) { bool isDel = false; for (int i = 0; i < pListWidget->count(); ++i) { QListWidgetItem* item = pListWidget->item(i); if (item) { ShowTemperatureListNumberWnd* customWidget = qobject_cast(pListWidget->itemWidget(item)); if (customWidget) { if (customWidget->m_nIndex == nIndex || nIndex == -1) { QListWidgetItem* itemToRemove = pListWidget->takeItem(i); if (customWidget) { delete customWidget; customWidget = nullptr; } if (itemToRemove) { delete itemToRemove; itemToRemove = nullptr; } isDel = true; break; } } else { if (item) { QListWidgetItem* itemToRemove = pListWidget->takeItem(i); delete itemToRemove; itemToRemove = nullptr; isDel = true; } } } } if (isDel) { //没写好, /* std::rotate(m_vecTemperatureListPage.begin() + nIndex, m_vecTemperatureListPage.begin() + nIndex + 1, m_vecTemperatureListPage.end()); m_vecTemperatureListPage.pop_back();*/ } // 如果不行用后面的逻辑 /*if (pListWidget->count() >= nIndex) { QListWidgetItem* selectedItem = pListWidget->item(nIndex); if (selectedItem) { int row = pListWidget->row(selectedItem); QWidget* customWidget = pListWidget->itemWidget(selectedItem); QListWidgetItem* itemToRemove = pListWidget->takeItem(row); if (customWidget) { delete customWidget; customWidget = nullptr; } if (itemToRemove) { delete itemToRemove; itemToRemove = nullptr; } } }*/ } void ShowTemperaturePage::GetDelTemperatureListSlots(int iId, int nIndex) { m_isDel = true; //if (ui.SerialNumberList->count() == 1) //{ // // 至少保留一个吧 //} //else //{ // DeleteSelectedItem(nIndex, ui.SerialNumberList); //} DeleteSelectedItem(nIndex, ui.SerialNumberList); if (nIndex == m_row) { if (ui.showlist->count() > 0) { DeleteSelectedItem(-1, ui.showlist); } } m_pProduct->DeleteTemperatureList(nIndex); m_isDel = false; } void ShowTemperaturePage::GetAddTemperatureListSlots(const ns_db::TEMPERATURE_LIST_STRUCT& temperaturePar) { m_pProduct->AddTemperatureList(temperaturePar); } void ShowTemperaturePage::GetModifyTemperatureListSlots(const ns_db::TEMPERATURE_LIST_STRUCT& temperaturePar) { m_pProduct->ModifyTemperatureList(temperaturePar.iId, temperaturePar); } void ShowTemperaturePage::on_idListComboBox_currentIndexChanged(int index) { if (!m_nInit) //初始化,重复切换 { UpTemperList(index); } } QVector ShowTemperaturePage::findMissingNumbers(QListWidget* listWidget, int expectedMax) { QSet existingNumbers; // 步骤 1: 获取 QListWidget 中所有项的数字值 for (int i = 0; i < listWidget->count(); ++i) { QListWidgetItem* item = listWidget->item(i); ShowTemperatureListNumberWnd* customWidget = qobject_cast(listWidget->itemWidget(item)); existingNumbers.insert(customWidget->m_nIndex); } QVector missingNumbers; for (int i = 1; i <= expectedMax; ++i) { if (!existingNumbers.contains(i)) { missingNumbers.append(i); } } return missingNumbers; } void ShowTemperaturePage::on_addBut_clicked() { if (m_pProduct) { //int nAdd = ui.SerialNumberList->count(); QVector index = findMissingNumbers(ui.SerialNumberList, 80); if (m_vecTemperatureListPage.size() > 0) { ShowTemperatureListNumberWnd* pW = qobject_cast(ui.SerialNumberList->itemWidget(ui.showlist->item(0))); ns_db::TEMPERATURE_LIST_STRUCT temperaturePar = m_vecTemperatureListPage[0]; temperaturePar.iSerialNumber += 1; m_vecTemperatureListPage.push_back(temperaturePar); AddListItem(temperaturePar, index[0], ui.SerialNumberList, QSize(370, 48)); } else { int nAdd = 0; if (index.size() > 0) { nAdd = index[0]; } ns_db::TEMPERATURE_LIST_STRUCT temperaturePar = {}; //temperaturePar.iId = 1; temperaturePar.iSerialNumber += 1; m_vecTemperatureListPage.push_back(temperaturePar); //添加一个空白 AddListItem(temperaturePar, nAdd, ui.SerialNumberList, QSize(370, 48)); } } } void ShowTemperaturePage::on_addValBut_clicked() { if (m_pProduct) { int nAdd = ui.showlist->count(); if (nAdd > 0) { ShowTemperatureWnd* pW = qobject_cast(ui.showlist->itemWidget(ui.showlist->item(0))); AddListItem(pW->GetVal(), nAdd++, ui.showlist, QSize(370, 393)); } } }