HGSaneUI中实现选择设备和扫描对话框
This commit is contained in:
parent
f75c49dff4
commit
2e41e33a44
|
@ -7,8 +7,16 @@ int show_devlist_ui(SANEAPI* saneApi, HGWindow parent, SANE_Handle *handle, char
|
||||||
{
|
{
|
||||||
if (nullptr == saneApi || nullptr == handle)
|
if (nullptr == saneApi || nullptr == handle)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (nullptr == qApp)
|
if (nullptr == qApp)
|
||||||
|
{
|
||||||
|
#ifdef HG_CMP_MSC
|
||||||
|
// 创建WIN32窗口
|
||||||
return -2;
|
return -2;
|
||||||
|
#else
|
||||||
|
return -2;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
QWidget *qParent = nullptr;
|
QWidget *qParent = nullptr;
|
||||||
#ifdef HG_CMP_MSC
|
#ifdef HG_CMP_MSC
|
||||||
|
@ -40,8 +48,17 @@ int show_setting_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent)
|
||||||
{
|
{
|
||||||
if (nullptr == saneApi || nullptr == handle)
|
if (nullptr == saneApi || nullptr == handle)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (nullptr == qApp)
|
if (nullptr == qApp)
|
||||||
|
{
|
||||||
|
#ifdef HG_CMP_MSC
|
||||||
|
// 创建WIN32窗口
|
||||||
return -2;
|
return -2;
|
||||||
|
#else
|
||||||
|
return -2;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,7 +66,27 @@ int show_scan_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, show_sca
|
||||||
{
|
{
|
||||||
if (nullptr == saneApi || nullptr == handle)
|
if (nullptr == saneApi || nullptr == handle)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (nullptr == qApp)
|
if (nullptr == qApp)
|
||||||
|
{
|
||||||
|
#ifdef HG_CMP_MSC
|
||||||
|
// 创建WIN32窗口
|
||||||
return -2;
|
return -2;
|
||||||
|
#else
|
||||||
|
return -2;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget *qParent = nullptr;
|
||||||
|
#ifdef HG_CMP_MSC
|
||||||
|
qParent = QWidget::find((WId)parent);
|
||||||
|
if (nullptr != parent && nullptr == qParent)
|
||||||
|
return -2;
|
||||||
|
#else
|
||||||
|
qParent = parent;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Dialog_Device_Scan dlg(saneApi, handle, callback, callbackParam, qParent);
|
||||||
|
dlg.exec();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,28 @@
|
||||||
#include "dialog_device_scan.h"
|
#include "dialog_device_scan.h"
|
||||||
#include "ui_dialog_device_scan.h"
|
#include "ui_dialog_device_scan.h"
|
||||||
|
|
||||||
Dialog_Device_Scan::Dialog_Device_Scan(SANE_Handle dev, QWidget *parent) :
|
Dialog_Device_Scan::Dialog_Device_Scan(SANEAPI* saneApi, SANE_Handle dev,
|
||||||
|
show_scan_ui_image_callback callback, void *callbackParam, QWidget *parent) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
ui(new Ui::Dialog_Device_Scan)
|
ui(new Ui::Dialog_Device_Scan)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
memcpy(&m_saneAPI, saneApi, sizeof(SANEAPI));
|
||||||
m_saneDev = dev;
|
m_saneDev = dev;
|
||||||
|
m_callback = callback;
|
||||||
|
m_callbackParam = callbackParam;
|
||||||
|
m_buffer = NULL;
|
||||||
|
m_bufferSize = 0;
|
||||||
|
m_stopThread = HGFALSE;
|
||||||
|
m_thread = NULL;
|
||||||
|
|
||||||
connect(this, SIGNAL(eventFunc(unsigned int, QString)), this, SLOT(on_eventFunc(unsigned int, QString)), Qt::QueuedConnection);
|
connect(this, SIGNAL(eventFunc(QString)), this, SLOT(on_eventFunc(QString)), Qt::QueuedConnection);
|
||||||
|
connect(this, SIGNAL(newImage(void *, void *)), this, SLOT(on_newImage(void *, void *)), Qt::QueuedConnection);
|
||||||
|
|
||||||
ui->pushButton_Continue->setEnabled(false);
|
ui->pushButton_Continue->setEnabled(true);
|
||||||
ui->pushButton_Cancel->setEnabled(false);
|
ui->pushButton_Cancel->setEnabled(false);
|
||||||
ui->pushButton_Complete->setEnabled(false);
|
ui->pushButton_Complete->setEnabled(true);
|
||||||
|
|
||||||
on_pushButton_Continue_clicked();
|
on_pushButton_Continue_clicked();
|
||||||
}
|
}
|
||||||
|
@ -22,14 +32,39 @@ Dialog_Device_Scan::~Dialog_Device_Scan()
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dialog_Device_Scan::on_eventFunc(HGUInt error, QString errInfo)
|
void Dialog_Device_Scan::on_eventFunc(QString errInfo)
|
||||||
{
|
{
|
||||||
|
ui->label->setText(errInfo);
|
||||||
|
|
||||||
|
m_stopThread = HGTRUE;
|
||||||
|
m_saneAPI.sane_cancel_api(m_saneDev);
|
||||||
|
HGBase_CloseThread(m_thread);
|
||||||
|
m_thread = NULL;
|
||||||
|
|
||||||
|
free(m_buffer);
|
||||||
|
m_buffer = NULL;
|
||||||
|
m_bufferSize = 0;
|
||||||
|
|
||||||
|
ui->pushButton_Continue->setEnabled(true);
|
||||||
|
ui->pushButton_Cancel->setEnabled(false);
|
||||||
|
ui->pushButton_Complete->setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dialog_Device_Scan::on_newImage(void *format, void *data)
|
||||||
|
{
|
||||||
|
SANE_Parameters *format2 = (SANE_Parameters *)format;
|
||||||
|
SANE_Byte *data2 = (HGByte *)data;
|
||||||
|
|
||||||
|
if (NULL != m_callback)
|
||||||
|
m_callback(format2, data2, m_callbackParam);
|
||||||
|
|
||||||
|
delete [] data2;
|
||||||
|
delete format2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dialog_Device_Scan::on_pushButton_Cancel_clicked()
|
void Dialog_Device_Scan::on_pushButton_Cancel_clicked()
|
||||||
{
|
{
|
||||||
|
m_saneAPI.sane_cancel_api(m_saneDev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dialog_Device_Scan::on_pushButton_Complete_clicked()
|
void Dialog_Device_Scan::on_pushButton_Complete_clicked()
|
||||||
|
@ -39,5 +74,92 @@ void Dialog_Device_Scan::on_pushButton_Complete_clicked()
|
||||||
|
|
||||||
void Dialog_Device_Scan::on_pushButton_Continue_clicked()
|
void Dialog_Device_Scan::on_pushButton_Continue_clicked()
|
||||||
{
|
{
|
||||||
|
SANE_Parameters params;
|
||||||
|
memset(¶ms, 0, sizeof(SANE_Parameters));
|
||||||
|
SANE_Status stat = m_saneAPI.sane_get_parameters_api(m_saneDev, ¶ms);
|
||||||
|
assert(SANE_STATUS_GOOD == stat);
|
||||||
|
|
||||||
|
m_bufferSize = 5000 * 4000;
|
||||||
|
m_buffer = (HGByte *)malloc(m_bufferSize);
|
||||||
|
if (NULL == m_buffer)
|
||||||
|
{
|
||||||
|
ui->label->setText(tr("out of memory"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_stopThread = HGFALSE;
|
||||||
|
HGBase_OpenThread(ThreadFunc, this, &m_thread);
|
||||||
|
|
||||||
|
ui->pushButton_Continue->setEnabled(false);
|
||||||
|
ui->pushButton_Cancel->setEnabled(true);
|
||||||
|
ui->pushButton_Complete->setEnabled(false);
|
||||||
|
|
||||||
|
ui->label->setText(tr("正在扫描......"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void HGAPI Dialog_Device_Scan::ThreadFunc(HGThread thread, HGPointer param)
|
||||||
|
{
|
||||||
|
Dialog_Device_Scan* p = (Dialog_Device_Scan*)param;
|
||||||
|
|
||||||
|
SANE_Status stat = p->m_saneAPI.sane_start_api(p->m_saneDev);
|
||||||
|
if (SANE_STATUS_GOOD != stat)
|
||||||
|
{
|
||||||
|
emit p->eventFunc(tr(p->m_saneAPI.sane_strstatus_api(stat)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!p->m_stopThread)
|
||||||
|
{
|
||||||
|
SANE_Parameters params;
|
||||||
|
memset(¶ms, 0, sizeof(SANE_Parameters));
|
||||||
|
SANE_Status stat1 = p->m_saneAPI.sane_get_parameters_api(p->m_saneDev, ¶ms);
|
||||||
|
|
||||||
|
SANE_Int readSize = 0;
|
||||||
|
SANE_Status stat2 = SANE_STATUS_GOOD;
|
||||||
|
while (readSize < p->m_bufferSize)
|
||||||
|
{
|
||||||
|
SANE_Int len = 0;
|
||||||
|
stat2 = p->m_saneAPI.sane_read_api(p->m_saneDev, p->m_buffer + readSize, p->m_bufferSize - readSize, &len);
|
||||||
|
readSize += len;
|
||||||
|
if (SANE_STATUS_GOOD != stat2)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SANE_STATUS_GOOD == stat2)
|
||||||
|
{
|
||||||
|
// m_bufferSize空间不够
|
||||||
|
emit p->eventFunc(tr(p->m_saneAPI.sane_strstatus_api(SANE_STATUS_INVAL)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (SANE_STATUS_EOF == stat2)
|
||||||
|
{
|
||||||
|
if (0 == readSize)
|
||||||
|
{
|
||||||
|
emit p->eventFunc(tr("扫描完成"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (SANE_STATUS_GOOD != stat1 || readSize != params.bytes_per_line * params.lines)
|
||||||
|
{
|
||||||
|
emit p->eventFunc(tr(p->m_saneAPI.sane_strstatus_api(SANE_STATUS_INVAL)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (SANE_STATUS_CANCELLED == stat2)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
emit p->eventFunc(tr(p->m_saneAPI.sane_strstatus_api(stat2)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SANE_Parameters *format = new SANE_Parameters;
|
||||||
|
memcpy(format, ¶ms, sizeof(SANE_Parameters));
|
||||||
|
SANE_Byte *data = new HGByte [readSize];
|
||||||
|
memcpy(data, p->m_buffer, readSize);
|
||||||
|
emit p->newImage(format, data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
#define DIALOG_DEVICE_SCAN_H
|
#define DIALOG_DEVICE_SCAN_H
|
||||||
|
|
||||||
#include "base/HGDef.h"
|
#include "base/HGDef.h"
|
||||||
|
#include "base/HGThread.h"
|
||||||
#include "sane/sane_ex.h"
|
#include "sane/sane_ex.h"
|
||||||
|
#include "HGSaneUI.h"
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
|
@ -14,25 +16,34 @@ class Dialog_Device_Scan : public QDialog
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit Dialog_Device_Scan(SANE_Handle dev, QWidget *parent = nullptr);
|
Dialog_Device_Scan(SANEAPI* saneApi, SANE_Handle dev,
|
||||||
|
show_scan_ui_image_callback callback, void *callbackParam, QWidget *parent = nullptr);
|
||||||
~Dialog_Device_Scan();
|
~Dialog_Device_Scan();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void eventFunc(HGUInt error, QString errInfo);
|
void eventFunc(QString errInfo);
|
||||||
void newImage(void *image);
|
void newImage(void *format, void *data);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void on_eventFunc(HGUInt error, QString errInfo);
|
void on_eventFunc(QString errInfo);
|
||||||
|
void on_newImage(void *format, void *data);
|
||||||
void on_pushButton_Cancel_clicked();
|
void on_pushButton_Cancel_clicked();
|
||||||
|
|
||||||
void on_pushButton_Complete_clicked();
|
void on_pushButton_Complete_clicked();
|
||||||
|
|
||||||
void on_pushButton_Continue_clicked();
|
void on_pushButton_Continue_clicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void HGAPI ThreadFunc(HGThread thread, HGPointer param);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::Dialog_Device_Scan *ui;
|
Ui::Dialog_Device_Scan *ui;
|
||||||
|
SANEAPI m_saneAPI;
|
||||||
SANE_Handle m_saneDev;
|
SANE_Handle m_saneDev;
|
||||||
|
show_scan_ui_image_callback m_callback;
|
||||||
|
void *m_callbackParam;
|
||||||
|
HGByte* m_buffer;
|
||||||
|
HGInt m_bufferSize;
|
||||||
|
volatile HGBool m_stopThread;
|
||||||
|
HGThread m_thread;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DIALOG_DEVICE_SCAN_H
|
#endif // DIALOG_DEVICE_SCAN_H
|
||||||
|
|
|
@ -8,18 +8,26 @@ Dialog_Device_Select::Dialog_Device_Select(SANEAPI* saneApi, QWidget *parent) :
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
memcpy(&m_saneAPI, saneApi, sizeof(SANEAPI));
|
||||||
|
m_devHandle = nullptr;
|
||||||
|
m_devName.clear();
|
||||||
|
m_vDevName.clear();
|
||||||
|
|
||||||
const SANE_Device** device_list;
|
const SANE_Device** device_list;
|
||||||
if (SANE_STATUS_GOOD == saneApi->sane_get_devices_api(&device_list, SANE_TRUE))
|
if (SANE_STATUS_GOOD == saneApi->sane_get_devices_api(&device_list, SANE_TRUE))
|
||||||
{
|
{
|
||||||
const SANE_Device** p;
|
const SANE_Device** p;
|
||||||
for (p = device_list; *p != nullptr; ++p)
|
for (p = device_list; *p != nullptr; ++p)
|
||||||
{
|
{
|
||||||
|
m_vDevName.push_back((*p)->name);
|
||||||
ui->listWidget->addItem((*p)->name);
|
ui->listWidget->addItem((*p)->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_devHandle = nullptr;
|
if (!m_vDevName.empty())
|
||||||
m_devName.clear();
|
{
|
||||||
|
ui->listWidget->setCurrentRow(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Dialog_Device_Select::~Dialog_Device_Select()
|
Dialog_Device_Select::~Dialog_Device_Select()
|
||||||
|
@ -37,7 +45,28 @@ std::string Dialog_Device_Select::GetDevName()
|
||||||
return m_devName;
|
return m_devName;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dialog_Device_Select::on_buttonBox_accepted()
|
void Dialog_Device_Select::on_pushButton_OK_clicked()
|
||||||
{
|
{
|
||||||
|
int index = ui->listWidget->currentRow();
|
||||||
|
if (index < 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SANE_Handle dev = nullptr;
|
||||||
|
SANE_Status ret = m_saneAPI.sane_open_api(m_vDevName[index].c_str(), &dev);
|
||||||
|
if (SANE_STATUS_GOOD != ret)
|
||||||
|
{
|
||||||
|
QMessageBox::information(this, tr("tips"), tr(m_saneAPI.sane_strstatus_api(ret)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_devHandle = dev;
|
||||||
|
m_devName = m_vDevName[index];
|
||||||
|
accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dialog_Device_Select::on_pushButton_Cancel_clicked()
|
||||||
|
{
|
||||||
|
reject();
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "sane/sane_ex.h"
|
#include "sane/sane_ex.h"
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class Dialog_Device_Select;
|
class Dialog_Device_Select;
|
||||||
|
@ -22,13 +23,16 @@ public:
|
||||||
std::string GetDevName();
|
std::string GetDevName();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void on_buttonBox_accepted();
|
void on_pushButton_OK_clicked();
|
||||||
|
void on_pushButton_Cancel_clicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::Dialog_Device_Select *ui;
|
Ui::Dialog_Device_Select *ui;
|
||||||
|
|
||||||
|
SANEAPI m_saneAPI;
|
||||||
SANE_Handle m_devHandle;
|
SANE_Handle m_devHandle;
|
||||||
std::string m_devName;
|
std::string m_devName;
|
||||||
|
std::vector<std::string> m_vDevName;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DIALOG_DEVICE_SELECT_H
|
#endif // DIALOG_DEVICE_SELECT_H
|
||||||
|
|
|
@ -15,53 +15,45 @@
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QListWidget" name="listWidget"/>
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QListWidget" name="listWidget"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<property name="orientation">
|
<item>
|
||||||
<enum>Qt::Horizontal</enum>
|
<spacer name="horizontalSpacer">
|
||||||
</property>
|
<property name="orientation">
|
||||||
<property name="standardButtons">
|
<enum>Qt::Horizontal</enum>
|
||||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
</property>
|
||||||
</property>
|
<property name="sizeHint" stdset="0">
|
||||||
</widget>
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_OK">
|
||||||
|
<property name="text">
|
||||||
|
<string>确定</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_Cancel">
|
||||||
|
<property name="text">
|
||||||
|
<string>取消</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections/>
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>accepted()</signal>
|
|
||||||
<receiver>Dialog_Device_Select</receiver>
|
|
||||||
<slot>accept()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>248</x>
|
|
||||||
<y>254</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>157</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>rejected()</signal>
|
|
||||||
<receiver>Dialog_Device_Select</receiver>
|
|
||||||
<slot>reject()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>316</x>
|
|
||||||
<y>260</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>286</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
</ui>
|
||||||
|
|
Loading…
Reference in New Issue