code_app/app/scantool/dialog_scan.cpp

117 lines
2.6 KiB
C++

#include "dialog_scan.h"
#include "ui_dialog_scan.h"
#include <QCloseEvent>
#include "mainwindow.h"
Dialog_Scan::Dialog_Scan(class MainWindow *mainWnd)
: QDialog(nullptr)
, ui(new Ui::Dialog_Scan)
, m_mainWnd(mainWnd)
, m_devHandle(nullptr)
{
ui->setupUi(this);
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
connect(this, SIGNAL(deviceArrive(QString)), this, SLOT(on_deviceArrive(QString)));
connect(this, SIGNAL(deviceRemove(QString)), this, SLOT(on_deviceRemove(QString)));
SANE_Int version_code = 0;
sane_init_ex(&version_code, sane_ex_callback, this);
}
Dialog_Scan::~Dialog_Scan()
{
if (NULL != m_devHandle)
{
sane_cancel(m_devHandle);
sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();
}
sane_exit();
delete ui;
}
int Dialog_Scan::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param)
{
(void)hdev;
(void)len;
Dialog_Scan* p = (Dialog_Scan*)param;
switch (code)
{
case SANE_EVENT_DEVICE_ARRIVED:
{
SANE_Device* sane_dev = (SANE_Device*)data;
emit p->deviceArrive(sane_dev->name);
}
break;
case SANE_EVENT_DEVICE_LEFT:
{
SANE_Device* sane_dev = (SANE_Device*)data;
emit p->deviceRemove(sane_dev->name);
}
break;
}
return 0;
}
void Dialog_Scan::closeEvent(QCloseEvent *e)
{
hide(); // 隐藏主窗口
e->ignore(); //忽略关闭事件,这样才不会关闭程序
}
void Dialog_Scan::on_deviceArrive(QString devName)
{
ui->comboBox->addItem(devName);
if (nullptr == m_devHandle)
{
SANE_Status status = sane_open(devName.toStdString().c_str(), &m_devHandle);
if (SANE_STATUS_GOOD == status)
{
m_devName = devName;
}
}
}
void Dialog_Scan::on_deviceRemove(QString devName)
{
if (devName == m_devName)
{
assert(NULL != m_devHandle);
sane_cancel(m_devHandle);
sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();
}
for (int i = 0; i < ui->comboBox->count(); ++i)
{
if (ui->comboBox->itemText(i) == devName)
{
ui->comboBox->removeItem(i);
break;
}
}
}
void Dialog_Scan::on_comboBox_currentIndexChanged(const QString &arg1)
{
if (NULL != m_devHandle)
{
sane_cancel(m_devHandle);
sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();
}
SANE_Status status = sane_open(arg1.toStdString().c_str(), &m_devHandle);
if (SANE_STATUS_GOOD == status)
{
m_devName = arg1;
}
}