#include "dialog_scan.h" #include "ui_dialog_scan.h" #include #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; } }