#include #include "bacteria.h" #include "ui_bacteria.h" #include #include "IMVDefines.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include bool save=true;//菌落计数手动矫正的判断 int count; QString id2; QString savelujing; QString savePath3;//系统命名--前 QString savePath4;//系统命名--处理后 QString xtshoudong;//系统命名--处理后 QString savePath;//自命名--前 QString savePath2;//自命名--处理后 QString zmshoudong;//自命名--处理后 QSqlDatabase db; // extern int shang; // extern int xia; // extern int banjing; bacteria::bacteria(QWidget *parent) : QWidget(parent), ui(new Ui::bacteria) { ui->setupUi(this); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateCount())); connect(&m_cammer,SIGNAL(xinhao(QString)),this, SLOT(getxinhao(QString))); list_cameras = QMediaDevices::videoInputs(); //判断设备数(设置最多两个设备,没有则不会读取设备信息) ui->tableWidget_3->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->tableWidget_3->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_bachistoricalrecords=new bachistoricalrecords; connect( m_bachistoricalrecords, &bachistoricalrecords::fanhui, this, [=](){this->showMaximized();m_bachistoricalrecords->hide();}); ui->pushButton->setFixedSize(100,30); ui->pushButton_2->setFixedSize(120,35); ui->pushButton_13->setFixedSize(120,35); ui->pushButton_14->setFixedSize(120,35); ui->pushButton->setFixedSize(92,37); ui->pushButton_6->setFixedSize(92,37); ui->pushButton_4->setFixedSize(92,37); ui->pushButton_5->setFixedSize(92,37); ui->pushButton_4->setHidden(true); ui->label_5->setHidden(true); //ui->widget_3->setHidden(true); ui->pushButton->setEnabled(false); //ui->label_4->setAlignment(Qt::AlignTop | Qt::AlignLeft); connect(this,&bacteria::shuaxin,m_bachistoricalrecords,&bachistoricalrecords::getshuaxin); connect(m_bachistoricalrecords, SIGNAL(guan()), this, SLOT(getguan())); connect(m_bachistoricalrecords, &bachistoricalrecords::tuichu2, this, [=](){emit tuichu();}); ui->tableWidget_3->setColumnCount(3); // 设置第一列宽度,示例为100像素 ui->tableWidget_3->setColumnWidth(1, 0); // 将第二列(列索引为1)的宽度设置为0,实现隐藏效果 ui->tableWidget_3->setColumnWidth(2, 0); ui->tableWidget_3->horizontalHeader()->setVisible(false); ui->tableWidget_3->verticalHeader()->setVisible(false); connect(ui->tableWidget_3, &QTableWidget::itemClicked, this, &bacteria::on_tableWidget_3_itemClicked); ui->horizontalSlider->setMaximum(255); ui->horizontalSlider->setValue(76); ui->horizontalSlider_2->setValue(0); ui->horizontalSlider_2->setMaximum(255); ui->horizontalSlider_5->setMaximum(255); ui->horizontalSlider_6->setMaximum(255); ui->horizontalSlider_2->setFixedWidth(150); ui->horizontalSlider->setFixedWidth(150); ui->horizontalSlider_5->setFixedWidth(150); ui->horizontalSlider_6->setFixedWidth(150); ui->horizontalSlider_7->setFixedWidth(150); ui->frame->setFixedSize(1550,907); ui->frame_2->setFixedSize(180,907); ui->widget_2->setFixedHeight(40); ui->widget_3->setFixedSize(750,750); ui->label_5->setFixedSize(750,750); ui->label_4->setFixedSize(750,750); ui->frame_3->setFixedSize(750,750); ui->tableWidget_3->setFixedSize(170,886); ui->tableWidget_3->setColumnWidth(0, 170); QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this); //设置阴影距离 shadow->setOffset(0, 0); //设置阴影颜色 shadow->setColor(QColor(214, 214, 214)); //设置阴影圆角 shadow->setBlurRadius(30); //给嵌套QWidget设置阴影 ui->frame_2->setGraphicsEffect(shadow); QGraphicsDropShadowEffect *shadow2 = new QGraphicsDropShadowEffect(this); //设置阴影距离 shadow2->setOffset(0, 0); //设置阴影颜色 shadow2->setColor(QColor(214, 214, 214)); //设置阴影圆角 shadow2->setBlurRadius(30); //给嵌套QWidget设置阴影 ui->frame->setGraphicsEffect(shadow2); ui->horizontalSlider->setEnabled(false); ui->horizontalSlider_2->setEnabled(false); ui->horizontalSlider_5->setEnabled(false); ui->horizontalSlider_6->setEnabled(false); ui->horizontalSlider_7->setEnabled(false); ui->horizontalSlider->setHidden(true); ui->horizontalSlider_2->setHidden(true); ui->horizontalSlider_5->setHidden(true); ui->horizontalSlider_6->setHidden(true); ui->horizontalSlider_7->setHidden(true); ui->label_7->setHidden(true); ui->label_8->setHidden(true); ui->label_14->setHidden(true); ui->label_16->setHidden(true); ui->label_18->setHidden(true); ui->label_5->setHidden(false); ui->label_4->setHidden(true); // QString filePath="C:/Users/20486/Desktop/danna/use/xijun/2025-03-04/10-21-00_Y.png"; // QPixmap pixmap(filePath); // if (!pixmap.isNull()) { // ui->label_4->setPixmap(pixmap); // ui->label_4->setScaledContents(true); // 设置图片自动缩放以适应QLabel大小 // }else{ // qDebug()<<"zhaopianweikong11111111111111111111111"; // } ui->label_3->setHidden(true); ui->pushButton_3->setHidden(true); ui->pushButton_5->setHidden(true); m_msgBox=new msgBox; m_zidingyi=new zidingyi; connect(m_zidingyi, SIGNAL(ming(QString)),this, SLOT(getming(QString))); connect(m_zidingyi,&zidingyi::quxiao,this,[=](){jixu=false;}); ui->tableWidget_3->setRowCount(100); int rowCount = ui->tableWidget_3->rowCount(); for (int i = 0; i < rowCount; ++i) { ui->tableWidget_3->setRowHeight(i, 170); } connect(this,&bacteria::show,this,&bacteria::showtu); ui->pushButton_10->setHidden(true); ui->pushButton_9->setHidden(true); ui->pushButton_11->setHidden(true); ui->pushButton_12->setHidden(true); installEventFilter(this); ui->pushButton_14->setHidden(true); } bacteria::~bacteria() { delete ui; } void bacteria::getming(QString s) { jixu=true; ui->label_3->setText(s); m_msgBox->show(); } void bacteria::on_tableWidget_3_itemClicked(QTableWidgetItem *item) { if(save==false) { QMessageBox::information(NULL,"保存","请先保存照片", QMessageBox::Ok | QMessageBox::Cancel); }else{ // 获取点击的单元格所在的行索引 int row = item->row(); // 获取该行第一列对应的QTableWidgetItem,假设第一列存放图片路径相关信息 QTableWidgetItem *pixmapItem = ui->tableWidget_3->item(row, 1); QTableWidgetItem *Item2 = ui->tableWidget_3->item(row, 2); ui->label_2->setText(Item2->text()); qDebug()<text(); qDebug()<text(); if (pixmapItem) { // 获取之前设置的图片路径 QString filePath = pixmapItem->text(); qDebug()<label_4->setHidden(false); ui->label_5->setHidden(true);; ui->label_4->setPixmap(pixmap); ui->label_4->setScaledContents(true); // 设置图片自动缩放以适应QLabel大小 } } } } void bacteria::mousePressEvent(QMouseEvent *event) { qDebug() << "点击了" ; if (ui->label_4->geometry().adjusted(-50, -50, 50, 50).contains(event->pos())) { if (event->button() == Qt::LeftButton) { count++; QPixmap pixmap = ui->label_4->pixmap(); int pixmapWidth = pixmap.width(); int pixmapHeight = pixmap.height(); int labelWidth = ui->label_4->width(); int labelHeight = ui->label_4->height(); double scaleX = (double)labelWidth / pixmapWidth; double scaleY = (double)labelHeight / pixmapHeight; QPoint posInLabel = event->pos() - ui->label_4->pos(); int adjustedX = (int)(posInLabel.x() / scaleX); int adjustedY = (int)(posInLabel.y() / scaleY); QPoint adjustedPos(adjustedX-60, adjustedY-60); qDebug() << adjustedPos; drawOnLabelPixmap(ui->label_4, adjustedPos); ui->label_2->setText(QString::number(count)); leftClickPoints.append(event->pos()); } else if (event->button() == Qt::RightButton) { count--; QPixmap pixmap = ui->label_4->pixmap(); int pixmapWidth = pixmap.width(); int pixmapHeight = pixmap.height(); int labelWidth = ui->label_4->width(); int labelHeight = ui->label_4->height(); double scaleX = (double)labelWidth / pixmapWidth; double scaleY = (double)labelHeight / pixmapHeight; QPoint posInLabel = event->pos() - ui->label_4->pos(); int adjustedX = (int)(posInLabel.x() / scaleX); int adjustedY = (int)(posInLabel.y() / scaleY); QPoint adjustedPos(adjustedX-60, adjustedY-60); drawOnLabelPixmap2(ui->label_4, adjustedPos); ui->label_2->setText(QString::number(count)); rightClickPoints.append(event->pos()); } } } void bacteria::drawOnLabelPixmap(QLabel* label, QPoint adjustedPos) { QPixmap pixmap = label->pixmap(); if (!pixmap.isNull()) { QImage image = pixmap.toImage(); QPainter painter(&image); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::NoPen); painter.setBrush(Qt::blue); int yuan=radius; qDebug() << "yuan:" << yuan; painter.drawEllipse(adjustedPos.x(), adjustedPos.y(), 50,50); painter.end(); label->setPixmap(QPixmap::fromImage(image)); } else { // 如果QLabel没有设置Pixmap,进行相应处理 qDebug() << "QLabel does not have a Pixmap set."; } } void bacteria::drawOnLabelPixmap2(QLabel* label, QPoint adjustedPos) { QPixmap pixmap = label->pixmap(); if (!pixmap.isNull()) { QImage image = pixmap.toImage(); QPainter painter(&image); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::NoPen); painter.setBrush(Qt::white); int yuan=radius; qDebug() << "yuan:" << yuan; painter.drawEllipse(adjustedPos.x(), adjustedPos.y(), 50,50); painter.end(); label->setPixmap(QPixmap::fromImage(image)); } else { // 如果QLabel没有设置Pixmap,进行相应处理 qDebug() << "QLabel does not have a Pixmap set."; } } void bacteria::wheelEvent(QWheelEvent *event) { if (event->angleDelta().y() > 0) { if (radius < 20) { radius++; } } else { if (radius > 1) { radius--; } } qDebug() << "当前值为:" << radius; update(); } void bacteria::getxinhao(QString p) { qDebug()<<"getxinhao"; // a=1; // QString aFile=QString("use/1.png"); // QPixmap p; // p.load(aFile); ui->label_5->setPixmap(p); ui->label_5->setScaledContents(true); // usepython(); }//线程函数,定义为普通全局函数 DWORD WINAPI MyThreadFunction(LPVOID lpParam) { // 设置Python环境 Py_SetPythonHome(L"C:/ProgramData/Anaconda3"); Py_Initialize(); PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.argv = ['python.py']"); PyRun_SimpleString("sys.path.append('./')"); // 导入模块 PyObject* pModule = PyImport_ImportModule("cell_count"); if (!pModule) { PyErr_Print(); qDebug() << "Can't open python file!\n"; // return; // 如果模块加载失败,提前返回 } else { qDebug() << "Python file has been opened"; } // 获取函数 PyObject* pFunhello = PyObject_GetAttrString(pModule, "main"); if (!pFunhello || !PyCallable_Check(pFunhello)) { PyErr_Print(); qDebug() << "Get function 'main' failed or is not callable"; Py_XDECREF(pFunhello); Py_DECREF(pModule); //return; // 确保在失败情况下提前返回 } // 传参 PyObject* args = PyTuple_New(2); if (!args) { PyErr_Print(); qDebug() << "Failed to create argument tuple"; Py_DECREF(pFunhello); Py_DECREF(pModule); // return; } PyObject* arg1 = PyUnicode_FromString(savelujing.toUtf8().constData()); PyObject* arg2 = PyUnicode_FromString(savePath4.toUtf8().constData()); PyTuple_SetItem(args, 0, arg1); // arg1 PyTuple_SetItem(args, 1, arg2); // arg2 - 这里仍需注意,将直接把 arg1 和 arg2 的引用设置到args中 // 调用函数 PyObject* result = PyObject_CallObject(pFunhello, args); Py_DECREF(args); // 因为在PyTuple_SetItem中会管理内存,调用完要释放 if (!result) { PyErr_Print(); qDebug() << "Call function failed"; } else { // 处理返回值 if (PyLong_Check(result)) { long returned_value = PyLong_AsLong(result); qDebug() << "Function returned an integer value: " << returned_value; count = returned_value; // emit show(); } else { qDebug() << "Function did not return an integer as expected"; } Py_DECREF(result); // 释放返回值 } Py_DECREF(pFunhello); // 释放函数引用 Py_DECREF(pModule); // 释放模块引用 return 0; } void bacteria::usepython() { //设置Python环境 Py_SetPythonHome(L"C:/ProgramData/Anaconda3"); Py_Initialize(); PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.argv = ['python.py']"); PyRun_SimpleString("sys.path.append('./')"); // 导入模块 PyObject* pModule = PyImport_ImportModule("cell_count"); if (!pModule) { PyErr_Print(); qDebug() << "Can't open python file!\n"; QMessageBox::information(NULL, "提示", "图片识别有误,请重试"); m_msgBox->close(); return; // 提前返回避免继续执行 } else { qDebug() << "Python file has been opened"; } // 获取函数 PyObject* pFunhello = PyObject_GetAttrString(pModule, "main"); if (!pFunhello || !PyCallable_Check(pFunhello)) { PyErr_Print(); qDebug() << "Get function 'main' failed or is not callable"; Py_XDECREF(pFunhello); Py_DECREF(pModule); QMessageBox::information(NULL, "提示", "图片识别有误,请重试"); m_msgBox->close(); return; // 提前返回避免继续执行 } // 传参 PyObject* args = PyTuple_New(2); if (!args) { PyErr_Print(); qDebug() << "Failed to create argument tuple"; Py_DECREF(pFunhello); Py_DECREF(pModule); QMessageBox::information(NULL, "提示", "图片识别有误,请重试"); m_msgBox->close(); return; // 提前返回避免继续执行 } QString pythontu; if(!eventFilterEnabled){ //如果进入审查模式 pythontu= ui->label_3->text().isEmpty() ?xtshoudong:zmshoudong; }else{ pythontu= ui->label_3->text().isEmpty() ?savePath4:savePath2; } PyObject* arg1 = PyUnicode_FromString(savelujing.toUtf8().constData()); PyObject* arg2 = PyUnicode_FromString(pythontu.toUtf8().constData()); QString param; if (ui->label_3->text().isEmpty()) { param = savePath4; } else { param = savePath2; } // 打印传入的参数 qDebug() << "传入 PyUnicode_FromString 的参数是: " << param; PyTuple_SetItem(args, 0, arg1); // arg1 PyTuple_SetItem(args, 1, arg2); // arg2 - 这里仍需注意,将直接把 arg1 和 arg2 的引用设置到args中 // 调用函数 PyObject* result = PyObject_CallObject(pFunhello, args); Py_DECREF(args); // 因为在PyTuple_SetItem中会管理内存,调用完要释放 if (!result) { PyErr_Print(); qDebug() << "Call function failed"; QMessageBox::information(NULL, "提示", "图片识别有误,请重试"); m_msgBox->close(); return; // 提前返回避免继续执行 } else { // 处理返回值 if (PyLong_Check(result)) { long returned_value = PyLong_AsLong(result); qDebug() << "返回数字 " << returned_value; int value=returned_value*1.15; count = value; qDebug() << "显示数字 " << value; ui->label_2->setText(QString::number(value)); emit show(); } else { qDebug() << "Function did not return an integer as expected"; } Py_DECREF(result); // 释放返回值 } Py_DECREF(pFunhello); // 释放函数引用 Py_DECREF(pModule); // 释放模块引用 } void bacteria::usepython_slow(QString yuan,QString jie) { //设置Python环境 Py_SetPythonHome(L"C:/ProgramData/Anaconda3"); Py_Initialize(); PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.argv = ['python.py']"); PyRun_SimpleString("sys.path.append('./')"); // 导入模块 PyObject* pModule = PyImport_ImportModule("main_script2"); if (!pModule) { PyErr_Print(); qDebug() << "Can't open python file!\n"; QMessageBox::information(NULL, "提示", "图片识别有误,请重试"); m_msgBox->close(); return; // 提前返回避免继续执行 } else { qDebug() << "Python file has been opened"; } // 获取函数 PyObject* pFunhello = PyObject_GetAttrString(pModule, "main"); if (!pFunhello || !PyCallable_Check(pFunhello)) { PyErr_Print(); qDebug() << "Get function 'main' failed or is not callable"; Py_XDECREF(pFunhello); Py_DECREF(pModule); QMessageBox::information(NULL, "提示", "图片识别有误,请重试"); m_msgBox->close(); return; // 提前返回避免继续执行 } // 传参 PyObject* args = PyTuple_New(2); if (!args) { PyErr_Print(); qDebug() << "Failed to create argument tuple"; Py_DECREF(pFunhello); Py_DECREF(pModule); QMessageBox::information(NULL, "提示", "图片识别有误,请重试"); m_msgBox->close(); return; // 提前返回避免继续执行 } // PyObject* arg1 = PyUnicode_FromString("use/xijun/q.jpg"); // PyObject* arg2 = PyUnicode_FromString("use/xijun/y.jpg"); //实际运用 PyObject* arg1 = PyUnicode_FromString(yuan.toUtf8().constData()); PyObject* arg2 = PyUnicode_FromString(jie.toUtf8().constData()); PyTuple_SetItem(args, 0, arg1); PyTuple_SetItem(args, 1, arg2); QString param; if (ui->label_3->text().isEmpty()) { param = savePath4; } else { param = savePath2; } // 打印传入的参数 qDebug() << "传入 PyUnicode_FromString 的参数是: " << param; PyTuple_SetItem(args, 0, arg1); // arg1 PyTuple_SetItem(args, 1, arg2); // arg2 - 这里仍需注意,将直接把 arg1 和 arg2 的引用设置到args中 // 调用函数 PyObject* result = PyObject_CallObject(pFunhello, args); Py_DECREF(args); // 因为在PyTuple_SetItem中会管理内存,调用完要释放 if (!result) { PyErr_Print(); qDebug() << "Call function failed"; QMessageBox::information(NULL, "提示", "图片识别有误,请重试"); m_msgBox->close(); return; // 提前返回避免继续执行 } else { // 处理返回值 if (PyLong_Check(result)) { long returned_value = PyLong_AsLong(result); qDebug() << "返回数字 " << returned_value; int value=returned_value*1.15; count = value; qDebug() << "显示数字 " << value; ui->label_2->setText(QString::number(value)); emit show(); } else { qDebug() << "Function did not return an integer as expected"; } Py_DECREF(result); // 释放返回值 } Py_DECREF(pFunhello); // 释放函数引用 Py_DECREF(pModule); // 释放模块引用 } void bacteria::usepython_quick(QString yuan,QString jie) { //设置Python环境 Py_SetPythonHome(L"C:/ProgramData/Anaconda3"); Py_Initialize(); PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.argv = ['python.py']"); PyRun_SimpleString("sys.path.append('./')"); // 导入模块 PyObject* pModule = PyImport_ImportModule("cell_count"); if (!pModule) { PyErr_Print(); qDebug() << "Can't open python file!\n"; QMessageBox::information(NULL, "提示", "图片识别有误,请重试"); m_msgBox->close(); return; // 提前返回避免继续执行 } else { qDebug() << "Python file has been opened"; } // 获取函数 PyObject* pFunhello = PyObject_GetAttrString(pModule, "main"); if (!pFunhello || !PyCallable_Check(pFunhello)) { PyErr_Print(); qDebug() << "Get function 'main' failed or is not callable"; Py_XDECREF(pFunhello); Py_DECREF(pModule); QMessageBox::information(NULL, "提示", "图片识别有误,请重试"); m_msgBox->close(); return; // 提前返回避免继续执行 } // 传参 PyObject* args = PyTuple_New(2); if (!args) { PyErr_Print(); qDebug() << "Failed to create argument tuple"; Py_DECREF(pFunhello); Py_DECREF(pModule); QMessageBox::information(NULL, "提示", "图片识别有误,请重试"); m_msgBox->close(); return; // 提前返回避免继续执行 } // PyObject* arg1 = PyUnicode_FromString("use/1.png"); // PyObject* arg2 = PyUnicode_FromString("use/2.png"); //实际运用 PyObject* arg1 = PyUnicode_FromString(yuan.toUtf8().constData()); PyObject* arg2 = PyUnicode_FromString(jie.toUtf8().constData()); PyTuple_SetItem(args, 0, arg1); PyTuple_SetItem(args, 1, arg2); // 打印传入的参数 qDebug() << "传入 PyUnicode_FromString 的参数是: " <close(); return; // 提前返回避免继续执行 } else { // 处理返回值 if (PyLong_Check(result)) { long returned_value = PyLong_AsLong(result); qDebug() << "返回数字 " << returned_value; int value=returned_value*1.15; count = value; qDebug() << "显示数字 " << value; ui->label_2->setText(QString::number(value)); emit show(); } else { qDebug() << "Function did not return an integer as expected"; } Py_DECREF(result); // 释放返回值 } Py_DECREF(pFunhello); // 释放函数引用 Py_DECREF(pModule); // 释放模块引用 } //拍照 void bacteria::on_pushButton_clicked() { if(save==false) { int ok=QMessageBox::information(NULL,"保存","请先保存照片", QMessageBox::Ok | QMessageBox::Cancel); if (ok == QMessageBox::Ok) { } }else{ if(ui->pushButton_2->text()=="已连接") { if(!f.isRunning()){ ui->label_4->setHidden(true); ui->label_5->clear(); ui->label_2->clear(); ui->label_5->setHidden(false); m_msgBox->close(); m_zidingyi->exec(); m_zidingyi->focus(); QString folderName; QString timeStamp = QDate::currentDate().toString("yyyy-MM-dd"); folderName = "use/xijun/" + timeStamp; QString timeStampFull = QTime::currentTime().toString("hh-mm-ss"); savePath3 = folderName + "/" + timeStampFull + "_Y" + ".png"; savePath4 = folderName + "/" + timeStampFull + "_J" + ".png"; xtshoudong=folderName + "/" + timeStampFull + "_C" + ".png"; QString zidingyi=ui->label_3->text(); savePath = folderName + "/" + zidingyi + "_Y" + ".png"; savePath2 = folderName + "/" + zidingyi + "_J" + ".png"; zmshoudong=folderName + "/" + zidingyi + "_C" + ".png"; if(jixu==true){ QTimer::singleShot(1,this,[=](){m_cammer.zhuapai();}); QTimer::singleShot(500,this,[=](){ qDebug() << "定时器触发"; // 调试信息 a=1; QPixmap p; // if(p.load("use/1.png")) if(p.load(savelujing)) { ui->label_5->setScaledContents(true); ui->label_5->setPixmap(p); QTimer::singleShot(1000,this,[=](){ qDebug() << "开始尝试调用算法"; // DWORD result = WaitForSingleObject(hthread, 0); // if (result == WAIT_TIMEOUT) { // qDebug() << "Thread is running."; // } // else{//hthread = CreateThread(NULL, 0, MyThreadFunction, NULL, 0, NULL); // } // usepython_quick(savelujing,ui->label_3->text().isEmpty() ?savePath4 :savePath2); usepython(); // f = QtConcurrent::run(&bacteria::usepython, this); qDebug()<<"开启线程"; } ); } else { qDebug() << "图片加载失败: " ; } }); }; } else{ QMessageBox::information(NULL, "提示", "图片正在处理中,请稍后" );qDebug()<<"线程还没有结束";} }else{ QMessageBox::information(NULL, "提示", "请先连接相机" ); } } } void bacteria::showtu() { qDebug()<<"已经得到返回值" "开始显示图片"; // 关闭线程句柄 //CloseHandle(hthread); ui->label_5->setHidden(true); ui->label_4->setHidden(false); if(ui->label_3->text().isEmpty()){ ui->label_4->setPixmap(savePath4); ui->label_4->setScaledContents(true); QPixmap pixmap2 = ui->label_4->pixmap(); // QString kupath1 = "C:/Users/20486/Desktop/xijun1.3/build/Desktop_Qt_6_5_3_MinGW_64_bit-Debug/"+savePath3; // QString kupath2 = "C:/Users/20486/Desktop/xijun1.3/build/Desktop_Qt_6_5_3_MinGW_64_bit-Debug/"+savePath4; // 开启事务,确保操作的原子性 db.transaction(); // 第一步:更新现有行的 xuhao,使其序号依次加 1 // 从最大的 xuhao 开始递减更新,避免 xuhao 冲突 QSqlQuery updateQuery(db); updateQuery.prepare("SELECT MAX(xuhao) FROM xijun"); if (updateQuery.exec() && updateQuery.next()) { int maxXuhao = updateQuery.value(0).toInt(); for (int i = maxXuhao; i >= 1; --i) { QSqlQuery updateXuhaoQuery(db); updateXuhaoQuery.prepare("UPDATE xijun SET xuhao = :newXuhao WHERE xuhao = :oldXuhao"); updateXuhaoQuery.bindValue(":newXuhao", i + 1); updateXuhaoQuery.bindValue(":oldXuhao", i); if (!updateXuhaoQuery.exec()) { qDebug() << "更新 xuhao 失败:" << updateXuhaoQuery.lastError().text(); // 回滚事务 db.rollback(); return; } } } else { qDebug() << "获取最大 xuhao 失败:" << updateQuery.lastError().text(); // 回滚事务 db.rollback(); return; } // 新增:插入多列数据 QSqlQuery query(db); query.prepare("INSERT INTO xijun (xuhao,name, time, yuanshi, jieguo, jishu) VALUES (:xuhao,:name, :time, :yuanshi, :jieguo, :jishu)"); query.bindValue(":xuhao", 1); query.bindValue(":name", id2); query.bindValue(":time", gettime()); query.bindValue(":yuanshi", savePath3); query.bindValue(":jieguo", savePath4); query.bindValue(":jishu", ui->label_2->text()); if (!query.exec()) { qDebug() << "插入多列数据失败:" << query.lastError().text(); // 回滚事务 db.rollback(); return; } // 提交事务 if (db.commit()) { qDebug() << "数据插入并重新排序成功"; } else { qDebug() << "事务提交失败:" << db.lastError().text(); } m_msgBox->close(); emit shuaxin(); a=0; ui->horizontalSlider_5->setEnabled(false); ui->horizontalSlider_6->setEnabled(false); ui->horizontalSlider_7->setEnabled(false); ui->tableWidget_3->insertRow(row); QTableWidgetItem *filePathItem = new QTableWidgetItem(); filePathItem->setText(savePath4); QTableWidgetItem *filePathItem2 = new QTableWidgetItem(); filePathItem2->setText(QString::number(count)); QTableWidgetItem *pixmapItem = new QTableWidgetItem(); pixmap2 = pixmap2.scaled(175,175, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmapItem->setIcon(QIcon(pixmap2)); ui->tableWidget_3->setIconSize(QSize(175,175)); ui->tableWidget_3->setRowHeight(row,170); ui->tableWidget_3->setItem(row, 1, filePathItem); ui->tableWidget_3->setItem(row, 0, pixmapItem); ui->tableWidget_3->setItem(row, 2, filePathItem2); QtConcurrent::run(&bacteria::savezhao, this); } else{ ui->label_4->setPixmap(savePath2); ui->label_4->setScaledContents(true); QString zidingyi=ui->label_3->text(); QPixmap pixmap = ui->label_5->pixmap(); QPixmap pixmap2 = ui->label_4->pixmap(); // QString kupath1 = "C:/Users/20486/Desktop/xijun1.3/build/Desktop_Qt_6_5_3_MinGW_64_bit-Debug/"+savePath; // QString kupath2 = "C:/Users/20486/Desktop/xijun1.3/build/Desktop_Qt_6_5_3_MinGW_64_bit-Debug/"+savePath2; QSqlQuery query; query.prepare("INSERT INTO xijun (name, time, yuanshi, jieguo, jishu) VALUES (:name, :time, :yuanshi, :jieguo, :jishu)"); query.bindValue(":name", id2); query.bindValue(":time", gettime()); query.bindValue(":yuanshi", savePath); query.bindValue(":jieguo", savePath2); query.bindValue(":jishu", ui->label_2->text()); m_msgBox->close(); emit shuaxin(); // ui->label_4->clear(); // ui->label_5->clear(); // ui->listWidget->clear(); // ui->label_2->clear(); a=0; ui->horizontalSlider_5->setEnabled(false); ui->horizontalSlider_6->setEnabled(false); ui->horizontalSlider_7->setEnabled(false); if (!query.exec()) { // 处理错误 qDebug() << query.lastError().text(); } ui->tableWidget_3->insertRow(row); QTableWidgetItem *filePathItem = new QTableWidgetItem(); filePathItem->setText(savePath2); QTableWidgetItem *filePathItem2 = new QTableWidgetItem(); filePathItem2->setText(QString::number(count)); QTableWidgetItem *pixmapItem = new QTableWidgetItem(); pixmap2 = pixmap2.scaled(175,175, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmapItem->setIcon(QIcon(pixmap2)); ui->tableWidget_3->setIconSize(QSize(175,175)); ui->tableWidget_3->setItem(row, 1, filePathItem); ui->tableWidget_3->setItem(row, 0, pixmapItem); ui->tableWidget_3->setItem(row, 2, filePathItem2); ui->tableWidget_3->setRowHeight(0,170); ui->tableWidget_3->setRowHeight(1,170); row++; QtConcurrent::run(&bacteria::savezhao, this); } } void bacteria::savezhao() { qDebug()<<"开始保存照片"; QString folderName; QString timeStamp = QDate::currentDate().toString("yyyy-MM-dd"); folderName = "use/xijun/" + timeStamp; QDir dir(folderName); if (!dir.exists()) { if (!dir.mkpath(folderName)) { qDebug() << "Failed to create directory: " << folderName; return; } } if (ui->label_3->text().isEmpty()) { // QString timeStampFull = QTime::currentTime().toString("hh-mm-ss"); QPixmap pixmap = ui->label_5->pixmap(); // QString savePath = folderName + "/" + timeStampFull + "_Y" + ".png"; QPixmap pixmap2 = ui->label_4->pixmap(); //QString savePath2 = folderName + "/" + timeStampFull + "_J" + ".png"; if (pixmap.save(savePath3)) { qDebug() << "Saved pixmap to: " << savePath3; } else { qDebug() << "Failed to save pixmap to: " << savePath3; QMessageBox::information(NULL, "保存", "保存失败", QMessageBox::Ok | QMessageBox::Cancel); } } else { QPixmap pixmap = ui->label_5->pixmap(); QPixmap pixmap2 = ui->label_4->pixmap(); if (pixmap.save(savePath)) { qDebug() << "Saved pixmap to: " << savePath; } else { qDebug() << "Failed to save pixmap to: " << savePath; QMessageBox::information(NULL, "保存", "保存失败", QMessageBox::Ok | QMessageBox::Cancel); } } } QString bacteria::getname() { QString sql=QString("select usersname from users where id='%1'").arg(id2); qDebug()<label_4->pixmap(); // QPixmap pixmap(aFile); QString savePath = "use/unusexijun"; QDir dir(savePath); if (!dir.exists()) { dir.mkpath(savePath); } QString filePath = dir.filePath(fileName); pixmap.save(filePath); // 创建一个QTableWidgetItem用于存放文件路径,第二列展示文件路径 QTableWidgetItem *filePathItem = new QTableWidgetItem(); filePathItem->setText(filePath); QTableWidgetItem *filePathItem2 = new QTableWidgetItem(); filePathItem2->setText(QString::number(count)); // 创建一个QTableWidgetItem用于存放Pixmap,第一列展示图片 QTableWidgetItem *pixmapItem = new QTableWidgetItem(); if (pixmap.isNull()) { qDebug() << "图片加载失败,请检查文件路径和图片格式是否正确"; return; } // 对图片进行缩放,保持长宽比使其适应指定大小(这里设置为100x100) pixmap = pixmap.scaled(175,175, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmapItem->setIcon(QIcon(pixmap)); ui->tableWidget_3->setIconSize(QSize(175,175)); // 插入新行 ui->tableWidget_3->insertRow(row); // 将Pixmap对应的Item添加到第一列 ui->tableWidget_3->setItem(row, 0, pixmapItem); // 将文件路径对应的Item添加到第二列 ui->tableWidget_3->setItem(row, 1, filePathItem); ui->tableWidget_3->setItem(row, 2, filePathItem2); ui->tableWidget_3->setRowHeight(row,170); row++; } //计数 void bacteria::on_pushButton_3_clicked() { } //重新拍照 void bacteria::on_pushButton_4_clicked() { } //连接相机 void bacteria::on_pushButton_2_clicked() { ui->widget_3->setHidden(false); ui->widget_3->setxijun(); QTimer::singleShot(100,this,[=](){ if (!ui->widget_3->CameraOpen()) { qDebug()<<"shibai"; QMessageBox::information(NULL, "提示", "连接相机失败" ); } else{qDebug()<<"chenggog"; ui->widget_3->CameraStart(); ui->widget_3->resetStatistic(); m_staticTimer.start(100); ui->pushButton->setEnabled(true); ui->pushButton_2->setText("已连接"); ui->pushButton_2->setEnabled(false); ui->horizontalSlider->setEnabled(true); ui->horizontalSlider_2->setEnabled(true); } foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) { QSerialPort serial; serial.setPort(info); if(serial.open(QIODevice::ReadWrite)) { SerialPort.setPortName("COM3"); qDebug()<horizontalSlider->setEnabled(true); ui->horizontalSlider_2->setEnabled(true); } }); } //历史记录 void bacteria::on_pushButton_5_clicked() { m_bachistoricalrecords->showFullScreen(); } //当点击菌落计数时 void bacteria::getkai() { qDebug()<<"菌落getkai"; ui->pushButton->setHidden(false); ui->pushButton->setEnabled(false); ui->pushButton_4->setHidden(true); ui->pushButton_2->setText("连接相机"); ui->pushButton_2->setEnabled(true); ui->label_4->clear(); ui->label_5->clear(); ui->label_2->clear(); } //当点击MIC判读时 void bacteria::getguan() { qDebug()<<"菌落getguan"; ui->widget_3->CameraStop(); ui->widget_3->CameraClose(); QTimer::singleShot(500,this,[=](){ SerialPort.close(); qDebug()<<"串口关闭"; } ); // //关闭上光源 // QTimer::singleShot(100,this,[=](){ // int num = ui->label_6->text().toInt(); // QString hexValue = QString("%1").arg(num, 0, 16).toUpper(); // if (hexValue.length() == 1) { // hexValue.prepend("0"); // } // char char1 = hexValue.at(0).toLatin1(); // char char2 = hexValue.at(1).toLatin1(); // // qDebug() << "转换后的第一个char型字符为: " << char1; // //qDebug() << "转换后的第二个char型字符为: " << char2; // char fChar1 = char1; // int asciiValue1 = (int)fChar1; // QString hexValue1 = QString("%1").arg(asciiValue1, 0, 16).toUpper(); // // qDebug() << "字符 '3' 对应的ASCII码(十进制)为: " << asciiValue1; // // qDebug() << "字符 '3' 对应的ASCII码(十六进制)为: " << hexValue1; // char fChar2 =char2; // int asciiValue2 = (int)fChar2; // QString hexValue2 = QString("%1").arg(asciiValue2, 0, 16).toUpper(); // //qDebug() << "字符 '2' 对应的ASCII码(十进制)为: " << asciiValue2; // //qDebug() << "字符 '2' 对应的ASCII码(十六进制)为: " << hexValue2; // // 计算字符 '$' 的相关信息 // char fChar3 = '$'; // int asciiValue3 = (int)fChar3; // QString hexValue3 = QString("%1").arg(asciiValue3, 0, 16).toUpper(); // // qDebug() << "字符 '$' 对应的ASCII码(十进制)为: " << asciiValue3; // //qDebug() << "字符 '$' 对应的ASCII码(十六进制)为: " << hexValue3; // // 计算字符 '1' 的相关信息 // char fChar4 = '2'; // int asciiValue4 = (int)fChar4; // QString hexValue4 = QString("%1").arg(asciiValue4, 0, 16).toUpper(); // // qDebug() << "字符 '1' 对应的ASCII码(十进制)为: " << asciiValue4; // //qDebug() << "字符 '1' 对应的ASCII码(十六进制)为: " << hexValue4; // // 计算字符 '0' 的相关信息 // char fChar5 = '1'; // int asciiValue5 = (int)fChar5; // QString hexValue5 = QString("%1").arg(asciiValue5, 0, 16).toUpper(); // //qDebug() << "字符 '0' 对应的ASCII码(十进制)为: " << asciiValue5; // //qDebug() << "字符 '0' 对应的ASCII码(十六进制)为: " << hexValue5; // char fChar6 = '0'; // int asciiValue6= (int)fChar6; // QString hexValue6= QString("%1").arg(asciiValue6, 0, 16).toUpper(); // //qDebug() << "字符 '1' 对应的ASCII码(十进制)为: " << asciiValue6; // // qDebug() << "字符 '1' 对应的ASCII码(十六进制)为: " << hexValue6; // bool ok1, ok2, ok3, ok4, ok5, ok6; // int decimalValue1 = hexValue1.toInt(&ok1, 16); // int decimalValue2 = hexValue2.toInt(&ok2, 16); // int decimalValue3 = hexValue3.toInt(&ok3, 16); // int decimalValue4 = hexValue4.toInt(&ok4, 16); // int decimalValue5 = hexValue5.toInt(&ok5, 16); // int decimalValue6 = hexValue6.toInt(&ok6, 16); // if (ok1 && ok2 && ok3 && ok4 && ok5 && ok6) { // int xorResult = decimalValue1 ^ decimalValue2 ^ decimalValue3 ^ decimalValue4 ^ decimalValue5 ^ decimalValue6; // QString xorHexResult = QString("%1").arg(xorResult, 0, 16).toUpper(); // // qDebug() << "hexValue1、hexValue2、hexValue3、hexValue4、hexValue5、hexValue6异或运算结果(十六进制)为: " << xorHexResult; // QString hexString = QString("%1").arg(num, 0, 16).toUpper(); // qDebug() << "整数50转换后的十六进制字符为: " << hexString; // QString kai = "$210" + QString(char1) + QString(char2) + xorHexResult; // // qDebug()<label_9->text().toInt(); // QString hexValue = QString("%1").arg(num, 0, 16).toUpper(); // //qDebug() << "整数 " << num << " 转换后的十六进制表示为: " << hexValue; // // 如果hexValue长度为1,在前面补0 // if (hexValue.length() == 1) { // hexValue.prepend("0"); // } // char char1 = hexValue.at(0).toLatin1(); // char char2 = hexValue.at(1).toLatin1(); // // qDebug() << "转换后的第一个char型字符为: " << char1; // // qDebug() << "转换后的第二个char型字符为: " << char2; // char fChar1 = char1; // int asciiValue1 = (int)fChar1; // QString hexValue1 = QString("%1").arg(asciiValue1, 0, 16).toUpper(); // // qDebug() << "字符 '3' 对应的ASCII码(十进制)为: " << asciiValue1; // //qDebug() << "字符 '3' 对应的ASCII码(十六进制)为: " << hexValue1; // char fChar2 =char2; // int asciiValue2 = (int)fChar2; // QString hexValue2 = QString("%1").arg(asciiValue2, 0, 16).toUpper(); // // qDebug() << "字符 '2' 对应的ASCII码(十进制)为: " << asciiValue2; // // qDebug() << "字符 '2' 对应的ASCII码(十六进制)为: " << hexValue2; // // 计算字符 '$' 的相关信息 // char fChar3 = '$'; // int asciiValue3 = (int)fChar3; // QString hexValue3 = QString("%1").arg(asciiValue3, 0, 16).toUpper(); // //qDebug() << "字符 '$' 对应的ASCII码(十进制)为: " << asciiValue3; // // qDebug() << "字符 '$' 对应的ASCII码(十六进制)为: " << hexValue3; // // 计算字符 '1' 的相关信息 // char fChar4 = '2'; // int asciiValue4 = (int)fChar4; // QString hexValue4 = QString("%1").arg(asciiValue4, 0, 16).toUpper(); // //qDebug() << "字符 '1' 对应的ASCII码(十进制)为: " << asciiValue4; // //qDebug() << "字符 '1' 对应的ASCII码(十六进制)为: " << hexValue4; // // 计算字符 '0' 的相关信息 // char fChar5 = '2'; // int asciiValue5 = (int)fChar5; // QString hexValue5 = QString("%1").arg(asciiValue5, 0, 16).toUpper(); // //qDebug() << "字符 '0' 对应的ASCII码(十进制)为: " << asciiValue5; // //qDebug() << "字符 '0' 对应的ASCII码(十六进制)为: " << hexValue5; // char fChar6 = '0'; // int asciiValue6= (int)fChar6; // QString hexValue6= QString("%1").arg(asciiValue6, 0, 16).toUpper(); // //qDebug() << "字符 '1' 对应的ASCII码(十进制)为: " << asciiValue6; // //qDebug() << "字符 '1' 对应的ASCII码(十六进制)为: " << hexValue6; // bool ok1, ok2, ok3, ok4, ok5, ok6; // int decimalValue1 = hexValue1.toInt(&ok1, 16); // int decimalValue2 = hexValue2.toInt(&ok2, 16); // int decimalValue3 = hexValue3.toInt(&ok3, 16); // int decimalValue4 = hexValue4.toInt(&ok4, 16); // int decimalValue5 = hexValue5.toInt(&ok5, 16); // int decimalValue6 = hexValue6.toInt(&ok6, 16); // if (ok1 && ok2 && ok3 && ok4 && ok5 && ok6) { // int xorResult = decimalValue1 ^ decimalValue2 ^ decimalValue3 ^ decimalValue4 ^ decimalValue5 ^ decimalValue6; // QString xorHexResult = QString("%1").arg(xorResult, 0, 16).toUpper(); // //qDebug() << "hexValue1、hexValue2、hexValue3、hexValue4、hexValue5、hexValue6异或运算结果(十六进制)为: " << xorHexResult; // QString hexString = QString("%1").arg(num, 0, 16).toUpper(); // // qDebug() << "整数50转换后的十六进制字符为: " << hexString; // QString kai = "$220" + QString(char1) + QString(char2) + xorHexResult; // // qDebug()<checkBox->isChecked()){ // SerialPort.write("$110281E"); // } // else { // SerialPort.write("$210281D"); // } // } // void bacteria::on_checkBox_2_clicked() // { // if(ui->checkBox_2->isChecked()){SerialPort.write("$1201711");} // else{SerialPort.write("$2201712");} // } //通道1(上光源) void bacteria::on_horizontalSlider_valueChanged(int value) { ui->label_6->setText(QString::number(value)); int num = value; QString hexValue = QString("%1").arg(num, 0, 16).toUpper(); qDebug() << "整数 " << num << " 转换后的十六进制表示为: " << hexValue; // 如果hexValue长度为1,在前面补0 if (hexValue.length() == 1) { hexValue.prepend("0"); } char char1 = hexValue.at(0).toLatin1(); char char2 = hexValue.at(1).toLatin1(); qDebug() << "转换后的第一个char型字符为: " << char1; qDebug() << "转换后的第二个char型字符为: " << char2; char fChar1 = char1; int asciiValue1 = (int)fChar1; QString hexValue1 = QString("%1").arg(asciiValue1, 0, 16).toUpper(); qDebug() << "字符 '3' 对应的ASCII码(十进制)为: " << asciiValue1; qDebug() << "字符 '3' 对应的ASCII码(十六进制)为: " << hexValue1; char fChar2 =char2; int asciiValue2 = (int)fChar2; QString hexValue2 = QString("%1").arg(asciiValue2, 0, 16).toUpper(); qDebug() << "字符 '2' 对应的ASCII码(十进制)为: " << asciiValue2; qDebug() << "字符 '2' 对应的ASCII码(十六进制)为: " << hexValue2; // 计算字符 '$' 的相关信息 char fChar3 = '$'; int asciiValue3 = (int)fChar3; QString hexValue3 = QString("%1").arg(asciiValue3, 0, 16).toUpper(); qDebug() << "字符 '$' 对应的ASCII码(十进制)为: " << asciiValue3; qDebug() << "字符 '$' 对应的ASCII码(十六进制)为: " << hexValue3; // 计算字符 '1' 的相关信息 char fChar4 = '1'; int asciiValue4 = (int)fChar4; QString hexValue4 = QString("%1").arg(asciiValue4, 0, 16).toUpper(); qDebug() << "字符 '1' 对应的ASCII码(十进制)为: " << asciiValue4; qDebug() << "字符 '1' 对应的ASCII码(十六进制)为: " << hexValue4; // 计算字符 '0' 的相关信息 char fChar5 = '1'; int asciiValue5 = (int)fChar5; QString hexValue5 = QString("%1").arg(asciiValue5, 0, 16).toUpper(); qDebug() << "字符 '0' 对应的ASCII码(十进制)为: " << asciiValue5; qDebug() << "字符 '0' 对应的ASCII码(十六进制)为: " << hexValue5; char fChar6 = '0'; int asciiValue6= (int)fChar6; QString hexValue6= QString("%1").arg(asciiValue6, 0, 16).toUpper(); qDebug() << "字符 '1' 对应的ASCII码(十进制)为: " << asciiValue6; qDebug() << "字符 '1' 对应的ASCII码(十六进制)为: " << hexValue6; bool ok1, ok2, ok3, ok4, ok5, ok6; int decimalValue1 = hexValue1.toInt(&ok1, 16); int decimalValue2 = hexValue2.toInt(&ok2, 16); int decimalValue3 = hexValue3.toInt(&ok3, 16); int decimalValue4 = hexValue4.toInt(&ok4, 16); int decimalValue5 = hexValue5.toInt(&ok5, 16); int decimalValue6 = hexValue6.toInt(&ok6, 16); if (ok1 && ok2 && ok3 && ok4 && ok5 && ok6) { int xorResult = decimalValue1 ^ decimalValue2 ^ decimalValue3 ^ decimalValue4 ^ decimalValue5 ^ decimalValue6; QString xorHexResult = QString("%1").arg(xorResult, 0, 16).toUpper(); qDebug() << "hexValue1、hexValue2、hexValue3、hexValue4、hexValue5、hexValue6异或运算结果(十六进制)为: " << xorHexResult; QString hexString = QString("%1").arg(num, 0, 16).toUpper(); qDebug() << "整数50转换后的十六进制字符为: " << hexString; QString kai = "$110" + QString(char1) + QString(char2) + xorHexResult; qDebug()<label_9->setText(QString::number(value)); QString hexValue = QString("%1").arg(num, 0, 16).toUpper(); qDebug() << "整数 " << num << " 转换后的十六进制表示为: " << hexValue; // 如果hexValue长度为1,在前面补0 if (hexValue.length() == 1) { hexValue.prepend("0"); } char char1 = hexValue.at(0).toLatin1(); char char2 = hexValue.at(1).toLatin1(); qDebug() << "转换后的第一个char型字符为: " << char1; qDebug() << "转换后的第二个char型字符为: " << char2; char fChar1 = char1; int asciiValue1 = (int)fChar1; QString hexValue1 = QString("%1").arg(asciiValue1, 0, 16).toUpper(); qDebug() << "字符 '3' 对应的ASCII码(十进制)为: " << asciiValue1; qDebug() << "字符 '3' 对应的ASCII码(十六进制)为: " << hexValue1; char fChar2 =char2; int asciiValue2 = (int)fChar2; QString hexValue2 = QString("%1").arg(asciiValue2, 0, 16).toUpper(); qDebug() << "字符 '2' 对应的ASCII码(十进制)为: " << asciiValue2; qDebug() << "字符 '2' 对应的ASCII码(十六进制)为: " << hexValue2; // 计算字符 '$' 的相关信息 char fChar3 = '$'; int asciiValue3 = (int)fChar3; QString hexValue3 = QString("%1").arg(asciiValue3, 0, 16).toUpper(); qDebug() << "字符 '$' 对应的ASCII码(十进制)为: " << asciiValue3; qDebug() << "字符 '$' 对应的ASCII码(十六进制)为: " << hexValue3; // 计算字符 '1' 的相关信息 char fChar4 = '1'; int asciiValue4 = (int)fChar4; QString hexValue4 = QString("%1").arg(asciiValue4, 0, 16).toUpper(); qDebug() << "字符 '1' 对应的ASCII码(十进制)为: " << asciiValue4; qDebug() << "字符 '1' 对应的ASCII码(十六进制)为: " << hexValue4; // 计算字符 '0' 的相关信息 char fChar5 = '2'; int asciiValue5 = (int)fChar5; QString hexValue5 = QString("%1").arg(asciiValue5, 0, 16).toUpper(); qDebug() << "字符 '0' 对应的ASCII码(十进制)为: " << asciiValue5; qDebug() << "字符 '0' 对应的ASCII码(十六进制)为: " << hexValue5; char fChar6 = '0'; int asciiValue6= (int)fChar6; QString hexValue6= QString("%1").arg(asciiValue6, 0, 16).toUpper(); qDebug() << "字符 '1' 对应的ASCII码(十进制)为: " << asciiValue6; qDebug() << "字符 '1' 对应的ASCII码(十六进制)为: " << hexValue6; bool ok1, ok2, ok3, ok4, ok5, ok6; int decimalValue1 = hexValue1.toInt(&ok1, 16); int decimalValue2 = hexValue2.toInt(&ok2, 16); int decimalValue3 = hexValue3.toInt(&ok3, 16); int decimalValue4 = hexValue4.toInt(&ok4, 16); int decimalValue5 = hexValue5.toInt(&ok5, 16); int decimalValue6 = hexValue6.toInt(&ok6, 16); if (ok1 && ok2 && ok3 && ok4 && ok5 && ok6) { int xorResult = decimalValue1 ^ decimalValue2 ^ decimalValue3 ^ decimalValue4 ^ decimalValue5 ^ decimalValue6; QString xorHexResult = QString("%1").arg(xorResult, 0, 16).toUpper(); qDebug() << "hexValue1、hexValue2、hexValue3、hexValue4、hexValue5、hexValue6异或运算结果(十六进制)为: " << xorHexResult; QString hexString = QString("%1").arg(num, 0, 16).toUpper(); qDebug() << "整数50转换后的十六进制字符为: " << hexString; QString kai = "$120" + QString(char1) + QString(char2) + xorHexResult; qDebug()<label_15->setText(QString::number(value)); // if(a==1){usepython();} } void bacteria::on_horizontalSlider_6_valueChanged(int value) { // ui->label_17->setText(QString::number(value)); // if(a==1){usepython();} } void bacteria::on_horizontalSlider_7_valueChanged(int value) { // ui->label_19->setText(QString::number(value)); // if(a==1){usepython();} } void bacteria::on_pushButton_6_clicked() { if(save==false) { QMessageBox::information(NULL,"保存","请先保存照片", QMessageBox::Ok | QMessageBox::Cancel); }else{ // 获取应用程序目录的父目录 QString appDir = QCoreApplication::applicationDirPath(); QDir dir(appDir); // if (dir.cdUp()) { // 尝试返回上一级目录 // appDir = dir.absolutePath(); // } else { // qDebug() << "无法返回上一级目录,使用原始目录"; // } // 构建完整路径 QString initialDir = QDir::toNativeSeparators(appDir + "/use/xijun"); qDebug() << initialDir; // 检查目录是否存在 QDir targetDir(initialDir); if (!targetDir.exists()) { qDebug() << "目录不存在,使用文档目录作为替代"; initialDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); } // 创建文件对话框对象 QFileDialog fileDialog; // 设置文件对话框的标题 fileDialog.setWindowTitle("打开文件"); // 设置文件对话框的文件模式为只允许选择文件 fileDialog.setFileMode(QFileDialog::ExistingFile); // 设置文件对话框的初始目录 fileDialog.setDirectory(initialDir); // 打开文件对话框,等待用户选择文件 if (fileDialog.exec() == QDialog::Accepted) { // 获取用户选择的文件路径 QStringList fileNames = fileDialog.selectedFiles(); ui->label_4->setHidden(true); ui->label_5->setHidden(false); // 输出用户选择的文件路径 qDebug() << "选择的文件路径: " << fileNames.at(0); savelujing= fileNames.at(0); ui->label_5->clear(); ui->label_5->setPixmap(fileNames.at(0));//5存放的是原始图片 ui->label_5->setScaledContents(true); int result = QMessageBox::information(NULL, "提示", "是否要将此照片进行重新计数", QMessageBox::Ok | QMessageBox::Cancel); if (result == QMessageBox::Ok) { if(!f.isRunning()){ ui->label_4->clear(); ui->label_2->clear(); m_msgBox->close(); m_zidingyi->exec(); QString folderName; QString timeStamp = QDate::currentDate().toString("yyyy-MM-dd"); folderName = "use/xijun/" + timeStamp; QString timeStampFull = QTime::currentTime().toString("hh-mm-ss"); savePath3 = folderName + "/" + timeStampFull + "_Y" + ".png"; savePath4 = folderName + "/" + timeStampFull + "_J" + ".png"; xtshoudong=folderName + "/" + timeStampFull + "_C" + ".png"; QString zidingyi=ui->label_3->text(); savePath = folderName + "/" + zidingyi + "_Y" + ".png"; savePath2 = folderName + "/" + zidingyi + "_J" + ".png"; zmshoudong=folderName + "/" + zidingyi + "_C" + ".png"; if(jixu==true){ QTimer::singleShot(1000,this,[=](){ qDebug() << "开始尝试调用算法"; usepython(); // f = QtConcurrent::run(&bacteria::usepython, this); qDebug()<<"开启线程"; }); } else { qDebug() << "图片加载失败: " ; } } else{ QMessageBox::information(NULL, "提示", "图片正在处理中,请稍后" );qDebug()<<"线程还没有结束";} }else{ qDebug() << "用户取消了文件计数"; } } else { qDebug() << "用户取消了文件选择"; } } } void bacteria::on_pushButton_7_clicked() { QScrollBar *scrollBar = ui->tableWidget_3->verticalScrollBar(); // 获取当前滚动条的位置 int currentValue = scrollBar->value(); // 向下滑动的偏移量,可以根据需要调整 int offset = 100; // 设置新的滚动条位置 scrollBar->setValue(currentValue + offset); } void bacteria::on_pushButton_8_clicked() { QScrollBar *scrollBar = ui->tableWidget_3->verticalScrollBar(); // 获取当前滚动条的位置 int currentValue = scrollBar->value(); // 向下滑动的偏移量,可以根据需要调整 int offset = 100; // 设置新的滚动条位置 scrollBar->setValue(currentValue - offset); } // 获取所有进程信息并返回指定进程名的 PID 列表 QListbacteria::getProcessIdsByName(const QString& processName) { QList pids; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { qDebug() << "CreateToolhelp32Snapshot failed."; return pids; } PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnapshot, &pe32)) { do { QString currentProcessName = QString::fromWCharArray(pe32.szExeFile); if (currentProcessName.contains(processName)) { pids.append(pe32.th32ProcessID); } } while (Process32Next(hSnapshot, &pe32)); } CloseHandle(hSnapshot); return pids; } // 终止指定进程 bool bacteria::terminateProcess(pid_t pid) { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid); if (hProcess == NULL) { qDebug() << "OpenProcess failed."; return false; } if (!TerminateProcess(hProcess, 0)) { qDebug() << "TerminateProcess failed."; CloseHandle(hProcess); return false; } CloseHandle(hProcess); return true; } // 获取进程名 QString bacteria:: getProcessName(DWORD pid) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid); if (hProcess == NULL) { return ""; } wchar_t buffer[MAX_PATH]; if (GetModuleFileNameExW(hProcess, NULL, buffer, MAX_PATH) == 0) { CloseHandle(hProcess); return ""; } QString processName = QString::fromWCharArray(buffer); CloseHandle(hProcess); return processName; } void bacteria::on_pushButton_9_clicked() { // 要终止的进程名,这里假设为 "your_process_name" QString targetProcessName = "untitled14.exe"; // 获取指定进程名的 PID 列表 QList pids = getProcessIdsByName(targetProcessName); if (pids.isEmpty()) { qDebug() << "No process with name " << targetProcessName << " found."; } else { foreach (DWORD pid, pids) { QString processName = getProcessName(pid); if (!processName.isEmpty()) { qDebug() << "Process Name: " << processName << " PID: " << pid; } if (terminateProcess(pid)) { qDebug() << "Process with PID " << pid << " terminated successfully."; } else { qDebug() << "Failed to terminate process with PID " << pid << "."; } } } } void bacteria::on_pushButton_10_clicked() { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { qDebug() << "CreateToolhelp32Snapshot failed."; return; } PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnapshot, &pe32)) { do { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID); if (hProcess != NULL) { wchar_t buffer[MAX_PATH]; if (GetModuleFileNameExW(hProcess, NULL, buffer, MAX_PATH) != 0) { QString processName = QString::fromWCharArray(buffer); qDebug() << "Process Name: " << processName << " PID: " << pe32.th32ProcessID; } CloseHandle(hProcess); } } while (Process32Next(hSnapshot, &pe32)); } CloseHandle(hSnapshot); } void bacteria::on_pushButton_11_clicked() { if (TerminateThread(hthread, 0)) { qDebug() << "Thread terminated successfully."; } else { qDebug() << "Failed to terminate thread."; } } void bacteria::on_pushButton_12_clicked() { //有压缩 //usepython_quick(); //无压缩 // f = QtConcurrent::run(&bacteria::usepython_slow, this); //ai算法 // usepython("",""); qDebug()<<"开始调用python文件"; } void bacteria::on_pushButton_13_clicked() { //如果已经得到结果照片 if(ui->label_4->isVisible()){ eventFilterEnabled = false; save=false;//菌落计数手动矫正的判断 qDebug() << "可以正常点击"; ui->pushButton_13->setHidden(true); ui->pushButton_14->setHidden(false); }else{ QMessageBox::information(NULL,"提示","无法进入审查模式"); } } //手动保存 void bacteria::on_pushButton_14_clicked() { qDebug()<<"手动保存"; if(ui->label_3->text().isEmpty()){ QPixmap pixmap2 = ui->label_4->pixmap(); // 开启事务,确保操作的原子性 db.transaction(); // 第一步:更新现有行的 xuhao,使其序号依次加 1 // 从最大的 xuhao 开始递减更新,避免 xuhao 冲突 QSqlQuery updateQuery(db); updateQuery.prepare("SELECT MAX(xuhao) FROM xijun"); if (updateQuery.exec() && updateQuery.next()) { int maxXuhao = updateQuery.value(0).toInt(); for (int i = maxXuhao; i >= 1; --i) { QSqlQuery updateXuhaoQuery(db); updateXuhaoQuery.prepare("UPDATE xijun SET xuhao = :newXuhao WHERE xuhao = :oldXuhao"); updateXuhaoQuery.bindValue(":newXuhao", i + 1); updateXuhaoQuery.bindValue(":oldXuhao", i); if (!updateXuhaoQuery.exec()) { qDebug() << "更新 xuhao 失败:" << updateXuhaoQuery.lastError().text(); // 回滚事务 db.rollback(); return; } } } else { qDebug() << "获取最大 xuhao 失败:" << updateQuery.lastError().text(); // 回滚事务 db.rollback(); return; } // 新增:插入多列数据 QSqlQuery query(db); query.prepare("INSERT INTO xijun (xuhao,name, time, yuanshi, jieguo, jishu) VALUES (:xuhao,:name, :time, :yuanshi, :jieguo, :jishu)"); query.bindValue(":xuhao", 1); query.bindValue(":name", id2); query.bindValue(":time", gettime()); query.bindValue(":yuanshi", savePath3); query.bindValue(":jieguo", xtshoudong); query.bindValue(":jishu", ui->label_2->text()); if (!query.exec()) { qDebug() << "插入多列数据失败:" << query.lastError().text(); // 回滚事务 db.rollback(); return; } // 提交事务 if (db.commit()) { qDebug() << "数据插入并重新排序成功"; } else { qDebug() << "事务提交失败:" << db.lastError().text(); } emit shuaxin(); a=0; ui->horizontalSlider_5->setEnabled(false); ui->horizontalSlider_6->setEnabled(false); ui->horizontalSlider_7->setEnabled(false); ui->tableWidget_3->insertRow(row); QTableWidgetItem *filePathItem = new QTableWidgetItem(); filePathItem->setText(xtshoudong); QTableWidgetItem *filePathItem2 = new QTableWidgetItem(); filePathItem2->setText(QString::number(count)); QTableWidgetItem *pixmapItem = new QTableWidgetItem(); pixmap2 = pixmap2.scaled(175,175, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmapItem->setIcon(QIcon(pixmap2)); ui->tableWidget_3->setIconSize(QSize(175,175)); ui->tableWidget_3->setRowHeight(row,170); ui->tableWidget_3->setItem(row, 1, filePathItem); ui->tableWidget_3->setItem(row, 0, pixmapItem); ui->tableWidget_3->setItem(row, 2, filePathItem2); // QtConcurrent::run(&bacteria::savezhao, this); } else{ ui->label_4->setPixmap(savePath2); ui->label_4->setScaledContents(true); QString zidingyi=ui->label_3->text(); QPixmap pixmap = ui->label_5->pixmap(); QPixmap pixmap2 = ui->label_4->pixmap(); // QString kupath1 = "C:/Users/20486/Desktop/xijun1.3/build/Desktop_Qt_6_5_3_MinGW_64_bit-Debug/"+savePath; // QString kupath2 = "C:/Users/20486/Desktop/xijun1.3/build/Desktop_Qt_6_5_3_MinGW_64_bit-Debug/"+savePath2; QSqlQuery query; query.prepare("INSERT INTO xijun (name, time, yuanshi, jieguo, jishu) VALUES (:name, :time, :yuanshi, :jieguo, :jishu)"); query.bindValue(":name", id2); query.bindValue(":time", gettime()); query.bindValue(":yuanshi", savePath); query.bindValue(":jieguo", zmshoudong); query.bindValue(":jishu", ui->label_2->text()); m_msgBox->close(); emit shuaxin(); // ui->label_4->clear(); // ui->label_5->clear(); // ui->listWidget->clear(); // ui->label_2->clear(); a=0; ui->horizontalSlider_5->setEnabled(false); ui->horizontalSlider_6->setEnabled(false); ui->horizontalSlider_7->setEnabled(false); if (!query.exec()) { // 处理错误 qDebug() << query.lastError().text(); QMessageBox::information(NULL, "保存", "保存失败,退出审查模式", QMessageBox::Ok); }else{ QMessageBox::information(NULL, "保存", "保存成功,退出审查模式", QMessageBox::Ok); } ui->tableWidget_3->insertRow(row); QTableWidgetItem *filePathItem = new QTableWidgetItem(); filePathItem->setText(zmshoudong); QTableWidgetItem *filePathItem2 = new QTableWidgetItem(); filePathItem2->setText(QString::number(count)); QTableWidgetItem *pixmapItem = new QTableWidgetItem(); pixmap2 = pixmap2.scaled(175,175, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmapItem->setIcon(QIcon(pixmap2)); ui->tableWidget_3->setIconSize(QSize(175,175)); ui->tableWidget_3->setItem(row, 1, filePathItem); ui->tableWidget_3->setItem(row, 0, pixmapItem); ui->tableWidget_3->setItem(row, 2, filePathItem2); ui->tableWidget_3->setRowHeight(0,170); ui->tableWidget_3->setRowHeight(1,170); row++; } if (ui->label_3->text().isEmpty()) { QPixmap pixmap = ui->label_4->pixmap(); if (pixmap.save(xtshoudong)) { qDebug() << "Saved pixmap to: " << xtshoudong; // QMessageBox::information(NULL, "保存", "保存成功,退出审查模式", QMessageBox::Ok | QMessageBox::Cancel); } else { QMessageBox::information(NULL, "保存", "保存失败,退出审查模式", QMessageBox::Ok | QMessageBox::Cancel); } } else { QPixmap pixmap = ui->label_4->pixmap(); if (pixmap.save(zmshoudong)) { qDebug() << "Saved pixmap to: " << zmshoudong; save=true; eventFilterEnabled = true;//表示不能再点击了 ui->pushButton_13->setHidden(false); ui->pushButton_14->setHidden(true); // QMessageBox::information(NULL, "保存", "保存成功,退出审查模式", QMessageBox::Ok | QMessageBox::Cancel); } else { qDebug() << "Failed to save pixmap to: " << zmshoudong; QMessageBox::information(NULL, "保存", "保存失败,退出审查模式", QMessageBox::Ok | QMessageBox::Cancel); } } ui->label_4->clear(); ui->label_5->clear(); ui->label_4->setHidden(true); ui->label_5->setHidden(false); save=true; eventFilterEnabled = true;//表示不能再点击了 ui->pushButton_13->setHidden(false); ui->pushButton_14->setHidden(true); }