RB_ningyang/mainwindow.cpp

1938 lines
64 KiB
C++
Raw Permalink Normal View History

2026-01-22 11:08:28 +00:00
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QTimer>
#include "SerialConfig.h"
#include "serialportmanager.h"
#include <QLabel>
#include <QVBoxLayout>
#include <QPushButton>
#include <QHBoxLayout>
#include <QChart>
#include <QValueAxis>
#include <QFont>
#include "databaseutils.h"
#include <QFileDialog>
#include "ExportThread.h"
#include <QMediaPlayer>
#include <QKeyEvent>
#include "passworddialog.h"
#include <QApplication>
using namespace QtCharts;
QT_CHARTS_USE_NAMESPACE
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow), serialPortManager(new SerialPortManager(this)), serialConfigDialog(new SerialConfig(this)), player(new QMediaPlayer(this))
// , hidReader(new HIDReader(this))
{
ui->setupUi(this);
// 设置窗口最小大小和默认大小
this->setMinimumSize(1200, 750);
this->resize(1400, 950);
ui->label_7->setFixedSize(100, 100);
ui->lcdNumber->setFixedSize(450, 100);
// 创建一个白色背景的QWidget
QWidget *backgroundWidget = new QWidget;
backgroundWidget->setStyleSheet("background-color: white; border-radius: 20px;");
// 创建水平布局
QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->setSpacing(40);
// 添加第一个控件label_7
hLayout->addWidget(ui->label_7);
// 创建并添加第二个垂直布局link_button 和 link_label并设置最大高度为65
QVBoxLayout *vLayout1 = new QVBoxLayout;
vLayout1->setSpacing(2);
vLayout1->setContentsMargins(0, 0, 0, 0);
ui->link_button->setMinimumHeight(80);
ui->link_button->setMinimumWidth(80);
ui->link_button->setMaximumHeight(80);
ui->link_button->setMaximumWidth(80);
ui->link_label->setMinimumHeight(25);
ui->link_label->setMinimumWidth(80);
ui->link_label->setMaximumHeight(25);
vLayout1->addWidget(ui->link_button, 0, Qt::AlignHCenter);
vLayout1->addWidget(ui->link_label, 0, Qt::AlignHCenter);
hLayout->addLayout(vLayout1);
// 创建并添加第三个垂直布局auto_button 和 auto_label并设置最大高度为65
QVBoxLayout *vLayout2 = new QVBoxLayout;
vLayout2->setSpacing(2);
vLayout2->setContentsMargins(0, 0, 0, 0);
ui->auto_button->setMinimumHeight(80);
ui->auto_button->setMinimumWidth(80);
ui->auto_button->setMaximumHeight(80);
ui->auto_button->setMaximumWidth(80);
ui->auto_label->setMinimumHeight(25);
ui->auto_label->setMinimumWidth(80);
ui->auto_label->setMaximumHeight(25);
vLayout2->addWidget(ui->auto_button, 0, Qt::AlignHCenter);
vLayout2->addWidget(ui->auto_label, 0, Qt::AlignHCenter);
hLayout->addLayout(vLayout2);
// 创建并添加第四个垂直布局manual_button 和 manual_label并设置最大高度为65
QVBoxLayout *vLayout3 = new QVBoxLayout;
vLayout3->setSpacing(2);
vLayout3->setContentsMargins(0, 0, 0, 0);
ui->manual_button->setMinimumHeight(80);
ui->manual_button->setMinimumWidth(80);
ui->manual_button->setMaximumHeight(80);
ui->manual_button->setMaximumWidth(80);
ui->manual_label->setMinimumHeight(25);
ui->manual_label->setMinimumWidth(80);
ui->manual_label->setMaximumHeight(25);
vLayout3->addWidget(ui->manual_button, 0, Qt::AlignHCenter);
vLayout3->addWidget(ui->manual_label, 0, Qt::AlignHCenter);
hLayout->addLayout(vLayout3);
// 创建并添加第五个垂直布局excel_b 和 label_5并设置最大高度为65
QVBoxLayout *vLayout4 = new QVBoxLayout;
vLayout4->setSpacing(2);
vLayout4->setContentsMargins(0, 0, 0, 0);
ui->excel_b->setMinimumHeight(80);
ui->excel_b->setMinimumWidth(80);
ui->excel_b->setMaximumHeight(80);
ui->excel_b->setMaximumWidth(80);
ui->label_5->setMinimumHeight(25);
ui->label_5->setMinimumWidth(80);
ui->label_5->setMaximumHeight(25);
vLayout4->addWidget(ui->excel_b, 0, Qt::AlignHCenter);
vLayout4->addWidget(ui->label_5, 0, Qt::AlignHCenter);
hLayout->addLayout(vLayout4);
// 添加第六个控件lcdNumber
hLayout->addWidget(ui->lcdNumber);
// 创建并添加第七个垂直布局tishi_label 和 info_label并设置最大高度为65
QVBoxLayout *vLayout5 = new QVBoxLayout;
// ui->tishi_label->setMaximumHeight(65);
// ui->info_label->setMaximumHeight(65);
ui->tishi_label->setMaximumHeight(40);
ui->tishi_label->setMaximumWidth(140);
ui->tishi_label->setMinimumHeight(40);
ui->tishi_label->setMinimumWidth(140);
ui->info_label->setMaximumHeight(40);
ui->info_label->setMaximumWidth(140);
ui->info_label->setMinimumHeight(40);
ui->info_label->setMinimumWidth(140);
vLayout5->addWidget(ui->tishi_label);
vLayout5->addWidget(ui->info_label);
hLayout->addLayout(vLayout5);
// 添加第八个控件label_img
// hLayout->addWidget(ui->label_img);
// 将水平布局设置为一个QWidget的布局
QWidget *hLayoutWidget = new QWidget;
hLayoutWidget->setLayout(hLayout);
hLayoutWidget->setFixedHeight(140);
hLayoutWidget->setMinimumWidth(1280); // 最小宽度
// 创建垂直布局并添加顶部和底部的垂直Spacer
QVBoxLayout *backgroundLayout = new QVBoxLayout;
backgroundLayout->setContentsMargins(0, 0, 0, 0);
backgroundLayout->addSpacerItem(new QSpacerItem(20, 0, QSizePolicy::Minimum, QSizePolicy::Expanding));
backgroundLayout->addWidget(hLayoutWidget, 0, Qt::AlignLeft); // 左对齐
backgroundLayout->addSpacerItem(new QSpacerItem(20, 0, QSizePolicy::Minimum, QSizePolicy::Expanding));
// 将背景布局设置为背景小部件的布局
backgroundWidget->setLayout(backgroundLayout);
// 创建垂直布局将背景小部件和tabWidget添加进去
QVBoxLayout *vLayoutMain = new QVBoxLayout;
vLayoutMain->addWidget(backgroundWidget);
vLayoutMain->addWidget(ui->tabWidget, 1); // 让tabWidget占据剩余空间
// 创建一个容器窗口并设置布局
QWidget *container = new QWidget(this);
container->setLayout(vLayoutMain);
setCentralWidget(container);
// 为每个tab页设置左上对齐的布局跳过总览页面tab_1因为它有自己的图表布局
for (int i = 0; i < ui->tabWidget->count(); ++i)
{
QWidget *tab = ui->tabWidget->widget(i);
// 跳过总览页面tab_1它在disp_IIOT()中有自己的布局
if (tab && tab != ui->tab_1)
{
// 获取tab内所有直接子控件
QList<QWidget *> children = tab->findChildren<QWidget *>(QString(), Qt::FindDirectChildrenOnly);
// 创建一个固定大小的容器来包含所有控件
QWidget *contentWidget = new QWidget(tab);
contentWidget->setFixedSize(1300, 750);
// 将所有子控件移到contentWidget中
for (QWidget *child : children)
{
child->setParent(contentWidget);
}
// 为tab设置布局让contentWidget左上对齐
QHBoxLayout *tabHLayout = new QHBoxLayout(tab);
tabHLayout->setContentsMargins(0, 0, 0, 0);
tabHLayout->addWidget(contentWidget, 0, Qt::AlignTop | Qt::AlignLeft);
tabHLayout->addStretch(); // 右边填充空白
QVBoxLayout *wrapperLayout = new QVBoxLayout();
wrapperLayout->addLayout(tabHLayout);
wrapperLayout->addStretch(); // 下边填充空白
// 清除旧布局,设置新布局
delete tab->layout();
tab->setLayout(wrapperLayout);
}
}
// 确保控件自适应大小
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
ui->label_16->setStyleSheet("QLabel { color : #02E5FF; }");
QMessageBox *msgBox = new QMessageBox(this);
msgBox->setIcon(QMessageBox::Warning);
msgBox->setWindowTitle("初始化");
msgBox->setText("自动连接中...");
msgBox->setStandardButtons(QMessageBox::NoButton);
msgBox->show();
QTimer::singleShot(1000, msgBox, &QMessageBox::accept);
QCoreApplication::processEvents();
ui->lcdNumber->setDigitCount(8);
ui->lcdNumber->display(888.888);
// ui->label_bg->lower();
disp_canshu();
daily_date = DatabaseUtils::get_today_daliy_t(daily_cnt, daily_cnt_manual,
daily_qualified_cnt, daily_cnt_over,
daily_cnt_down, daily_cnt_max,
daily_cnt_min);
// qDebug() << "daily_date" <<daily_date;
disp_IIOT();
serialPortManager->setConnectionMode(SerialPortManager::Auto);
bool serial_status = serialPortManager->connectSerialPort();
if (serial_status)
{
// QMessageBox::information(this, "连接成功", "自动连接");
ui->link_label->setText("已连接");
ui->link_label->setStyleSheet("QLabel { color : green; }");
ui->set_tx_lineEdit_1->setText("01");
ui->set_tx_lineEdit_2->setText("9600");
playConnState_ok();
}
else
{
playConnState_no();
QMessageBox::warning(this, "连接失败", "请手动连接");
}
connect(ui->link_button, &QPushButton::clicked, this, &MainWindow::onLinkButtonClicked);
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MainWindow::auto_query);
timer2 = new QTimer(this);
updateCharts();
connect(timer2, &QTimer::timeout, this, &MainWindow::updateCharts);
timer2->start(1800);
// connect(hidReader, &HIDReader::dataRead, this, &MainWindow::handleDataRead);
// hidReader->startReading();
this->setFocus();
connect(ui->xc_button, &QPushButton::clicked, this, &MainWindow::onShowPasswordDialog);
connect(ui->pwd_button, &QPushButton::clicked, this, &MainWindow::onShowPasswordDialog);
connect(ui->user_data_button, &QPushButton::clicked, this, &MainWindow::on_user_data_button_clicked_func);
connect(ui->name_button, &QPushButton::clicked, this, &MainWindow::onShowPasswordDialog);
connect(ui->auto_value_button, &QPushButton::clicked, this, &MainWindow::onShowPasswordDialog);
connect(ui->res_max_button, &QPushButton::clicked, this, &MainWindow::onShowPasswordDialog);
connect(ui->delete_1_button, &QPushButton::clicked, this, &MainWindow::onShowPasswordDialog);
connect(ui->delete_2_button, &QPushButton::clicked, this, &MainWindow::onShowPasswordDialog);
int rowCount = ui->tableWidget->rowCount(); // 获取行数
int columnCount = ui->tableWidget->columnCount(); // 获取列数
for (int row = 0; row < rowCount; ++row)
{
for (int col = 0; col < columnCount; ++col)
{
// 获取当前单元格的 item如果不存在则创建一个
QTableWidgetItem *item = ui->tableWidget->item(row, col);
if (!item)
{
item = new QTableWidgetItem("");
ui->tableWidget->setItem(row, col, item);
}
// 设置单元格为禁用状态
item->setFlags(Qt::NoItemFlags);
}
}
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
// 禁用选择和焦点
ui->tableWidget->setSelectionMode(QAbstractItemView::NoSelection);
ui->tableWidget->setFocusPolicy(Qt::NoFocus);
// 设置扫码输入框为只读,防止直接输入,只通过扫码填充
ui->user_data_lineEdit_2->setReadOnly(true);
ui->user_data_lineEdit_3->setReadOnly(true);
ui->user_data_lineEdit_2->setFocusPolicy(Qt::NoFocus);
ui->user_data_lineEdit_3->setFocusPolicy(Qt::NoFocus);
}
MainWindow::~MainWindow()
{
daily_qualified_l = daily_qualified_cnt / (daily_cnt * 1.0);
DatabaseUtils::insertOrUpdateDailyData(daily_cnt, daily_cnt_manual, daily_qualified_cnt, daily_cnt_over, daily_cnt_down, daily_cnt_max, daily_cnt_min, daily_qualified_l);
DatabaseUtils::closeDatabase();
// hidReader->stopReading();
delete timer;
delete ui;
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
QMainWindow::resizeEvent(event);
}
void MainWindow::handleDataRead(const QByteArray &data)
{
QString text = QString::fromUtf8(data);
ui->user_data_lineEdit_2->setText(text);
// ui->textEdit->append(text);
}
void MainWindow::on_link_button_clicked()
{
serialConfigDialog->scanSerialPorts();
}
void MainWindow::onLinkButtonClicked()
{
if (serialConfigDialog->exec() == QDialog::Accepted)
{
QString portName = serialConfigDialog->getSerialPort();
int baudRate = serialConfigDialog->getBaudRate().toInt();
int dataBits = serialConfigDialog->getDataBits().toInt();
int stopBits = serialConfigDialog->getStopBits().toInt();
int parity = serialConfigDialog->getParity().toInt();
serialPortManager->configureSerialPort(portName, baudRate, dataBits, stopBits, parity);
serialPortManager->setConnectionMode(SerialPortManager::Manual);
if (serialPortManager->connectSerialPort())
{
serialPort = serialPortManager->getSerialPort();
QMessageBox::information(this, "连接成功", "已成功连接到串口 " + serialPort->portName());
ui->link_label->setText("已连接");
ui->link_label->setStyleSheet("QLabel { color : green; }");
ui->set_tx_lineEdit_1->setText("01");
ui->set_tx_lineEdit_2->setText("9600");
}
else
{
ui->link_label->setText("连接");
ui->link_label->setStyleSheet("QLabel { color : black; }");
QMessageBox::warning(this, "连接失败", "未找到合适的串口连接。");
ui->set_tx_lineEdit_1->setText("");
ui->set_tx_lineEdit_2->setText("");
}
}
}
void MainWindow::auto_query()
{
if (auto_mode)
{
get_one_data();
}
}
void MainWindow::on_auto_button_clicked()
{
if (auto_mode)
{
ui->auto_label->setText("自动关闭");
auto_mode = false;
timer->stop();
}
else
{
ui->auto_label->setText("自动开启");
auto_mode = true;
get_one_data();
timer->start(auto_time * 1000);
}
}
void MainWindow::on_manual_button_clicked()
{
// playQualified();
if (auto_mode)
{
ui->auto_label->setText("自动关闭");
auto_mode = false;
timer->stop();
}
get_one_data();
}
void MainWindow::get_one_data()
{
ui->tishi_label->setText("获取中...");
ui->tishi_label->setStyleSheet("QLabel { color : black; }");
double zz_disp = serialPortManager->sendModbus_receive("010400000001", 7);
// qDebug() << "zz_disp:" <<zz_disp;
// zz_disp = 3.1; // 测试数据
if (zz_disp == -3)
{
ui->tishi_label->setText("超出设备量程");
ui->tishi_label->setStyleSheet("QLabel { color : red; }");
ui->info_label->setText("");
ui->lcdNumber->display("---.---");
// qDebug() << "00000";
return;
}
else if (zz_disp == -2)
{
// play_no_conn_res();
ui->tishi_label->setText("未连接电阻");
ui->tishi_label->setStyleSheet("QLabel { color : black; }");
ui->info_label->setText("");
ui->lcdNumber->display("---.---");
// qDebug() << "00000";
return;
}
else if (zz_disp == -1)
{
ui->tishi_label->setText("获取异常");
ui->tishi_label->setStyleSheet("QLabel { color : black; }");
ui->info_label->setText("");
ui->lcdNumber->display("---.---");
// qDebug() << "00000";
// if(auto_mode == false){
null_cnt++;
if (null_cnt > 2)
{
// play_get_err();
ui->info_label->setText("请检查连接");
ui->info_label->setStyleSheet("QLabel { color : red; }");
null_cnt = 0;
}
// }
return;
}
// 检测两个扫码值是否都为空
if (sm_num.isEmpty() || hot_num.isEmpty())
{
if (scanTipLabel == nullptr)
{
scanTipLabel = new QLabel(this);
scanTipLabel->setText("编码缺失,请先扫码!");
scanTipLabel->setStyleSheet(
"QLabel { "
"background-color: #FFFBE6; "
"border: 2px solid #FFD666; "
"border-radius: 8px; "
"padding: 15px 25px; "
"font-size: 16px; "
"font-weight: bold; "
"color: #D48806; "
"}");
scanTipLabel->setAlignment(Qt::AlignCenter);
scanTipLabel->adjustSize();
// 设置为不获取焦点
scanTipLabel->setFocusPolicy(Qt::NoFocus);
scanTipLabel->setAttribute(Qt::WA_ShowWithoutActivating);
}
// 居中显示
int x = (this->width() - scanTipLabel->width()) / 2;
int y = (this->height() - scanTipLabel->height()) / 2;
scanTipLabel->move(x, y);
scanTipLabel->show();
scanTipLabel->raise();
return;
}
// qDebug() << "zz_disp:" <<zz_disp;
zz_disp = zz_disp - xc_sd;
// qDebug() << "zz_disp:" <<zz_disp;
ui->lcdNumber->display(zz_disp);
if (daily_one)
{
daily_cnt_min = zz_disp;
daily_cnt_max = zz_disp;
daily_one = false;
}
if (auto_mode)
{
auto_mode_flag = "自动获取";
}
else
{
auto_mode_flag = "手动获取";
}
if (zz_disp > max_res)
{
playUnqualified();
daily_cnt_over++;
up_cnt++;
DatabaseUtils::update_Info_t("up_cnt", up_cnt);
if (DatabaseUtils::insert_ResData(chexing, sm_num, hot_num, zz_disp, detect, "异常:过大", auto_mode_flag, name))
{
sm_num = "";
hot_num = "";
ui->user_data_lineEdit_2->clear();
ui->user_data_lineEdit_3->clear();
}
ui->info_label->setText("阻值过大");
ui->info_label->setStyleSheet("QLabel { color : red; }");
}
else if (zz_disp < min_res)
{
playUnqualified();
down_cnt++;
daily_cnt_down++;
DatabaseUtils::update_Info_t("down_cnt", down_cnt);
if (DatabaseUtils::insert_ResData(chexing, sm_num, hot_num, zz_disp, detect, "异常:过小", auto_mode_flag, name))
{
sm_num = "";
hot_num = "";
ui->user_data_lineEdit_2->clear();
ui->user_data_lineEdit_3->clear();
}
ui->info_label->setText("阻值过小");
ui->info_label->setStyleSheet("QLabel { color : red; }");
}
else
{
playQualified();
qualified_cnt++;
daily_qualified_cnt++;
DatabaseUtils::update_Info_t("qualified_cnt", qualified_cnt);
if (DatabaseUtils::insert_ResData(chexing, sm_num, hot_num, zz_disp, detect, "合格", auto_mode_flag, name))
{
sm_num = "";
hot_num = "";
ui->user_data_lineEdit_2->clear();
ui->user_data_lineEdit_3->clear();
}
ui->info_label->setText("阻值正常");
ui->info_label->setStyleSheet("QLabel { color : green; }");
}
if (zz_disp > daily_cnt_max)
{
daily_cnt_max = zz_disp;
}
if (zz_disp < daily_cnt_min)
{
daily_cnt_min = zz_disp;
}
all_count++;
manual_cnt++;
daily_cnt++;
daily_cnt_manual++;
DatabaseUtils::update_Info_t("all_count", all_count);
DatabaseUtils::update_Info_t("manual_cnt", manual_cnt);
ui->tishi_label->setText(QString("今日检测:%1 ").arg(daily_cnt));
ui->tishi_label->setStyleSheet("QLabel { color : green; }");
}
/**
0103 1001 0002
1002
1001
1002
1003
J1报警模式 1004
J1报警值或J1区间起点值 1005
J1回差值或J1区间终点值 1006
J2报警模式 1007
J2报警值或J2区间起点值 1008
J2回差值或J2区间终点值 1009
100A
100B
100C
/ 100D
/ 100E
2000
/ 2001
线 2005
/ 2006
*/
void MainWindow::onExportSucceeded()
{
QMessageBox::information(this, tr("导出"), tr("导出表格成功"));
}
void MainWindow::onExportFailed(const QString &error)
{
QMessageBox::warning(this, tr("导出失败"), error);
}
void MainWindow::on_excel_b_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Save Excel File"), "", tr("Excel Files (*.xlsx *.xls)"));
if (fileName.isEmpty())
{
return;
}
ExportThread *thread = new ExportThread(fileName, all_count, auto_cnt, manual_cnt, qualified_cnt, up_cnt, down_cnt, this);
connect(thread, &ExportThread::exportSucceeded, this, &MainWindow::onExportSucceeded);
connect(thread, &ExportThread::exportFailed, this, &MainWindow::onExportFailed);
connect(thread, &QThread::finished, thread, &QObject::deleteLater);
thread->start();
// if (totalRows == 0) {
// QMessageBox::warning(this, tr("Export to Excel"), tr("The table is empty. There is no data to export."));
// return;
// }
// QString fileName = QFileDialog::getSaveFileName(this, tr("Save Excel File"), "", tr("Excel Files (*.xlsx *.xls)"));
// if (fileName.isEmpty()) {
// qDebug() << "No file selected";
// return;
// }
// QMessageBox::information(this, tr("导出"), tr("导出表格中......"));
//// QMessageBox *msgBox = new QMessageBox(this);
//// msgBox->setIcon(QMessageBox::Warning);
//// msgBox->setWindowTitle("导出");
//// msgBox->setText("导出表格中...");
//// msgBox->setStandardButtons(QMessageBox::NoButton);
//// msgBox->show();
//// QTimer::singleShot(1000, msgBox, &QMessageBox::accept);
//// QCoreApplication::processEvents();
// QVector<QVariantList> allData = DatabaseUtils::getAllData();
// if (allData.isEmpty()) {
// qDebug() << "No data retrieved from database";
// return;
// }
// QAxObject *excel = new QAxObject("Excel.Application", this);
// if (!excel->isNull()) {
// excel->setProperty("Visible", false);
// } else {
// qDebug() << "Failed to create Excel application";
// QMessageBox::warning(this, tr("Excel Error"), tr("Failed to create Excel application."));
// return;
// }
// QAxObject *workbooks = excel->querySubObject("Workbooks");
// QAxObject *workbook = workbooks->querySubObject("Add");
// QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
// int columnCount = allData.first().size();
// for (int col = 0; col < columnCount; ++col) {
// QString columnName = QString("Column %1").arg(col + 1);
// QAxObject *cell = worksheet->querySubObject("Cells(int,int)", 1, col + 1);
// cell->setProperty("Value", columnName);
// }
// for (int row = 0; row < allData.size(); ++row) {
// const QVariantList &rowData = allData[row];
// for (int col = 0; col < rowData.size(); ++col) {
// QAxObject *cell = worksheet->querySubObject("Cells(int,int)", row + 2, col + 1);
// QVariant value = rowData[col];
// cell->setProperty("Value2", value);
//// qDebug() << "Writing to Excel: Row" << row + 2 << "Col" << col + 1 << value;
// }
// }
// workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(fileName));
// workbook->dynamicCall("Close()");
// excel->dynamicCall("Quit()");
// delete excel;
// QMessageBox::information(this, tr("导出"), tr("导出表格成功"));
}
void MainWindow::on_user_data_button_clicked_func()
{
QString userInput1 = ui->user_data_lineEdit_1->text();
bool save_flag = DatabaseUtils::update_Info_t("chexing", userInput1);
chexing = userInput1;
if (save_flag == false)
{
QMessageBox::warning(this, "保存失败", "请重新设置");
}
else
{
QMessageBox::warning(this, "保存成功", "已修改");
}
}
void MainWindow::on_name_button_clicked_func()
{
QString userInput1 = ui->name_lineEdit->text();
bool save_flag = DatabaseUtils::update_Info_t("name", userInput1);
name = userInput1;
if (save_flag == false)
{
QMessageBox::warning(this, "保存失败", "请重新设置");
}
else
{
QMessageBox::warning(this, "保存成功", "已修改");
}
}
void MainWindow::on_res_max_button_clicked_func()
{
QString userInput1 = ui->res_max_lineEdit_1->text();
QString userInput2 = ui->res_max_lineEdit_2->text();
double res = userInput1.toDouble();
if (res >= 10)
{
QMessageBox::warning(this, "保存失败", "输入值不在范围");
return;
}
double sd = userInput2.toDouble();
double sd1 = sd;
sd = res * (sd / 100);
max_res = res + sd;
if (max_res >= 10)
{
QMessageBox::warning(this, "保存失败", "最大值无效");
return;
}
min_res = res - sd;
if (min_res < 0)
{
QMessageBox::warning(this, "保存失败", "最小值无效");
return;
}
// qDebug()<<"res" << res;
// qDebug()<<"sd" << sd;
// qDebug()<<"max_res" << max_res;
// qDebug()<<"min_res" << min_res;
detect = QString("%1Ω ±%2%").arg(res).arg(sd1); // 使用sd1(原始百分比值)而不是sd(计算后的值)
bool save_flag = DatabaseUtils::update_Info_t("res_value", res);
save_flag = DatabaseUtils::update_Info_t("res_sd", sd1);
save_flag = DatabaseUtils::update_Info_t("max_res", max_res);
save_flag = DatabaseUtils::update_Info_t("min_res", min_res);
if (save_flag == false)
{
QMessageBox::warning(this, "保存失败", "请重新设置");
}
else
{
QMessageBox::warning(this, "保存成功", "已修改");
}
}
void MainWindow::on_auto_value_button_clicked_func()
{
QString userInput1 = ui->auto_value_lineEdit_1->text();
bool save_flag;
if (userInput1.toInt() < 1)
{
// save_flag = DatabaseUtils::update_Info_t("auto_time",10);
save_flag = false;
}
else
{
auto_time = userInput1.toInt();
save_flag = DatabaseUtils::update_Info_t("auto_time", auto_time);
ui->auto_value_lineEdit_1->setText(QString::number(auto_time));
}
if (save_flag == false)
{
QMessageBox::warning(this, "保存失败", "输入值不在范围");
}
else
{
QMessageBox::warning(this, "保存成功", "已修改");
}
}
// void MainWindow::on_set_tx_button_clicked()
//{
// QString userInput1 = ui->set_tx_lineEdit_1->text();
// QString userInput2 = ui->set_tx_lineEdit_2->text();
//}
void delay(int milliseconds)
{
QEventLoop loop;
QTimer::singleShot(milliseconds, &loop, SLOT(quit()));
loop.exec();
}
void MainWindow::on_xc_button_clicked_func()
{
if (auto_mode)
{
ui->auto_label->setText("自动关闭");
auto_mode = false;
timer->stop();
}
QString userInput1 = ui->xc_lineEdit->text();
bool ok;
xc_sd = userInput1.toDouble(&ok);
if (ok == false)
{
QString warningMessage = QString("字符转换问题:非数字").arg(xc_sd);
QMessageBox::warning(this, "保存失败", warningMessage);
return;
}
if (xc_sd < 3 && ok && xc_sd >= 0)
{
ok = DatabaseUtils::update_Info_t("xc_sd", xc_sd);
if (ok == false)
{
QString warningMessage = QString("数据库问题:无法保存").arg(xc_sd);
QMessageBox::warning(this, "保存失败", warningMessage);
return;
}
}
else
{
ok = false;
QString warningMessage = QString("输入值 %1 不在范围").arg(xc_sd);
QMessageBox::warning(this, "保存失败", warningMessage);
return;
}
if (ok == true)
{
QString warningMessage = QString("已修改 %1 ").arg(xc_sd);
QMessageBox::warning(this, "保存成功", warningMessage);
}
}
// void MainWindow::on_bj_2_button_clicked()
//{
// if(auto_mode){
// ui->auto_label->setText("自动关闭");
// auto_mode = false;
// timer->stop();
// }
// QString userInput1 = ui->bj_2_lineEdit_0->text();
// QString userInput2 = ui->bj_2_lineEdit_1->text();
// QString userInput3 = ui->bj_2_lineEdit_2->text();
// QString command1;
// if (userInput1 == "0") {
// command1 = "010610070000";
// } else if (userInput1 == "1") {
// command1 = "010610070001";
// } else if (userInput1 == "2") {
// command1 = "010610070002";
// } else if (userInput1 == "3") {
// command1 = "010610070003";
// } else if (userInput1 == "4") {
// command1 = "010610070004";
// } else {
// ui->bj_2_lineEdit_0->setText("输入无效: 请输入0到4之间的数字");
// ui->bj_2_lineEdit_0->setStyleSheet("QLabel { color : red; }");
// return;
// }
// bool rec_flag = serialPortManager->sendModbus_receive_2(command1, 8);
// delay(10);
// bool ok;
// int value2 = userInput2.toInt(&ok);
// if (!ok) {
// ui->bj_2_lineEdit_1->setText("输入无效: 请输入有效的数字");
// ui->bj_2_lineEdit_1->setStyleSheet("QLabel { color : red; }");
// return;
// }
// QString hexValue2 = QString("%1").arg(value2, 4, 16, QLatin1Char('0')).toUpper();
// QString command2 = "01061008" + hexValue2;
// rec_flag = serialPortManager->sendModbus_receive_2(command2, 8);
// delay(10);
// int value3 = userInput3.toInt(&ok);
// if (!ok) {
// ui->bj_2_lineEdit_2->setText("输入无效: 请输入有效的数字");
// ui->bj_2_lineEdit_2->setStyleSheet("QLabel { color : red; }");
// return;
// }
// QString hexValue3 = QString("%1").arg(value3, 4, 16, QLatin1Char('0')).toUpper();
// QString command3 = "01061009" + hexValue3;
// rec_flag = serialPortManager->sendModbus_receive_2(command3, 8);
// if(rec_flag == false){
// QMessageBox::warning(this, "设置失败", "请重新设置");
// } else {
// QMessageBox::warning(this, "设置成功", "已修改");
// }
// }
void MainWindow::get_device_bj_info()
{
// serialPortManager->sendModbus_receive_2("010310040002", 9);
// ui->bj_1_lineEdit_0->setText("");
// serialPortManager->sendModbus_receive_2("010310050002", 9);
// ui->bj_1_lineEdit_1->setText("");
// serialPortManager->sendModbus_receive_2("010310060002", 9);
// ui->bj_1_lineEdit_2->setText("");
// serialPortManager->sendModbus_receive_2("010310070002", 9);
// ui->bj_2_lineEdit_0->setText("");
// serialPortManager->sendModbus_receive_2("010310080002", 9);
// ui->bj_2_lineEdit_1->setText("");
// serialPortManager->sendModbus_receive_2("010310090002", 9);
// ui->bj_2_lineEdit_2->setText("");
}
void MainWindow::on_nextPageButton_clicked()
{
totalRows = DatabaseUtils::getResTotalRows();
uppage = false;
if ((currentPage + 1) * rowsPerPage < totalRows)
{
currentPage++;
}
else
{
currentPage = 0; // 第一页
}
// qDebug() << "totalRows:" << totalRows;
// qDebug() << "Next page:" << currentPage;
updateTableWidget(DatabaseUtils::getData(rowsPerPage, currentPage * rowsPerPage));
}
void MainWindow::on_prevPageButton_clicked()
{
totalRows = DatabaseUtils::getResTotalRows();
uppage = false;
if (currentPage > 0)
{
currentPage--;
}
else
{
currentPage = (totalRows + rowsPerPage - 1) / rowsPerPage - 1; // 最后一页
}
// qDebug() << "totalRows:" << totalRows;
// qDebug() << "Previous page:" << currentPage;
updateTableWidget(DatabaseUtils::getData(rowsPerPage, currentPage * rowsPerPage));
}
void MainWindow::updateTableWidget(const QVector<QVariantList> &data)
{
ui->tableWidget->setRowCount(rowsPerPage);
for (int row = 0; row < data.size(); ++row)
{
const QVariantList &rowData = data[row];
for (int col = 0; col < rowData.size(); ++col)
{
QTableWidgetItem *item = new QTableWidgetItem(rowData[col].toString());
item->setFlags(Qt::NoItemFlags);
item->setTextAlignment(Qt::AlignCenter); // 文字居中
ui->tableWidget->setItem(row, col, item);
}
}
for (int i = data.size(); i < rowsPerPage; ++i)
{
for (int col = 0; col < ui->tableWidget->columnCount(); ++col)
{
ui->tableWidget->setItem(i, col, new QTableWidgetItem(""));
}
}
// ui->user_data_lineEdit_2->setFocus();
// ui->tableWidget->setSelectionMode(QAbstractItemView::NoSelection);
}
void MainWindow::updateCharts()
{
if (uppage)
{
totalRows = DatabaseUtils::getResTotalRows();
if (totalRows > old_totalRows)
{
int cnt = (totalRows + rowsPerPage - 1) / rowsPerPage;
for (int i = currentPage; i < cnt - 1; i++)
{
on_nextPageButton_clicked();
}
updateTableWidget(DatabaseUtils::getData(rowsPerPage, currentPage * rowsPerPage));
}
old_totalRows = totalRows;
}
else
{
uppage_cnt++;
if (uppage_cnt >= 3)
{
uppage = true;
}
}
if (daily_date != nullptr)
{
QString currentDate = QDate::currentDate().toString("yyyy-MM-dd");
// qDebug() << "daily_date" <<daily_date;
// qDebug() << "currentDate" <<currentDate;
if (currentDate != daily_date)
{
daily_qualified_l = daily_qualified_cnt / (daily_cnt * 1.0);
DatabaseUtils::insertOrUpdateDailyData(daily_cnt, daily_cnt_manual, daily_qualified_cnt, daily_cnt_over, daily_cnt_down, daily_cnt_max, daily_cnt_min, daily_qualified_l);
DatabaseUtils::updateLastDate();
set20->replace(0, 0);
set21->replace(1, 0);
set22->replace(2, 0);
axisX2->setRange(0, std::max({daily_qualified_cnt, daily_cnt_over + daily_cnt_down, daily_cnt}));
daily_date = DatabaseUtils::get_today_daliy_t(daily_cnt, daily_cnt_manual,
daily_qualified_cnt, daily_cnt_over,
daily_cnt_down, daily_cnt_max,
daily_cnt_min);
// qDebug() << "daily_cnt" <<daily_cnt;
return;
}
}
double qualified_percentage = all_count != 0 ? (qualified_cnt / static_cast<double>(all_count)) * 100 : 0;
double unqualified_percentage = all_count != 0 ? ((up_cnt + down_cnt) / static_cast<double>(all_count)) * 100 : 0;
QList<QPieSlice *> slices = pieSeries->slices();
slices[0]->setLabel(QString("%1").arg(all_count));
// slices[0]->setLabel(QString("%1 (%2)").arg("总检验次数").arg(all_count));
slices[1]->setLabel(QString("%1% (%2)").arg(qualified_percentage, 0, 'f', 1).arg(qualified_cnt));
slices[2]->setLabel(QString("%1% (%2)").arg(unqualified_percentage, 0, 'f', 1).arg((up_cnt + down_cnt)));
set20->replace(0, daily_qualified_cnt);
set21->replace(1, daily_cnt_over + daily_cnt_down);
set22->replace(2, daily_cnt);
bool allZero = (daily_qualified_cnt == 0) && (daily_cnt_over + daily_cnt_down == 0) && (daily_cnt == 0);
if (allZero)
{
axisX2->setRange(0, 1);
// axisX2->setTickCount(3);
}
else
{
int maxValue = std::max({daily_qualified_cnt, daily_cnt_over + daily_cnt_down, daily_cnt});
axisX2->setRange(0, maxValue);
axisX2->applyNiceNumbers();
}
// axisX2->setRange(0, std::max({daily_qualified_cnt, daily_cnt_over+daily_cnt_down, daily_cnt}));
}
void MainWindow::disp_IIOT()
{
QList<QVariantList> dataList = DatabaseUtils::getLastFiveDailyDataSkippingToday();
const int rowCount = 5;
int dailyInspectionCounts[rowCount] = {0};
int manualInspectionCounts[rowCount] = {0};
int qualifieds[rowCount] = {0};
int overLimits[rowCount] = {0};
int underLimits[rowCount] = {0};
double maxValues[rowCount] = {0.0};
double minValues[rowCount] = {0.0};
double qualificationRates[rowCount] = {0.0};
QString dates[rowCount];
int rowIndex = 0;
for (const QVariantList &row : dataList)
{
if (rowIndex >= rowCount)
break;
dailyInspectionCounts[rowIndex] = row[1].toInt();
manualInspectionCounts[rowIndex] = row[2].toInt();
qualifieds[rowIndex] = row[3].toInt();
overLimits[rowIndex] = row[4].toInt();
underLimits[rowIndex] = row[5].toInt();
maxValues[rowIndex] = row[6].toDouble();
minValues[rowIndex] = row[7].toDouble();
qualificationRates[rowIndex] = row[8].toDouble();
dates[rowIndex] = row[9].toString();
rowIndex++;
}
// 日检验次数 手动检测次数 合格 过大 过小 最大值 最小值 合格率 日期
// for (int i = 0; i < rowCount; ++i) {
// qDebug() << "Daily Inspection Count:" << dailyInspectionCounts[i]
// << "Manual Inspection Count:" << manualInspectionCounts[i]
// << "Qualified:" << qualifieds[i]
// << "Over Limit:" << overLimits[i]
// << "Under Limit:" << underLimits[i]
// << "Max Value:" << maxValues[i]
// << "Min Value:" << minValues[i]
// << "Qualification Rate:" << qualificationRates[i]
// << "Date:" << dates[i];
// }
QColor backgroundColor("#1A1445");
QColor big_textColor(Qt::white);
QColor textColor("#CCCCCC");
QColor lineColor("#7D7D7D");
QColor barColor("#02E5FF");
QFont boldFont;
boldFont.setBold(true);
// 折线图
QLineSeries *lineSeries = new QLineSeries();
lineSeries->append(1, qualificationRates[4]);
lineSeries->append(2, qualificationRates[3]);
lineSeries->append(3, qualificationRates[2]);
lineSeries->append(4, qualificationRates[1]);
lineSeries->append(5, qualificationRates[0]);
QChart *lineChart = new QChart();
lineChart->addSeries(lineSeries);
lineChart->setTitle("近五天合格率");
lineChart->setTitleFont(boldFont);
lineChart->setBackgroundBrush(QBrush(backgroundColor));
lineChart->setTitleBrush(QBrush(big_textColor));
QChartView *lineChartView = new QChartView(lineChart);
lineChartView->setRenderHint(QPainter::Antialiasing);
QValueAxis *axisX = new QValueAxis();
QValueAxis *axisY = new QValueAxis();
axisX->setTitleText("");
axisY->setTitleText("合格率");
axisX->setLabelsBrush(QBrush(lineColor));
axisY->setLabelsBrush(QBrush(lineColor));
axisX->setTitleBrush(QBrush(barColor));
axisY->setTitleBrush(QBrush(barColor));
axisX->setLinePen(QPen(lineColor));
axisY->setLinePen(QPen(lineColor));
axisY->setRange(0, 1.0);
axisY->setTickCount(5);
lineChart->addAxis(axisX, Qt::AlignBottom);
lineChart->addAxis(axisY, Qt::AlignLeft);
lineSeries->attachAxis(axisX);
lineSeries->attachAxis(axisY);
// 柱状图
QBarSet *set2 = new QBarSet("超出区间");
QBarSet *set4 = new QBarSet("小于区间");
*set2 << maxValues[4] << maxValues[3] << maxValues[2] << maxValues[1] << maxValues[0];
*set4 << minValues[4] << minValues[3] << minValues[2] << minValues[1] << minValues[0];
set2->setColor(QColor("#FF5733"));
set4->setColor(QColor("#FFBD33"));
bool allZero = true;
for (int i = 0; i < 5; ++i)
{
if (maxValues[i] != 0 || minValues[i] != 0)
{
allZero = false;
break;
}
}
QBarSeries *barSeries = new QBarSeries();
barSeries->append(set2);
barSeries->append(set4);
QChart *barChart = new QChart();
barChart->addSeries(barSeries);
barChart->setTitle("近五天最值");
barChart->setTitleFont(boldFont);
barChart->setBackgroundBrush(QBrush(backgroundColor));
barChart->setTitleBrush(QBrush(big_textColor));
QChartView *barChartView1 = new QChartView(barChart);
barChartView1->setRenderHint(QPainter::Antialiasing);
QLegend *legend = barChart->legend();
for (int i = 0; i < legend->markers().size(); ++i)
{
QLegendMarker *marker = legend->markers().at(i);
marker->setLabelBrush(QBrush(textColor));
}
QBarCategoryAxis *axisX1 = new QBarCategoryAxis();
axisX1->append(QStringList() << "1" << "2" << "3" << "4" << "5");
axisX1->setTitleText("条数");
axisX1->setLabelsBrush(QBrush(lineColor));
axisX1->setTitleBrush(QBrush(barColor));
axisX1->setLinePen(QPen(lineColor));
QValueAxis *axisY11 = new QValueAxis();
axisY11->setTitleText("最值");
axisY11->setLabelsBrush(QBrush(lineColor));
axisY11->setTitleBrush(QBrush(barColor));
axisY11->setLinePen(QPen(lineColor));
if (allZero)
{
axisY11->setRange(0, 5);
}
else
{
double maxValue = *std::max_element(maxValues, maxValues + 5);
double minValue = *std::min_element(minValues, minValues + 5);
axisY11->setRange(minValue, maxValue);
}
barChart->addAxis(axisX1, Qt::AlignBottom);
barChart->addAxis(axisY11, Qt::AlignLeft);
barSeries->attachAxis(axisX1);
barSeries->attachAxis(axisY11);
// 柱状图
QBarSet *set10 = new QBarSet("合格");
QBarSet *set11 = new QBarSet("大于");
QBarSet *set12 = new QBarSet("小于");
*set10 << qualifieds[4] << qualifieds[3] << qualifieds[2] << qualifieds[1] << qualifieds[0];
*set11 << overLimits[4] << overLimits[3] << overLimits[2] << overLimits[1] << overLimits[0];
*set12 << underLimits[4] << underLimits[3] << underLimits[2] << underLimits[1] << underLimits[0];
allZero = true;
for (int i = 0; i < 5; ++i)
{
if (qualifieds[i] != 0 || overLimits[i] != 0 || underLimits[i] != 0)
{
allZero = false;
break;
}
}
set10->setColor(QColor("#33FF57"));
set11->setColor(QColor("#FF5733"));
set12->setColor(QColor("#FFBD33"));
QBarSeries *barSeries2 = new QBarSeries();
barSeries2->append(set11);
barSeries2->append(set10);
barSeries2->append(set12);
QChart *barChart2 = new QChart();
barChart2->addSeries(barSeries2);
barChart2->setTitle("近五天检验值");
barChart2->setTitleFont(boldFont);
barChart2->setBackgroundBrush(QBrush(backgroundColor));
barChart2->setTitleBrush(QBrush(big_textColor));
QChartView *barChartView2 = new QChartView(barChart2);
barChartView2->setRenderHint(QPainter::Antialiasing);
legend = barChart2->legend();
for (int i = 0; i < legend->markers().size(); ++i)
{
QLegendMarker *marker = legend->markers().at(i);
marker->setLabelBrush(QBrush(textColor));
}
axisX1 = new QBarCategoryAxis();
axisX1->append(QStringList() << "1" << "2" << "3" << "4" << "5");
axisX1->setTitleText("");
axisX1->setLabelsBrush(QBrush(lineColor));
axisX1->setTitleBrush(QBrush(barColor));
axisX1->setLinePen(QPen(lineColor));
axisY = new QValueAxis();
axisY->setTitleText("检验值");
axisY->setLabelsBrush(QBrush(lineColor));
axisY->setTitleBrush(QBrush(barColor));
axisY->setLinePen(QPen(lineColor));
if (allZero)
{
axisY->setRange(0, 5);
}
barChart2->addAxis(axisX1, Qt::AlignBottom);
barChart2->addAxis(axisY, Qt::AlignLeft);
barSeries2->attachAxis(axisX);
barSeries2->attachAxis(axisY);
// 饼状图
pieSeries = new QPieSeries();
pieSeries->append("总检验次数", 3);
pieSeries->append("良品", 2);
pieSeries->append("不合格", 1);
QList<QPieSlice *> slices = pieSeries->slices();
slices[0]->setColor(QColor("#02C1D7"));
slices[0]->setBorderColor(QColor("#1A1445"));
slices[0]->setBorderWidth(2);
slices[0]->setLabel(QString("%1 (%2)").arg(slices[0]->label()).arg(all_count));
slices[0]->setLabelVisible(true);
slices[0]->setLabelBrush(QBrush(QColor(barColor)));
slices[1]->setColor(QColor("#90EE90"));
slices[1]->setBorderColor(QColor("#1A1445"));
slices[1]->setBorderWidth(2);
double qualified_percentage = all_count != 0 ? (qualified_cnt / static_cast<double>(all_count)) * 100 : 0;
slices[1]->setLabel(QString("%1% (%2)").arg(qualified_percentage, 0, 'f', 1).arg(qualified_cnt));
slices[1]->setLabelVisible(true);
slices[1]->setLabelBrush(QBrush(QColor(barColor)));
slices[2]->setColor(QColor("#FF6347"));
slices[2]->setBorderColor(QColor("#1A1445"));
slices[2]->setBorderWidth(2);
double unqualified_percentage = all_count != 0 ? ((up_cnt + down_cnt) / static_cast<double>(all_count)) * 100 : 0;
slices[2]->setLabel(QString("%1% (%2)").arg(unqualified_percentage, 0, 'f', 1).arg((up_cnt + down_cnt)));
slices[2]->setLabelVisible(true);
slices[2]->setLabelBrush(QBrush(QColor(barColor)));
QChart *pieChart = new QChart();
pieChart->addSeries(pieSeries);
pieChart->setTitle("检验总览");
pieChart->setTitleFont(boldFont);
pieChart->setBackgroundBrush(QBrush(backgroundColor));
pieChart->setTitleBrush(QBrush(big_textColor));
QChartView *pieChartView = new QChartView(pieChart);
pieChartView->setRenderHint(QPainter::Antialiasing);
legend = pieChart->legend();
for (int i = 0; i < legend->markers().size(); ++i)
{
QLegendMarker *marker = legend->markers().at(i);
if (i == 0)
{
marker->setLabel("总检验次数");
}
else if (i == 1)
{
marker->setLabel("良品");
}
else if (i == 2)
{
marker->setLabel("不合格");
}
marker->setLabelBrush(QBrush(textColor));
}
// 条形图
set20 = new QBarSet("良品");
set21 = new QBarSet("不合格");
set22 = new QBarSet("日检验次");
*set20 << 0 << 0 << 0;
*set21 << 0 << 0 << 0;
*set22 << 0 << 0 << 0;
set20->setColor(QColor("#33FF57"));
set21->setColor(QColor("#FF5733"));
set22->setColor(QColor(barColor));
QHorizontalBarSeries *hBarSeries = new QHorizontalBarSeries();
hBarSeries->append(set20);
hBarSeries->append(set21);
hBarSeries->append(set22);
hBarSeries->setLabelsVisible(true);
hBarSeries->setLabelsFormat("@value");
QFont labelFont;
labelFont.setPointSize(12);
labelFont.setBold(true);
set20->setLabelFont(labelFont);
set21->setLabelFont(labelFont);
set22->setLabelFont(labelFont);
QBrush labelBrush(QColor("#FFFFFF"));
set20->setLabelBrush(labelBrush);
set21->setLabelBrush(labelBrush);
set22->setLabelBrush(labelBrush);
QChart *hBarChart = new QChart();
hBarChart->addSeries(hBarSeries);
hBarChart->setTitle("今日检验情况");
hBarChart->setTitleFont(boldFont);
hBarChart->setBackgroundBrush(QBrush(backgroundColor));
hBarChart->setTitleBrush(QBrush(big_textColor));
QChartView *hBarChartView = new QChartView(hBarChart);
hBarChartView->setRenderHint(QPainter::Antialiasing);
legend = hBarChart->legend();
for (int i = 0; i < legend->markers().size(); ++i)
{
QLegendMarker *marker = legend->markers().at(i);
marker->setLabelBrush(QBrush(textColor));
}
axisX2 = new QValueAxis();
axisX2->setTitleText("数量");
axisX2->setLabelsBrush(QBrush(lineColor));
axisX2->setTitleBrush(QBrush(barColor));
axisX2->setLinePen(QPen(lineColor));
allZero = true;
for (int i = 0; i < 3; ++i)
{
if ((*set20)[i] != 0 || (*set21)[i] != 0 || (*set22)[i] != 0)
{
allZero = false;
break;
}
}
if (allZero)
{
axisX2->setRange(0, 3);
axisX2->setTickCount(3);
}
hBarChart->addAxis(axisX2, Qt::AlignBottom);
hBarSeries->attachAxis(axisX2);
QCategoryAxis *axisY1 = new QCategoryAxis();
axisY1->append(" ", 1);
axisY1->append(" ", 2);
axisY1->setLabelsBrush(QBrush(lineColor));
axisY1->setLinePen(QPen(lineColor));
// axisY1->setGridLineVisible(false);
hBarChart->addAxis(axisY1, Qt::AlignLeft);
hBarSeries->attachAxis(axisY1);
// 曲线图
QSplineSeries *splineSeries = new QSplineSeries();
splineSeries->append(1, manualInspectionCounts[4]);
splineSeries->append(2, manualInspectionCounts[3]);
splineSeries->append(3, manualInspectionCounts[2]);
splineSeries->append(4, manualInspectionCounts[1]);
splineSeries->append(5, manualInspectionCounts[0]);
QChart *splineChart = new QChart();
splineChart->addSeries(splineSeries);
splineChart->setTitle("近五天手动检测次数");
splineChart->setTitleFont(boldFont);
splineChart->setBackgroundBrush(QBrush(backgroundColor));
splineChart->setTitleBrush(QBrush(big_textColor));
QChartView *splineChartView = new QChartView(splineChart);
splineChartView->setRenderHint(QPainter::Antialiasing);
axisX = new QValueAxis();
axisY = new QValueAxis();
axisX->setTitleText("");
axisY->setTitleText("次数");
axisX->setLabelsBrush(QBrush(lineColor));
axisY->setLabelsBrush(QBrush(lineColor));
axisX->setTitleBrush(QBrush(barColor));
axisY->setTitleBrush(QBrush(barColor));
axisX->setLinePen(QPen(lineColor));
axisY->setLinePen(QPen(lineColor));
allZero = true;
for (int i = 0; i < 5; ++i)
{
if (manualInspectionCounts[i] != 0)
{
allZero = false;
break;
}
}
if (allZero)
{
axisY->setRange(0, 5);
}
splineChart->addAxis(axisX, Qt::AlignBottom);
splineChart->addAxis(axisY, Qt::AlignLeft);
splineSeries->attachAxis(axisX);
splineSeries->attachAxis(axisY);
QHBoxLayout *topLayout = new QHBoxLayout();
topLayout->addWidget(barChartView1);
topLayout->addWidget(pieChartView);
topLayout->addWidget(barChartView2);
QHBoxLayout *bottomLayout = new QHBoxLayout();
bottomLayout->addWidget(lineChartView);
bottomLayout->addWidget(hBarChartView);
bottomLayout->addWidget(splineChartView);
QVBoxLayout *mainLayout = new QVBoxLayout(ui->tab_1);
mainLayout->addLayout(topLayout);
mainLayout->addLayout(bottomLayout);
}
void MainWindow::disp_canshu()
{
QPalette nextButtonPalette = ui->nextPageButton->palette();
nextButtonPalette.setColor(QPalette::ButtonText, Qt::white);
ui->nextPageButton->setPalette(nextButtonPalette);
ui->prevPageButton->setPalette(nextButtonPalette);
// 设置表格列宽自适应,最后一列(日期)设置为适应内容
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// 最后一列设置为适应内容,确保日期显示完整
int lastCol = ui->tableWidget->columnCount() - 1;
ui->tableWidget->horizontalHeader()->setSectionResizeMode(lastCol, QHeaderView::ResizeToContents);
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
// for (int row = 0; row < 16; ++row) {
// for (int col = 0; col < 4; ++col) {
// QTableWidgetItem *item = new QTableWidgetItem(QString("Row %1, Col %2").arg(row + 1).arg(col + 1));
// ui->tableWidget->setItem(row, col, item);
// }
// }
// DatabaseUtils::insertTestData(100);
totalRows = DatabaseUtils::getResTotalRows();
// qDebug() << "Total rows:" << totalRows;
updateTableWidget(DatabaseUtils::getData(rowsPerPage, currentPage * rowsPerPage));
QMap<QString, QVariant> infoData = DatabaseUtils::read_all_Info_t();
// for (auto it = infoData.begin(); it != infoData.end(); ++it) {
// qDebug() << it.key() << ":" << it.value();
// }
all_count = infoData.value("all_count").toInt();
auto_cnt = infoData.value("auto_cnt").toInt();
manual_cnt = infoData.value("manual_cnt").toInt();
qualified_cnt = infoData.value("qualified_cnt").toInt();
up_cnt = infoData.value("up_cnt").toInt();
down_cnt = infoData.value("down_cnt").toInt();
res_value = infoData.value("res_value").toDouble();
res_sd = infoData.value("res_sd").toDouble();
max_res = infoData.value("max_res").toDouble();
min_res = infoData.value("min_res").toDouble();
xc_sd = infoData.value("xc_sd").toDouble();
auto_time = infoData.value("auto_time").toInt();
name = infoData.value("name").toString();
chexing = infoData.value("chexing").toString();
pwd = infoData.value("pwd").toString();
// qDebug() << "all_count" << all_count;
detect = QString("%1Ω ±%2%").arg(res_value).arg(res_sd);
// qDebug() << "Detect string:" << detect;
ui->user_data_lineEdit_1->setText(chexing);
ui->name_lineEdit->setText(name);
ui->res_max_lineEdit_1->setText(QString::number(res_value));
ui->res_max_lineEdit_2->setText(QString::number(res_sd));
ui->auto_value_lineEdit_1->setText(QString::number(auto_time));
ui->xc_lineEdit->setText(QString::number(xc_sd));
// ui->set_tx_lineEdit_1->text();
// ui->bj_1_lineEdit_0->text();
}
void MainWindow::on_pushButton_2_clicked()
{
QString filePath = QFileDialog::getSaveFileName(this, tr("Save PDF"), "", tr("PDF Files (*.pdf)"));
if (!filePath.isEmpty())
{
QFile resourceFile(":/res/user.pdf");
if (resourceFile.open(QIODevice::ReadOnly))
{
QFile outputFile(filePath);
if (outputFile.open(QIODevice::WriteOnly))
{
outputFile.write(resourceFile.readAll());
outputFile.close();
QDesktopServices::openUrl(QUrl::fromLocalFile(filePath));
}
else
{
QMessageBox::warning(this, tr("Error"), tr("Cannot open output file for writing."));
}
resourceFile.close();
}
else
{
QMessageBox::warning(this, tr("Error"), tr("Cannot open resource file."));
}
}
}
void MainWindow::playQualified()
{
player->setMedia(QUrl("qrc:/res/ok.wav"));
player->setVolume(100);
player->play();
}
void MainWindow::playUnqualified()
{
player->setMedia(QUrl("qrc:/res/no.wav"));
player->setVolume(100);
player->play();
}
void MainWindow::playConnState_ok()
{
player->setMedia(QUrl("qrc:/res/auto_conn_ok.wav"));
player->setVolume(100);
player->play();
}
void MainWindow::playConnState_no()
{
player->setMedia(QUrl("qrc:/res/auto_conn_no.wav"));
player->setVolume(100);
player->play();
}
void MainWindow::play_get_err()
{
player->setMedia(QUrl("qrc:/res/get_err.wav"));
player->setVolume(100);
player->play();
}
void MainWindow::play_no_conn_res()
{
player->setMedia(QUrl("qrc:/res/no_conn_res.wav"));
player->setVolume(100);
player->play();
}
void MainWindow::dispscan(const QString barcode)
{
// 有扫码数据时关闭提示标签
if (scanTipLabel != nullptr)
{
scanTipLabel->close();
scanTipLabel->deleteLater();
scanTipLabel = nullptr;
}
// 扫码逻辑:
// 1. 如果两个框都有值,说明开始新一轮,先清空再从护面开始
// 2. 如果护面框为空,输入到护面框
// 3. 如果护面框有值但加热框为空,输入到加热框
bool sm_has_value = !ui->user_data_lineEdit_2->text().isEmpty();
bool hot_has_value = !ui->user_data_lineEdit_3->text().isEmpty();
if (sm_has_value && hot_has_value)
{
// 两个框都有值,开始新一轮,先清空
ui->user_data_lineEdit_2->clear();
ui->user_data_lineEdit_3->clear();
sm_num = "";
hot_num = "";
// 然后输入到护面框
sm_num = barcode;
ui->user_data_lineEdit_2->setText(barcode);
ui->tishi_label->setText("护面扫码成功");
}
else if (!sm_has_value)
{
// 护面框为空,输入到护面框
sm_num = barcode;
ui->user_data_lineEdit_2->setText(barcode);
ui->tishi_label->setText("护面扫码成功");
}
else
{
// 护面框有值,加热框为空,输入到加热框
hot_num = barcode;
ui->user_data_lineEdit_3->setText(barcode);
ui->tishi_label->setText("加热垫扫码成功");
}
QMediaPlayer *player1 = new QMediaPlayer(this);
// 设置媒体文件
player1->setMedia(QUrl("qrc:/res/sm.wav"));
player1->setVolume(100);
// 连接信号,当播放结束时释放 player1
connect(player1, &QMediaPlayer::stateChanged, this, [player1](QMediaPlayer::State state)
{
if (state == QMediaPlayer::StoppedState) {
player1->deleteLater(); // 延迟释放
} });
// 播放音频
player1->play();
}
void MainWindow::on_delete_1_button_clicked_func()
{
if (auto_mode)
{
ui->auto_label->setText("自动关闭");
auto_mode = false;
timer->stop();
}
QString userInput1 = ui->delete_res_lineEdit_0->text();
bool ok;
int value1 = userInput1.toInt(&ok);
if (!ok)
{
ui->delete_res_lineEdit_0->setText("输入无效: 请输入有效的数字");
ui->delete_res_lineEdit_0->setStyleSheet("QLabel { color : red; }");
return;
}
int rec_flag = DatabaseUtils::delete_ResData(value1);
if (rec_flag == 0)
{
ui->delete_res_lineEdit_0->setText("");
QMessageBox::warning(this, "设置失败", "ID不存在");
}
else if (rec_flag == 1)
{
on_nextPageButton_clicked();
on_prevPageButton_clicked();
ui->delete_res_lineEdit_0->setText("");
QMessageBox::warning(this, "设置成功", "已修改");
}
else
{
ui->delete_res_lineEdit_0->setText("");
QMessageBox::warning(this, "设置失败", "请重新设置");
}
// if(auto_mode){
// ui->auto_label->setText("自动关闭");
// auto_mode = false;
// timer->stop();
// }
// QString userInput1 = ui->delete_res_lineEdit_2->text();
// QString userInput2 = ui->delete_res_lineEdit_2->text();
// QString userInput3 = ui->delete_res_lineEdit_2->text();
// bool ok;
// int value2 = userInput2.toInt(&ok);
// if (!ok) {
// ui->delete_res_lineEdit_2->setText("输入无效: 请输入有效的数字");
// ui->delete_res_lineEdit_2->setStyleSheet("QLabel { color : red; }");
// return;
// }
// int value3 = userInput3.toInt(&ok);
// if (!ok) {
// ui->delete_res_lineEdit_2->setText("输入无效: 请输入有效的数字");
// ui->delete_res_lineEdit_2->setStyleSheet("QLabel { color : red; }");
// return;
// }
// QString hexValue2 = QString("%1").arg(value2, 4, 16, QLatin1Char('0')).toUpper();
// QString hexValue3 = QString("%1").arg(value3, 4, 16, QLatin1Char('0')).toUpper();
// QString command1;
// if (userInput1 == "0") {
// command1 = "011003ED0003060000";
// } else if (userInput1 == "1") {
// command1 = "011003ED0003060001";
// } else if (userInput1 == "2") {
// command1 = "011003ED0003060002";
// } else if (userInput1 == "3") {
// command1 = "011003ED0003060003";
// } else {
// ui->delete_res_lineEdit_2->setText("输入无效: 请输入0到4之间的数字");
// ui->delete_res_lineEdit_2->setStyleSheet("QLabel { color : red; }");
// return;
// }
// command1 += hexValue2;
// command1 += hexValue3;
// bool rec_flag = serialPortManager->sendModbus_receive_2(command1, 6);
// delay(10);
// if(rec_flag == false){
// QMessageBox::warning(this, "设置失败", "请重新设置");
// } else {
// QMessageBox::warning(this, "设置成功", "已修改");
}
void MainWindow::on_delete_2_button_clicked_func()
{
if (auto_mode)
{
ui->auto_label->setText("自动关闭");
auto_mode = false;
timer->stop();
}
QString userInput2 = ui->delete_res_lineEdit_1->text();
QString userInput3 = ui->delete_res_lineEdit_2->text();
bool ok;
int value2 = userInput2.toInt(&ok);
if (!ok)
{
ui->delete_res_lineEdit_1->setText("输入无效: 请输入有效的数字");
ui->delete_res_lineEdit_1->setStyleSheet("QLabel { color : red; }");
return;
}
int value3 = userInput3.toInt(&ok);
if (!ok)
{
ui->delete_res_lineEdit_2->setText("输入无效: 请输入有效的数字");
ui->delete_res_lineEdit_2->setStyleSheet("QLabel { color : red; }");
return;
}
int rec_flag = -1;
int flag = 1;
int temp = -1;
for (int i = value2; i <= value3; i++)
{
temp = DatabaseUtils::delete_ResData(i);
if (temp == 1)
{
rec_flag = 1;
flag = 0;
}
else if ((temp == 0) && flag)
{
rec_flag = 0;
}
}
if (rec_flag == 0)
{
ui->delete_res_lineEdit_1->setText("");
ui->delete_res_lineEdit_2->setText("");
QMessageBox::warning(this, "设置失败", "ID都不存在");
}
else if (rec_flag == 1)
{
on_nextPageButton_clicked();
on_prevPageButton_clicked();
ui->delete_res_lineEdit_1->setText("");
ui->delete_res_lineEdit_2->setText("");
QMessageBox::warning(this, "设置成功", "已修改");
}
else
{
ui->delete_res_lineEdit_1->setText("");
ui->delete_res_lineEdit_2->setText("");
QMessageBox::warning(this, "设置失败", "请重新设置");
}
}
void MainWindow::on_pwd_button_clicked_func()
{
QString userInput = ui->pwd_lineEdit->text();
if (userInput.length() > 8)
{
ui->pwd_lineEdit->setText("");
QMessageBox::warning(this, "设置失败", "密码长度不能超过8个字符请重新输入");
return;
}
bool save_flag = DatabaseUtils::update_Info_t("pwd", userInput);
pwd = userInput;
if (save_flag == false)
{
ui->pwd_lineEdit->setText("");
QMessageBox::warning(this, "设置失败", "请重新设置");
}
else
{
ui->pwd_lineEdit->setText("");
QMessageBox::warning(this, "设置成功", "请记住密码");
}
}
void MainWindow::onShowPasswordDialog()
{
PasswordDialog *passwordDialog = new PasswordDialog(this);
// passwordDialog->setWindowModality(Qt::ApplicationModal); // 设置为模态对话框
passwordDialog->show();
// connect(passwordDialog, &PasswordDialog::accepted, this, &MainWindow::onPasswordDialogAccepted);
// 获取发送信号的对象
QObject *senderObj = sender();
senderButton = qobject_cast<QPushButton *>(senderObj);
// 连接对话框的 accepted 信号到 的槽函数
connect(passwordDialog, &PasswordDialog::accepted, this, &MainWindow::onPasswordAccepted);
}
void MainWindow::onPasswordAccepted()
{
PasswordDialog *passwordDialog = qobject_cast<PasswordDialog *>(sender());
if (passwordDialog)
{
QString password = passwordDialog->getPassword();
qDebug() << "password:" << password;
if (password == pwd)
{
if (senderButton)
{
if (senderButton == ui->xc_button)
{
on_xc_button_clicked_func();
}
else if (senderButton == ui->pwd_button)
{
on_pwd_button_clicked_func();
}
else if (senderButton == ui->name_button)
{
on_name_button_clicked_func();
}
else if (senderButton == ui->auto_value_button)
{
on_auto_value_button_clicked_func();
}
else if (senderButton == ui->res_max_button)
{
on_res_max_button_clicked_func();
}
else if (senderButton == ui->delete_1_button)
{
on_delete_1_button_clicked_func();
}
else if (senderButton == ui->delete_2_button)
{
on_delete_2_button_clicked_func();
}
}
senderButton = NULL;
}
else
{
senderButton = NULL;
QMessageBox::warning(this, "密码错误", "请检查密码");
}
}
}