#include "dialog_device_select.h" #include "ui_dialog_device_select.h" #include Dialog_Device_Select::Dialog_Device_Select(const SANEAPI* saneApi, const char **devNames, QWidget *parent) : QDialog(parent), ui(new Ui::Dialog_Device_Select) { ui->setupUi(this); memcpy(&m_saneAPI, saneApi, sizeof(SANEAPI)); m_devHandle = nullptr; m_devName.clear(); m_vDevName.clear(); setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); if (nullptr == devNames) { const SANE_Device** device_list; if (SANE_STATUS_GOOD == saneApi->sane_get_devices_api(&device_list, SANE_TRUE)) { const SANE_Device** p; for (p = device_list; *p != nullptr; ++p) { m_vDevName.push_back((*p)->name); ui->listWidget->addItem((*p)->name); } } } else { const char **p = devNames; while (*p != nullptr) { m_vDevName.push_back(*p); ui->listWidget->addItem(*p); ++p; } } if (!m_vDevName.empty()) { ui->listWidget->setCurrentRow(0); } if (ui->listWidget->count() > 1) processSameDeviceType(); } Dialog_Device_Select::~Dialog_Device_Select() { delete ui; } SANE_Handle Dialog_Device_Select::GetDevHandle() { return m_devHandle; } std::string Dialog_Device_Select::GetDevName() { return m_devName; } void Dialog_Device_Select::processSameDeviceType() { int len = ui->listWidget->count(); for (int i = 0; i < len - 1; ++i) { for (int j = i + 1; j < len; ++j) { QString devName = ui->listWidget->item(i)->text(); QString devName2 = ui->listWidget->item(j)->text(); if (devName.contains(" - ")) { devName.truncate(devName.lastIndexOf(" - ")); if (!devName.contains(" - ")) { devName = ui->listWidget->item(i)->text(); } } if (devName2.contains(" - ")) { devName2.truncate(devName2.lastIndexOf(" - ")); if (!devName2.contains(" - ")) { devName2 = ui->listWidget->item(j)->text(); } } if (devName == devName2) { SANE_Handle dev = nullptr; SANE_Status ret = m_saneAPI.sane_open_api(ui->listWidget->item(i)->text().toStdString().c_str(), &dev); if (SANE_STATUS_GOOD == ret && dev != nullptr) { char serialNum[32] = {0}; m_saneAPI.sane_control_option_api(dev, SANE_OPT_ID_DEVICE_SERIAL_NO, SANE_ACTION_GET_VALUE, serialNum, NULL); ui->listWidget->item(i)->setText(ui->listWidget->item(i)->text() + "(" + QString::fromLocal8Bit(serialNum) + ")"); m_saneAPI.sane_close_api(dev); } ret = m_saneAPI.sane_open_api(ui->listWidget->item(j)->text().toStdString().c_str(), &dev); if (SANE_STATUS_GOOD == ret && dev != nullptr) { char serialNum[32] = {0}; m_saneAPI.sane_control_option_api(dev, SANE_OPT_ID_DEVICE_SERIAL_NO, SANE_ACTION_GET_VALUE, serialNum, NULL); ui->listWidget->item(j)->setText(ui->listWidget->item(j)->text() + "(" + QString::fromLocal8Bit(serialNum) + ")"); m_saneAPI.sane_close_api(dev); } } } } } 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"), QString::fromUtf8(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(); } void Dialog_Device_Select::on_listWidget_itemDoubleClicked(QListWidgetItem *item) { on_pushButton_OK_clicked(); }