#include "mainwindow.h" #include #include "./ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) , thread_read(new threadRead), thread_chart(new ThreadChart),thread_polt(new threadPoltChart){ ui->setupUi(this); this->setWindowTitle("日志查询工具"); // 创建版本号标签 m_versionLabel = new QLabel(tr("v1.1.0"), this); // 将标签添加到状态栏的右端 ui->statusbar->addPermanentWidget(m_versionLabel); connect(thread_read, &threadRead::clearCombo, this, &MainWindow::clearCombo); connect(thread_read, &threadRead::showStatusbar, this, &MainWindow::showStatusbar); connect(thread_read, &threadRead::setBeginTime, this, &MainWindow::setBeginTime); connect(thread_read, &threadRead::setEndTime, this, &MainWindow::setEndTime); connect(thread_read, &threadRead::addCombo, this, &MainWindow::addCombo); connect(thread_read, &threadRead::setProgressBar, this, &MainWindow::setProgressBar); connect(thread_read, &threadRead::closeProg, this, &MainWindow::closeProg); //chart connect(thread_chart, &ThreadChart::newCandS, this, &MainWindow::newCandS); connect(thread_chart, &ThreadChart::appSeries, this, &MainWindow::appSeries); connect(thread_chart, &ThreadChart::setChartView, this, &MainWindow::setChartView); connect(thread_chart, &ThreadChart::setWidget, this, &MainWindow::setWidget); connect(thread_chart, &ThreadChart::setProgressBar, this, &MainWindow::setProgressBar); //plot connect(thread_polt, &threadPoltChart::newCandS, this, &MainWindow::newPlotCandS); connect(thread_polt, &threadPoltChart::appSeries, this, &MainWindow::appSeries); connect(thread_polt, &threadPoltChart::setChartView, this, &MainWindow::setPlotChartView); connect(thread_polt, &threadPoltChart::setWidget, this, &MainWindow::setWidget); connect(thread_polt, &threadPoltChart::setProgressBar, this, &MainWindow::setProgressBar); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_openFileBtn_clicked() { Gloab::fileName = QFileDialog::getOpenFileName(); //打开文件 Gloab::file.setFileName(Gloab::fileName); if (!Gloab::file.open(QIODevice::ReadOnly)) { // 打开失败时弹窗 QString dlgTitle = "错误"; QString strInfo = "文件打开失败"; QMessageBox::warning(this, dlgTitle, strInfo); //退出 return; } //设置进度条 layout = new QVBoxLayout(ui->widget); progressBar = new QProgressBar(ui->widget); layout->addWidget(progressBar); ui->widget->show(); // 获取文件大小 Gloab::fileSize = Gloab::file.size(); Gloab::bytesRead = 0; thread_read->start(); } void MainWindow::clearCombo() { ui->comboBox->clear(); } void MainWindow::showStatusbar(const QString &message) { ui->statusbar->showMessage(message); } void MainWindow::setBeginTime(const QDateTime &begin) { ui->beginTime->setDateTime(begin); } void MainWindow::setEndTime(const QDateTime &begin) { ui->endTime->setDateTime(begin); } void MainWindow::addCombo(const QStringList &list) { ui->comboBox->addItems(list); //根据输入匹配下拉框 Gloab::completer = new QCompleter(list); ui->comboBox->setCompleter(Gloab::completer); } void MainWindow::setProgressBar(int percent) { progressBar->setValue(percent); // qApp->processEvents(); // 更新UI } void MainWindow::closeProg() { layout->deleteLater(); progressBar->deleteLater(); ui->widget->close(); } void MainWindow::newCandS() { chart = new QChart; series = new QLineSeries; // series->setPointsVisible(); } void MainWindow::appSeries(qreal A, qreal B) { series->append(A, B); } void MainWindow::setChartView(int jd, bool isEnum) { // 设置图表标题 chart->setTitle(QString("基带 %1").arg(jd+1)); chart->addSeries(series); if (isEnum) { chart->createDefaultAxes(); // 获取X轴 QList xAxes = chart->axes(Qt::Horizontal); // 断开所有与该轴关联的系列 series->detachAxis(xAxes[0]); // 从图表中移除轴 chart->removeAxis(xAxes[0]); } else { // 创建类别Y轴 QCategoryAxis *axisY = new QCategoryAxis(); for (int var = 1; var < Gloab::rule.size(); ++var) { axisY->append(Gloab::rule[var], var); } //刻度线和刻度的label对齐 axisY->setLabelsPosition(QCategoryAxis::AxisLabelsPositionOnValue); axisY->setRange(0, Gloab::rule.size() + 1); chart->setAxisY(axisY, series); // series->attachAxis(axisY); } // 创建一个时间轴 QDateTimeAxis *axisX = new QDateTimeAxis; axisX->setTickCount(10); axisX->setFormat("HH:mm"); // 设置时间格式 chart->addAxis(axisX, Qt::AlignBottom); series->attachAxis(axisX); // 创建QChartView QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); // 将chartView添加到容器中 Gloab::m_chartViews.append(chartView); } void MainWindow::setWidget() { // 设置布局 int wide = 850; int hight = 600; if (Gloab::m_chartViews.size() > 1) { wide = 1800; } QGridLayout *gridLayout = new QGridLayout(Gloab::widget); for (int i = 0, j = 0; i < Gloab::m_chartViews.size(); i++) { if (i != 0 && i % 2 == 0) { j++; hight += 350; } gridLayout->addWidget(Gloab::m_chartViews[i], j, i - 2 * j); } Gloab::widget->resize(wide, hight); // Gloab::widget->setMaximumHeight(950); Gloab::widget->move(70, 20); Gloab::widget->show(); layout->deleteLater(); progressBar->deleteLater(); ui->widget->close(); } void MainWindow::newPlotCandS() { chart = new QChart; series = new QLineSeries; // series->setPointsVisible(); } void MainWindow::setPlotChartView(int jd, bool isEnum) { // 设置图表标题 chart->setTitle(QString("基带 %1").arg(jd+1)); chart->addSeries(series); if (isEnum) { chart->createDefaultAxes(); } else { //创建默认XY轴 chart->createDefaultAxes(); //删除Y轴 // 获取Y轴 QList yAxes = chart->axes(Qt::Vertical); // 断开所有与该轴关联的系列 series->detachAxis(yAxes[0]); // 从图表中移除轴 chart->removeAxis(yAxes[0]); // 创建类别Y轴 QCategoryAxis *axisY = new QCategoryAxis(); for (int var = 1; var < Gloab::rule.size(); ++var) { axisY->append(Gloab::rule[var], var); } //刻度线和刻度的label对齐 axisY->setLabelsPosition(QCategoryAxis::AxisLabelsPositionOnValue); axisY->setRange(0, Gloab::rule.size() + 1); chart->setAxisY(axisY, series); // plotSeries->attachAxis(axisY); } // 创建QChartView QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); // 将chartView添加到容器中 Gloab::m_chartViews.append(chartView); } void MainWindow::on_lineChart_clicked() { if (Gloab::fileName.isEmpty()) { QMessageBox::warning(this, "警告", "请先打开一个日志"); return; } //关闭打开的窗口 if (Gloab::widget) { Gloab::widget->close(); delete Gloab::widget; Gloab::widget = nullptr; } //获取基带id QVector jd; if (ui->jd1->isChecked()) { jd.append(0); } if (ui->jd2->isChecked()) { jd.append(1); } if (ui->jd3->isChecked()) { jd.append(2); } if (ui->jd4->isChecked()) { jd.append(3); } if (jd.isEmpty()) { QMessageBox::warning(this, "警告", "请至少选择一个基带"); return; } //获取时间 QDateTime beginTime = ui->beginTime->dateTime(); QDateTime endTime = ui->endTime->dateTime(); if (beginTime>endTime) { QMessageBox::warning(this, "警告", "请选择正确的时间段"); return; } //获取参数名 QString dataName = ui->comboBox->currentText(); if (!Gloab::namelist.keys().contains(dataName)) { QMessageBox::warning(this, "警告", "未找到该数据"); return; } //传入数据绘图 thread_chart->setValue(jd, dataName, beginTime, endTime); Gloab::widget = new QWidget(); Gloab::widget->setWindowTitle(dataName); //设置进度条 layout = new QVBoxLayout(ui->widget); progressBar = new QProgressBar(ui->widget); layout->addWidget(progressBar); ui->widget->show(); // 获取文件大小 Gloab::fileSize=0; for (int i = 0; i < jd.size(); ++i) { Gloab::fileSize+=Gloab::g_param[jd[i]].size(); } Gloab::bytesRead = 0; thread_chart->start(); } bool MainWindow::isNumeric(const QString &str) { // 正则表达式匹配数字和可选的正负号 QRegularExpression pattern("^[+-]?([1-9][0-9]*|0)[.]?[0-9]*$"); QRegularExpressionMatch patternMatch = pattern.match(str); // 使用std::regex_match来检查字符串是否完全匹配模式 return patternMatch.hasMatch(); } void MainWindow::on_plotChart_clicked() { if (Gloab::fileName.isEmpty()) { QMessageBox::warning(this, "警告", "请先打开一个日志"); return; } //关闭打开的窗口 if (Gloab::widget) { Gloab::widget->close(); delete Gloab::widget; Gloab::widget = nullptr; } //获取基带id QVector jd; if (ui->jd1->isChecked()) { jd.append(0); } if (ui->jd2->isChecked()) { jd.append(1); } if (ui->jd3->isChecked()) { jd.append(2); } if (ui->jd4->isChecked()) { jd.append(3); } if (jd.isEmpty()) { QMessageBox::warning(this, "警告", "请至少选择一个基带"); return; } //获取时间 QDateTime beginTime = ui->beginTime->dateTime(); QDateTime endTime = ui->endTime->dateTime(); if (beginTime>endTime) { QMessageBox::warning(this, "警告", "请选择正确的时间段"); return; } //获取参数名 QString dataName = ui->comboBox->currentText(); if (!Gloab::namelist.keys().contains(dataName)) { QMessageBox::warning(this, "警告", "未找到该数据"); return; } //传入数据绘图 thread_polt->setValue(jd, dataName, beginTime, endTime); Gloab::widget = new QWidget(); Gloab::widget->setWindowTitle(dataName); //设置进度条 layout = new QVBoxLayout(ui->widget); progressBar = new QProgressBar(ui->widget); layout->addWidget(progressBar); ui->widget->show(); // 获取文件大小 Gloab::fileSize=0; for (int i = 0; i < jd.size(); ++i) { Gloab::fileSize+=Gloab::g_param[jd[i]].size(); } Gloab::bytesRead = 0; thread_polt->start(); }