Files
ReadLog/mainwindow.cpp
Sherlock 53362d9373 v1.2.1
优化下拉框搜索,将科学计数法改为保留两位小数显示,可以正确识别日志中的科学计数法
2024-09-14 10:37:03 +08:00

290 lines
8.1 KiB
C++

#include "mainwindow.h"
#include <QMessageBox>
#include "lib/qcustomplot.h"
#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.2.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::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::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);
Gloab::completer->setFilterMode(Qt::MatchContains);
ui->comboBox->setCompleter(Gloab::completer);
}
void MainWindow::setProgressBar(int percent) {
progressBar->setValue(percent);
}
void MainWindow::closeProg() {
layout->deleteLater();
progressBar->deleteLater();
ui->widget->close();
}
void MainWindow::setChartView(int jd, bool isEnum) {
// 设置图表标题
QCustPlot *qCustPlot = new QCustPlot(Gloab::xData[jd], Gloab::yData[jd], jd, isEnum, true);
// 将qCustPlot添加到容器中
Gloab::m_QCView.append(qCustPlot);
}
void MainWindow::setWidget() {
// 设置布局
int wide = 850;
int hight = 600;
if (Gloab::m_QCView.size() > 1) {
wide = 1800;
}
QGridLayout *gridLayout = new QGridLayout(Gloab::widget);
for (int i = 0, j = 0; i < Gloab::m_QCView.size(); i++) {
if (i != 0 && i % 2 == 0) {
j++;
hight += 350;
}
gridLayout->addWidget(Gloab::m_QCView[i], j, i - 2 * j);
}
Gloab::widget->resize(wide, hight);
Gloab::widget->move(70, 20);
Gloab::widget->show();
layout->deleteLater();
progressBar->deleteLater();
ui->widget->close();
}
void MainWindow::setPlotChartView(int jd, bool isEnum) {
// 设置图表标题
QCustPlot *qCustPlot = new QCustPlot(Gloab::xData[jd], Gloab::yData[jd], jd, isEnum, false);
// 将qCustPlot添加到容器中
Gloab::m_QCView.append(qCustPlot);
}
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<int> 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<int> 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();
}