scantool增加扫描功能

This commit is contained in:
luoliangyi 2024-04-26 17:27:47 +08:00
parent 34c8821802
commit 480476e041
8 changed files with 361 additions and 12 deletions

View File

@ -9,11 +9,13 @@
#include "imgproc/HGImgProc.h"
#include "imgproc/HGOCR.h"
#include "HGUIGlobal.h"
#include "dialog_scaninfo.h"
Dialog_Scan::Dialog_Scan(class MainWindow *mainWnd)
: QDialog(nullptr)
, ui(new Ui::Dialog_Scan)
, m_mainWnd(mainWnd)
, m_dlgScanInfo(nullptr)
, m_devHandle(nullptr)
, m_scanning(false)
, m_dpi(200)
@ -24,6 +26,7 @@ Dialog_Scan::Dialog_Scan(class MainWindow *mainWnd)
{
ui->setupUi(this);
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_dlgScanInfo = new Dialog_ScanInfo(this);
connect(this, SIGNAL(deviceArrive(QString)), this, SLOT(on_deviceArrive(QString)));
connect(this, SIGNAL(deviceRemove(QString)), this, SLOT(on_deviceRemove(QString)));
@ -48,6 +51,8 @@ Dialog_Scan::~Dialog_Scan()
}
sane_exit();
delete m_dlgScanInfo;
delete ui;
}
@ -182,6 +187,7 @@ void Dialog_Scan::StartScan(unsigned int buttonId)
}
m_scanning = true;
m_mainWnd->SetBusy(true);
ui->comboBox->setEnabled(false);
ui->pushButtonScan->setEnabled(false);
status = sane_start(m_devHandle);
@ -197,9 +203,14 @@ void Dialog_Scan::StartScan(unsigned int buttonId)
}
m_scanning = false;
m_mainWnd->SetBusy(false);
m_dpi = 200;
ui->comboBox->setEnabled(true);
ui->pushButtonScan->setEnabled(true);
emit scanWorking();
emit scanInfo((const char*)sane_strstatus(status), true);
emit scanFinish();
return;
}
}
@ -211,6 +222,7 @@ void Dialog_Scan::StopScan()
assert(NULL != m_devHandle);
sane_cancel(m_devHandle);
m_scanning = false;
m_mainWnd->SetBusy(false);
m_dpi = 200;
ui->comboBox->setEnabled(true);
ui->pushButtonScan->setEnabled(true);
@ -608,17 +620,17 @@ void Dialog_Scan::on_keyPress(unsigned int buttonId)
void Dialog_Scan::on_scanWorking()
{
// TODO 显示扫描进度窗口
m_dlgScanInfo->Start();
}
void Dialog_Scan::on_scanInfo(QString info, bool error)
{
// TODO 更新扫描信息到进度窗口
m_dlgScanInfo->SetScanInfo(info, error);
}
void Dialog_Scan::on_scanImage(unsigned int count)
{
// TODO 更新扫描数量到进度窗口
m_dlgScanInfo->SetScanCount(count);
}
void Dialog_Scan::on_scanFinish()
@ -654,16 +666,15 @@ void Dialog_Scan::on_scanFinish()
m_ocrMsgPump = NULL;
}
// TODO 隐藏扫描进度窗口
StopScan();
m_dlgScanInfo->Finish();
}
void Dialog_Scan::on_comboBox_currentIndexChanged(const QString &arg1)
{
assert(!m_scanning);
if (NULL != m_devHandle)
{
StopScan();
sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();

View File

@ -24,9 +24,11 @@ public:
explicit Dialog_Scan(class MainWindow *mainWnd);
~Dialog_Scan();
private:
public:
void StartScan(unsigned int buttonId);
void StopScan();
private:
void SaveImage(HGImage image);
static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param);
static void HGAPI ocrThreadFunc(HGThread thread, HGPointer param);
@ -60,6 +62,7 @@ private slots:
private:
Ui::Dialog_Scan *ui;
class MainWindow *m_mainWnd;
class Dialog_ScanInfo *m_dlgScanInfo;
QString m_devName;
SANE_Handle m_devHandle;
bool m_scanning;

View File

@ -0,0 +1,78 @@
#include "dialog_scaninfo.h"
#include "ui_dialog_scaninfo.h"
#include "dialog_scan.h"
#include <QDesktopWidget>
#include <QTimer>
Dialog_ScanInfo::Dialog_ScanInfo(class Dialog_Scan *dlgScan)
: QDialog(nullptr)
, ui(new Ui::Dialog_ScanInfo)
, m_dlgScan(dlgScan)
, m_timer(nullptr)
, m_error(false)
{
ui->setupUi(this);
setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
m_timer = new QTimer(this);
QDesktopWidget *desktop = QApplication::desktop();
QRect workArea = desktop->availableGeometry();
move(workArea.right() - width(), workArea.bottom() - height());
}
Dialog_ScanInfo::~Dialog_ScanInfo()
{
delete ui;
}
void Dialog_ScanInfo::Start()
{
m_error = false;
ui->labelScanInfo->setText("");
ui->labelScanInfo->repaint();
ui->labelScanCount->setText(tr("Scan count: 0"));
ui->labelScanCount->repaint();
this->repaint();
ui->pushButtonCancel->setVisible(true);
ui->pushButtonOK->setVisible(false);
show();
}
void Dialog_ScanInfo::SetScanInfo(const QString &info, bool error)
{
ui->labelScanInfo->setText(info);
ui->labelScanInfo->repaint();
this->repaint();
m_error = error;
}
void Dialog_ScanInfo::SetScanCount(unsigned int count)
{
ui->labelScanCount->setText(tr("Scan count: ") + QString::number(count));
ui->labelScanCount->repaint();
this->repaint();
}
void Dialog_ScanInfo::Finish()
{
ui->pushButtonCancel->setVisible(false);
ui->pushButtonOK->setVisible(true);
if (!m_error)
{
m_timer->start(1000);
connect(m_timer, &QTimer::timeout, this, &Dialog_ScanInfo::on_pushButtonOK_clicked);
}
}
void Dialog_ScanInfo::on_pushButtonOK_clicked()
{
disconnect(m_timer, &QTimer::timeout, this, &Dialog_ScanInfo::on_pushButtonOK_clicked);
hide();
}
void Dialog_ScanInfo::on_pushButtonCancel_clicked()
{
m_dlgScan->StopScan();
}

View File

@ -0,0 +1,35 @@
#ifndef DIALOG_SCANINFO_H
#define DIALOG_SCANINFO_H
#include <QDialog>
namespace Ui {
class Dialog_ScanInfo;
}
class Dialog_ScanInfo : public QDialog
{
Q_OBJECT
public:
explicit Dialog_ScanInfo(class Dialog_Scan *dlgScan);
~Dialog_ScanInfo();
void Start();
void SetScanInfo(const QString &info, bool error);
void SetScanCount(unsigned int count);
void Finish();
private slots:
void on_pushButtonOK_clicked();
void on_pushButtonCancel_clicked();
private:
Ui::Dialog_ScanInfo *ui;
class Dialog_Scan *m_dlgScan;
QTimer *m_timer;
bool m_error;
};
#endif // DIALOG_SCANINFO_H

View File

@ -0,0 +1,199 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog_ScanInfo</class>
<widget class="QDialog" name="Dialog_ScanInfo">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>294</width>
<height>202</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</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="QLabel" name="labelScanInfo">
<property name="text">
<string>Scan info</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer_3">
<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="QLabel" name="labelScanCount">
<property name="text">
<string>Scan count0</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<spacer name="horizontalSpacer_7">
<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="pushButtonCancel">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<spacer name="horizontalSpacer_5">
<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="pushButtonOK">
<property name="text">
<string>OK</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -50,10 +50,9 @@ MainWindow::MainWindow(QWidget *parent)
ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch);
// TODO 读取配置文件设置m_vScanParams
LoadCfg();
ui->tableWidget->setRowCount((int)m_vScanParams.size());
for (int index = 0; index < (int)m_vScanParams.size(); ++index)
{
ui->tableWidget->setRowHeight(index, 30);
@ -85,6 +84,14 @@ MainWindow::~MainWindow()
delete ui;
}
void MainWindow::SetBusy(bool busy)
{
m_quitAction->setEnabled(!busy);
ui->pushButtonAdd->setEnabled(!busy);
ui->pushButtonModify->setEnabled(!busy);
ui->pushButtonRemove->setEnabled(!busy);
}
bool MainWindow::GetScanParam(const std::string &deviceType, unsigned int buttonId, ScanParam &scanParam)
{
for (int i = 0; i < (int)m_vScanParams.size(); ++i)
@ -119,6 +126,16 @@ bool MainWindow::FindScanParam(const std::string &deviceType, unsigned int butto
return false;
}
void MainWindow::LoadCfg()
{
// TODO 加载配置文件到m_vScanParams
}
void MainWindow::SaveCfg()
{
// TODO 保存m_vScanParams到配置文件
}
QString MainWindow::GetDesc(const std::vector<DeviceConfig> &deviceConfigs)
{
QString desc;
@ -202,7 +219,7 @@ void MainWindow::on_pushButtonAdd_clicked()
{
ScanParam scanParam = dlg.GetScanParam();
m_vScanParams.push_back(scanParam);
// TODO 保存m_vScanParams
SaveCfg();
ui->tableWidget->setRowCount((int)m_vScanParams.size());
int index = (int)m_vScanParams.size() - 1;
@ -264,7 +281,7 @@ void MainWindow::on_pushButtonModify_clicked()
{
ScanParam scanParam = dlg.GetScanParam();
m_vScanParams[index] = scanParam;
// TODO 保存m_vScanParams
SaveCfg();
ui->tableWidget->item(index, 0)->setText(QString::fromStdString(m_vScanParams[index].deviceType));
@ -295,6 +312,6 @@ void MainWindow::on_pushButtonRemove_clicked()
}
m_vScanParams.erase(m_vScanParams.begin() + index);
// TODO 保存m_vScanParams
SaveCfg();
ui->tableWidget->removeRow(index);
}

View File

@ -20,10 +20,13 @@ public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void SetBusy(bool busy);
bool GetScanParam(const std::string &deviceType, unsigned int buttonId, ScanParam &scanParam);
bool FindScanParam(const std::string &deviceType, unsigned int buttonId, int ignoreIndex);
private:
void LoadCfg();
void SaveCfg();
QString GetDesc(const std::vector<DeviceConfig> &deviceConfigs);
QString GetDesc(const SaveParam &saveParam);

View File

@ -102,6 +102,7 @@ SOURCES += \
../../../app/scantool/app_cfg.cpp \
../../../app/scantool/dialog_add.cpp \
../../../app/scantool/dialog_scan.cpp \
../../../app/scantool/dialog_scaninfo.cpp \
../../../app/scantool/dialog_writesettings.cpp \
../../../app/scantool/form_deviceconfig.cpp \
../../../app/scantool/form_saveparam.cpp \
@ -117,6 +118,7 @@ HEADERS += \
../../../app/scantool/app_cfg.h \
../../../app/scantool/dialog_add.h \
../../../app/scantool/dialog_scan.h \
../../../app/scantool/dialog_scaninfo.h \
../../../app/scantool/dialog_writesettings.h \
../../../app/scantool/form_deviceconfig.h \
../../../app/scantool/form_saveparam.h \
@ -128,6 +130,7 @@ HEADERS += \
FORMS += \
../../../app/scantool/dialog_add.ui \
../../../app/scantool/dialog_scan.ui \
../../../app/scantool/dialog_scaninfo.ui \
../../../app/scantool/dialog_writesettings.ui \
../../../app/scantool/form_saveparam.ui \
../../../app/scantool/mainwindow.ui