#include "targetlistwgt.h" #include #include #include #include #include #include #include #include #include #include #include "../DockTitleBar.h" #include "../DockWidget.h" #include #include "common/SpdLogger.h" #include "workspace/WorkSpace.h" #include "workspace/Timestep.h" #include "workspace/WorkSpaceManager.h" TargetListWgt::TargetListWgt(QWidget * parent) : QWidget(parent) { ui.setupUi(this); setWindowTitle(QString::fromLocal8Bit("数据列表")); setWindowFlags(/*Qt::FramelessWindowHint | */Qt::Window); m_nCurTabPage = 0; m_nBoundaryWth = 4; QHeaderView* horizontalHeader = ui.tableWidget->horizontalHeader(); QColor headerColor = QColor(100, 100, 100); // 灰色 horizontalHeader->setStyleSheet(QString("QHeaderView::section {background-color: %1;}").arg(headerColor.name())); horizontalHeader->setStretchLastSection(true); InitWgt(); ui.lineEdit->setText("1"); ui.lineEdit_2->setText("1"); ui.spinBox_2->setValue(1); connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, this, &TargetListWgt::OnWorkSpaceChanged); } TargetListWgt::~TargetListWgt() { } void TargetListWgt::AttachDock(DockWidget* dockWidget) { if (nullptr == dockWidget) { qDebug() << __FUNCTION__ << "dockwidget is nullptr"; return; } if (nullptr != dockWidget) { m_titleText = dockWidget->windowTitle(); } dockWidget->SetDockWidgetTitleBar(nullptr); dockWidget->setWidget(this); DockTitleBar* dockTitleBar = new DockTitleBar; m_pDockTitleBar = dockTitleBar; if (m_titleText.isEmpty()) { dockTitleBar->SetTitle(tr("Data Table")); } else { dockTitleBar->SetTitle(m_titleText); } dockWidget->SetDockWidgetTitleBar(dockTitleBar); } void TargetListWgt::SetHeader(const QStringList& headerLabels) { ui.tableWidget->clear(); ui.tableWidget->setColumnCount(headerLabels.size()); ui.tableWidget->setHorizontalHeaderLabels(headerLabels); } void TargetListWgt::AddRowData(QVariant& var) { if (!var.isValid()) { return; } if (var.type() != QVariant::List) { return; } QVariantList varRowList = var.toList(); if (varRowList.size() < ui.tableWidget->columnCount()) { return; } m_varRowDataList.push_back(var); UpdatePageNum(); int nCurPage = ui.lineEdit->text().toInt(); UpdatePageData(nCurPage); } void TargetListWgt::InitFile(const QString& strFile, int iBatchCount) { if (strFile.isEmpty()) { return; } m_iBatchCount = iBatchCount; m_strFile = strFile; m_vecReportPoint.clear(); bool bRet = ParseReport(strFile, m_vecReportPoint, m_iBatchCount); if (nullptr != m_pDockTitleBar && bRet) { QFileInfo fileInfo(strFile); m_pDockTitleBar->SetTitle(tr("%1 -- %2").arg(m_titleText).arg(fileInfo.fileName())); } UpdateTable(1); UpdatePageNum(); UpdatePageData(1); } void TargetListWgt::InitWgt() { ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui.tableWidget->setContextMenuPolicy(Qt::CustomContextMenu); //UpdateButtonEnable(); connect(ui.toolButton, SIGNAL(clicked()), this, SLOT(slotForwardPage())); connect(ui.toolButton_2, SIGNAL(clicked()), this, SLOT(slotNextPage())); connect(ui.spinBox, SIGNAL(valueChanged(int)), this, SLOT(slotRowCountChanged(int))); // 行数改变 connect(ui.spinBox_2, SIGNAL(valueChanged(int)), this, SLOT(slotSelPage(int))); // 跳转 connect(ui.tableWidget, SIGNAL( itemDoubleClicked (QTableWidgetItem *)), this, SLOT(slotDoubleClickedItem(QTableWidgetItem *))); connect(ui.tableWidget, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(slotClickedItem(QTableWidgetItem *))); connect(ui.tableWidget->horizontalHeader(),SIGNAL(sectionClicked(int)), this, SLOT(slotSortTabCol(int))); } bool TargetListWgt::ParseReport(const QString& strFile, std::vector>>& vecReportPoint, int iRowCount) { if (strFile.isEmpty()) { QMessageBox::information(nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请检查数据Report文件路径!")); return false; } QFile file(strFile); if (file.open(QIODevice::ReadOnly)) { int iRow = 1; std::vector> batch; while (!file.atEnd()) { QString strLine = file.readLine().simplified(); if (!strLine.isEmpty()) { QStringList listLine = strLine.split(" "); std::vector vecLine; for (size_t i = 0; i < listLine.size(); i++) { vecLine.push_back(listLine[i].toFloat()); } batch.push_back(vecLine); } // 批次 if (iRow % iRowCount == 0) { vecReportPoint.push_back(batch); batch.clear(); } iRow++; } file.close(); } return true; } void TargetListWgt::slotSortTabCol(int nCol) { QHeaderView *pSender = (QHeaderView *)(sender()); QTableWidget *pParen = (QTableWidget *)(pSender->parent()); pParen->sortItems(nCol, Qt::DescendingOrder); //pParen->sortItems(nCol, Qt::AscendingOrder); } void TargetListWgt::slotForwardPage() { int nCurPage = ui.lineEdit->text().toInt(); if (nCurPage == 1) { return; } nCurPage -= 1; ui.lineEdit->setText(QString::number(nCurPage)); UpdatePageData(nCurPage); } void TargetListWgt::slotNextPage() { // 当前tab页显示的数据页数 int nCurPage = ui.lineEdit->text().toInt(); int iPageCount = ui.lineEdit_2->text().toInt(); if (nCurPage == iPageCount) { return; } nCurPage += 1; // 下一页 ui.lineEdit->setText(QString::number(nCurPage)); UpdatePageData(nCurPage); } void TargetListWgt::OnWorkSpaceChanged(WorkSpace* worksapce) { if (worksapce == nullptr) { LOG_ERROR("worksapce is nullptr"); return; } connect(worksapce, &WorkSpace::TimestepChanged, this, &TargetListWgt::OnTimestepChanged); Timestep* timestep = worksapce->GetTimestep(); if (nullptr != timestep) { InitFile(worksapce->GetReportPath(), timestep->GetSteps().size()); } } void TargetListWgt::OnTimestepChanged(Timestep* timestep) { if (timestep == nullptr) { LOG_ERROR("timestep is nullptr"); return; } connect(timestep, SIGNAL(TimeChanged(double)), this, SLOT(slotUpdateTime(double))); auto worksapce = timestep->GetWorkSpace(); if (nullptr != worksapce) { InitFile(worksapce->GetReportPath(), timestep->GetSteps().size()); } } void TargetListWgt::slotTimeChanged(double dTime) { UpdateTable(dTime); UpdatePageData(1); } void TargetListWgt::slotDoubleClickedItem(QTableWidgetItem *pItem) { QTableWidget *pSender = (QTableWidget *)sender(); } void TargetListWgt::slotClickedItem(QTableWidgetItem *pItem) { QTableWidget *pSender = (QTableWidget *)sender(); } void TargetListWgt::timerEvent(QTimerEvent *event) { } void TargetListWgt::UpdateTable(int iTime) { if (iTime < 1) { return; } if ((iTime - 1) >= m_vecReportPoint.size()) { return; } m_varRowDataList.clear(); if (iTime-1 < m_vecReportPoint.size()) { std::vector> batch = m_vecReportPoint[iTime-1]; ui.tableWidget->setRowCount(0); for (int i = 0; i < batch.size(); i++) { ui.tableWidget->insertRow(i); std::vector rowData = batch[i]; QVariantList varRow; for (int j = 0; j < ui.tableWidget->columnCount(); j++) { if (rowData.size() > j) { varRow.push_back(rowData[j]); } } m_varRowDataList.push_back(varRow); } } } void TargetListWgt::UpdatePageNum() { m_nPageShowLineNum = ui.spinBox->value(); // 每页显示的行数 int iPageCount = 1; int iDataCount = m_varRowDataList.size(); if (iDataCount > m_nPageShowLineNum) { iPageCount = m_varRowDataList.size() / m_nPageShowLineNum; if (m_varRowDataList.size() % m_nPageShowLineNum > 0) { iPageCount++; } } ui.spinBox_2->setRange(1, iPageCount); ui.lineEdit_2->setText(QString::number(iPageCount)); } void TargetListWgt::UpdateButtonEnable() { m_nPageShowLineNum = ui.spinBox->value(); // 每页显示的行数 // 当前tab页显示的数据页数 int nCurPage = 1; if (1 == nCurPage) // 首页 { ui.toolButton->setDisabled(true); // 前一页按钮 } else { ui.toolButton->setDisabled(false); // 前一页按钮 } // 总页数 int nPageCount = 1; if (nCurPage == nPageCount) // 最后一页 { ui.toolButton_2->setDisabled(true); // 后一页按钮 } else { ui.toolButton_2->setDisabled(false); // 后一页按钮 } // 当前页码数 ui.lineEdit->setText(QString::number(nCurPage)); // 总页码数 ui.lineEdit_2->setText(QString::number(nPageCount)); // 设置页码数范围 ui.spinBox_2->setRange(1,nPageCount); ui.spinBox_2->setValue(nCurPage); } void TargetListWgt::UpdatePageData(int iPageNum) { m_nPageShowLineNum = ui.spinBox->value(); // 每页显示的行数 int iIndex = (iPageNum-1) * m_nPageShowLineNum; // 每页显示的行数 int iEndIndex = iIndex + m_nPageShowLineNum; if (iEndIndex > m_varRowDataList.size()) { iEndIndex = m_varRowDataList.size(); } while (ui.tableWidget->rowCount() > 0) { ui.tableWidget->removeRow(0); } int iRow = 0; for (; iIndex < iEndIndex; iIndex++) { QVariantList varColList = m_varRowDataList[iIndex].toList(); ui.tableWidget->insertRow(iRow); for (int iCol = 0; iCol < varColList.size(); iCol++) { QString strVal; strVal.sprintf("%.6f", varColList[iCol].toFloat()); ui.tableWidget->setItem(iRow, iCol, new QTableWidgetItem(strVal)); } iRow++; } }