增加sane协议双张机制

This commit is contained in:
yangjiaxuan 2023-10-17 10:47:24 +08:00
parent 68051bb2df
commit f14e49bc54
9 changed files with 168 additions and 1 deletions

View File

@ -376,7 +376,21 @@ void HGAPI DeviceUser::DeviceEventFunc(HGSaneDevice dev, HGUInt event, HGPointer
HGUInt HGAPI DeviceUser::DeviceImageFunc(HGSaneDevice dev, HGImage image, HGUInt type, HGPointer param)
{
DeviceUser* p = (DeviceUser*)param;
emit p->newImage(image);
HGUInt result = HGBASE_ERR_OK;
if (HGSANE_IMAGE_TYPE_DOUBLE == type)
{
emit p->abnormalImage(image, &result);
}
if (HGBASE_ERR_OK == result)
{
emit p->newImage(image);
}
else
{
return HGSANE_ERR_STOPSCAN;
}
return HGBASE_ERR_OK;
}

View File

@ -124,6 +124,7 @@ private:
signals:
void newImage(void *image);
void abnormalImage(void *image, HGUInt *result);
void scanFinishEvent();
void scanWorkingEvent();

View File

@ -0,0 +1,39 @@
#include "dialog_abnormalimage.h"
#include "ui_dialog_abnormalimage.h"
#include "sane_user/HGSane.h"
Dialog_AbnormalImage::Dialog_AbnormalImage(HGImage image, QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog_AbnormalImage)
{
ui->setupUi(this);
m_result = HGBASE_ERR_OK;
m_view = new HGImgView();
m_view->addImage(image);
ui->stackedWidget->addWidget(m_view);
ui->stackedWidget->setCurrentWidget(m_view);
}
Dialog_AbnormalImage::~Dialog_AbnormalImage()
{
delete ui;
}
HGUInt Dialog_AbnormalImage::getResult()
{
return m_result;
}
void Dialog_AbnormalImage::on_pushButton_reserve_clicked()
{
m_result = HGBASE_ERR_OK;
close();
}
void Dialog_AbnormalImage::on_pushButton_discard_clicked()
{
m_result = HGBASE_ERR_FAIL;
close();
}

View File

@ -0,0 +1,34 @@
#ifndef DIALOG_ABNORMALIMAGE_H
#define DIALOG_ABNORMALIMAGE_H
#include <QDialog>
#include "base/HGBase.h"
#include "HGImgView.h"
namespace Ui {
class Dialog_AbnormalImage;
}
class Dialog_AbnormalImage : public QDialog
{
Q_OBJECT
public:
explicit Dialog_AbnormalImage(HGImage image, QWidget *parent = nullptr);
~Dialog_AbnormalImage();
HGUInt getResult();
private slots:
void on_pushButton_reserve_clicked();
void on_pushButton_discard_clicked();
private:
Ui::Dialog_AbnormalImage *ui;
HGUInt m_result;
HGImgView *m_view;
};
#endif // DIALOG_ABNORMALIMAGE_H

View File

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog_AbnormalImage</class>
<widget class="QDialog" name="Dialog_AbnormalImage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>820</width>
<height>550</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QStackedWidget" name="stackedWidget">
<widget class="QWidget" name="page"/>
<widget class="QWidget" name="page_2"/>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_reserve">
<property name="text">
<string>Reserve</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_discard">
<property name="text">
<string>Discard</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -32,6 +32,7 @@
#include "dialog_feedback.h"
#include "dialog_savemessagebox.h"
#include "dialog_waitingocr.h"
#include "dialog_abnormalimage.h"
#include "base/HGInfo.h"
#include "huagao/hgscanner_error.h"
#include "base/HGTime.h"
@ -371,6 +372,7 @@ MainWindow::MainWindow(const QString& appLang, QWidget *parent)
{
m_wndStatusBar->setDeviceStatusInfo(tr("Device %1 is open").arg(m_devUser->GetName()), false);
connect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)), Qt::DirectConnection);
connect(m_devUser, SIGNAL(abnormalImage(void*,HGUInt*)), this, SLOT(on_abnormalImage(void*,HGUInt*)), Qt::BlockingQueuedConnection);
connect(m_devUser, SIGNAL(scanWorkingEvent()), this, SLOT(on_scanWorkingEvent()), Qt::QueuedConnection);
connect(m_devUser, SIGNAL(scanFinishEvent()), this, SLOT(on_scanFinishEvent()), Qt::QueuedConnection);
@ -427,6 +429,7 @@ MainWindow::~MainWindow()
if (nullptr != m_devUser)
{
disconnect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)));
disconnect(m_devUser, SIGNAL(abnormalImage(void*,HGUInt*)), this, SLOT(on_abnormalImage(void*,HGUInt*)));
disconnect(m_devUser, SIGNAL(scanWorkingEvent()), this, SLOT(on_scanWorkingEvent()));
disconnect(m_devUser, SIGNAL(scanFinishEvent()), this, SLOT(on_scanFinishEvent()));
delete m_devUser;
@ -1311,6 +1314,15 @@ void MainWindow::on_newImage(void *image)
qDebug("on_newImage end, m_currScanCount=%d, seconds=%f", m_currScanCount, seconds);
}
void MainWindow::on_abnormalImage(void *image, HGUInt *result)
{
HGImage img = nullptr;
HGBase_CloneImage((HGImage)image, 0, 0, &img);
Dialog_AbnormalImage dlg(img, this);
dlg.exec();
*result = dlg.getResult();
}
void MainWindow::on_scanWorkingEvent()
{
m_view->enableHighQuality(false);
@ -4220,6 +4232,7 @@ void MainWindow::deleteDevUser()
if (nullptr != m_devUser)
{
disconnect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)));
disconnect(m_devUser, SIGNAL(abnormalImage(void*,HGUInt*)), this, SLOT(on_abnormalImage(void*,HGUInt*)));
disconnect(m_devUser, SIGNAL(scanWorkingEvent()), this, SLOT(on_scanWorkingEvent()));
disconnect(m_devUser, SIGNAL(scanFinishEvent()), this, SLOT(on_scanFinishEvent()));
m_devUser->Logout();
@ -4482,6 +4495,7 @@ void MainWindow::on_act_selectDevice_triggered()
if (nullptr != m_devUser)
{
disconnect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)));
disconnect(m_devUser, SIGNAL(abnormalImage(void*,HGUInt*)), this, SLOT(on_abnormalImage(void*,HGUInt*)));
disconnect(m_devUser, SIGNAL(scanWorkingEvent()), this, SLOT(on_scanWorkingEvent()));
disconnect(m_devUser, SIGNAL(scanFinishEvent()), this, SLOT(on_scanFinishEvent()));
m_devUser->Logout();
@ -4503,6 +4517,7 @@ void MainWindow::on_act_selectDevice_triggered()
m_devUser->Login();
m_wndStatusBar->setDeviceStatusInfo(tr("Device %1 is open").arg(m_devUser->GetName()), false);
connect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)), Qt::DirectConnection);
connect(m_devUser, SIGNAL(abnormalImage(void*,HGUInt*)), this, SLOT(on_abnormalImage(void*,HGUInt*)), Qt::BlockingQueuedConnection);
connect(m_devUser, SIGNAL(scanWorkingEvent()), this, SLOT(on_scanWorkingEvent()), Qt::QueuedConnection);
connect(m_devUser, SIGNAL(scanFinishEvent()), this, SLOT(on_scanFinishEvent()), Qt::QueuedConnection);
#if !defined(HG_CMP_MSC)

View File

@ -121,6 +121,7 @@ private slots:
void on_post_new_image(QString fileName);
void on_preview_image();
void on_newImage(void *image);
void on_abnormalImage(void *image, HGUInt *result);
void on_scanFinishEvent();
void on_scanWorkingEvent();
void on_m_pbtn_push_clicked();

View File

@ -226,6 +226,7 @@ SOURCES += \
../../../app/scanner2/dialog_upgrade.cpp \
../../../app/scanner2/dialog_writesettings.cpp \
../../../app/scanner2/dialog_waitingocr.cpp \
../../../app/scanner2/dialog_abnormalimage.cpp \
../../../app/scanner2/device_user.cpp \
../../../app/scanner2/graphicsscene.cpp \
../../../app/scanner2/main.cpp \
@ -266,6 +267,7 @@ HEADERS += \
../../../app/scanner2/dialog_upgrade.h \
../../../app/scanner2/dialog_writesettings.h \
../../../app/scanner2/dialog_waitingocr.h \
../../../app/scanner2/dialog_abnormalimage.h \
../../../app/scanner2/device_user.h \
../../../app/scanner2/graphicsscene.h \
../../../app/scanner2/mainwindow.h \
@ -300,6 +302,7 @@ FORMS += \
../../../app/scanner2/dialog_upgrade.ui \
../../../app/scanner2/dialog_writesettings.ui \
../../../app/scanner2/dialog_waitingocr.ui \
../../../app/scanner2/dialog_abnormalimage.ui \
../../../app/scanner2/mainwindow.ui \
../../../app/scanner2/widget_imgproc_base.ui \
../../../app/scanner2/widget_statusbar.ui \

View File

@ -1134,6 +1134,8 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
if (stopScan)
{
saneAPI.sane_cancel_api(p->m_devHandle);
if (NULL != p->m_scanNotify)
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, NULL, 0);
break;
}