将设备配置类改为基于sane句柄

This commit is contained in:
luoliangyi 2024-04-24 18:08:14 +08:00
parent f483a44d09
commit ad1cc486eb
10 changed files with 179 additions and 73 deletions

View File

@ -3,7 +3,7 @@
#include "mainwindow.h"
#include <QMessageBox>
Dialog_Add::Dialog_Add(class MainWindow *mainWnd)
Dialog_Add::Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const std::string &deviceType)
: QDialog(mainWnd)
, ui(new Ui::Dialog_Add)
, m_mainWnd(mainWnd)
@ -11,30 +11,26 @@ Dialog_Add::Dialog_Add(class MainWindow *mainWnd)
{
ui->setupUi(this);
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
// 添加
this->setWindowTitle(tr("Add"));
this->setWindowTitle(tr("Add") + " (" + QString(deviceType.c_str()) + ")");
ui->comboBoxDeviceType->addItem("G100");
ui->comboBoxDeviceType->addItem("G200");
ui->comboBoxDeviceType->addItem("G300");
ui->comboBoxDeviceType->addItem("G400");
// TODO 通过devHandle获取支持的按钮并添加到下拉列表
ui->comboBoxButtonType->addItem("Button 1");
ui->comboBoxButtonType->addItem("Button 2");
ui->comboBoxButtonType->addItem("Button 3");
m_scanParam.deviceType = DeviceType(ui->comboBoxDeviceType->currentIndex() + 1);
m_scanParam.deviceType = deviceType;
m_scanParam.buttonType = ButtonType(ui->comboBoxButtonType->currentIndex() + 1);
m_scanParam.deviceConfig.clear();
m_scanParam.saveParam = Form_SaveParam::GetDefSaveParam();
m_formDeviceConfig = new Form_DeviceConfig(m_scanParam.deviceType, m_scanParam.deviceConfig, this);
m_formDeviceConfig = new Form_DeviceConfig(devHandle, m_scanParam.deviceConfig, this);
m_formSaveParam = new Form_SaveParam(m_scanParam.saveParam, this);
ui->stackedWidget->addWidget(m_formDeviceConfig);
ui->stackedWidget->addWidget(m_formSaveParam);
ui->stackedWidget->setCurrentIndex(0);
}
Dialog_Add::Dialog_Add(class MainWindow *mainWnd, const ScanParam &scanParam, int index)
Dialog_Add::Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const ScanParam &scanParam, int index)
: QDialog(mainWnd)
, ui(new Ui::Dialog_Add)
, m_mainWnd(mainWnd)
@ -42,22 +38,17 @@ Dialog_Add::Dialog_Add(class MainWindow *mainWnd, const ScanParam &scanParam, in
{
ui->setupUi(this);
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
// 修改
this->setWindowTitle(tr("Modify"));
this->setWindowTitle(tr("Modify") + " (" + QString(scanParam.deviceType.c_str()) + ")");
ui->comboBoxDeviceType->addItem("G100");
ui->comboBoxDeviceType->addItem("G200");
ui->comboBoxDeviceType->addItem("G300");
ui->comboBoxDeviceType->addItem("G400");
// TODO 通过devHandle获取支持的按钮并添加到下拉列表
ui->comboBoxButtonType->addItem("Button 1");
ui->comboBoxButtonType->addItem("Button 2");
ui->comboBoxButtonType->addItem("Button 3");
m_scanParam = scanParam;
ui->comboBoxDeviceType->setCurrentIndex(m_scanParam.deviceType - 1);
ui->comboBoxButtonType->setCurrentIndex(m_scanParam.buttonType - 1);
m_formDeviceConfig = new Form_DeviceConfig(m_scanParam.deviceType, m_scanParam.deviceConfig, this);
m_formDeviceConfig = new Form_DeviceConfig(devHandle, m_scanParam.deviceConfig, this);
m_formSaveParam = new Form_SaveParam(m_scanParam.saveParam, this);
ui->stackedWidget->addWidget(m_formDeviceConfig);
ui->stackedWidget->addWidget(m_formSaveParam);
@ -86,13 +77,6 @@ void Dialog_Add::on_pushButtonSaveParam_clicked()
ui->stackedWidget->setCurrentIndex(1);
}
void Dialog_Add::on_comboBoxDeviceType_currentIndexChanged(int index)
{
m_scanParam.deviceType = DeviceType(index + 1);
m_scanParam.deviceConfig.clear();
m_formDeviceConfig->Update(m_scanParam.deviceType, m_scanParam.deviceConfig);
}
void Dialog_Add::on_comboBoxButtonType_currentIndexChanged(int index)
{
m_scanParam.buttonType = ButtonType(index + 1);

View File

@ -2,6 +2,7 @@
#define DIALOG_ADD_H
#include <QDialog>
#include "sane/sane_ex.h"
#include "form_deviceconfig.h"
#include "form_saveparam.h"
@ -18,7 +19,7 @@ enum ButtonType
struct ScanParam
{
DeviceType deviceType;
std::string deviceType;
ButtonType buttonType;
std::string deviceConfig;
SaveParam saveParam;
@ -29,8 +30,8 @@ class Dialog_Add : public QDialog
Q_OBJECT
public:
explicit Dialog_Add(class MainWindow *mainWnd);
Dialog_Add(class MainWindow *mainWnd, const ScanParam &scanParam, int index);
explicit Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const std::string &deviceType);
Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const ScanParam &scanParam, int index);
~Dialog_Add();
ScanParam GetScanParam();
@ -40,8 +41,6 @@ private slots:
void on_pushButtonSaveParam_clicked();
void on_comboBoxDeviceType_currentIndexChanged(int index);
void on_comboBoxButtonType_currentIndexChanged(int index);
void on_pushButtonOK_clicked();

View File

@ -19,18 +19,7 @@
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>设备类型:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBoxDeviceType"/>
</item>
</layout>
<layout class="QHBoxLayout" name="horizontalLayout"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">

View File

@ -7,18 +7,111 @@ 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;
}
}

View File

@ -2,6 +2,9 @@
#define DIALOG_SCAN_H
#include <QDialog>
#include <vector>
#include "sane/sane_ex.h"
#include "sane/sane_option_definitions.h"
namespace Ui {
class Dialog_Scan;
@ -11,16 +14,32 @@ class Dialog_Scan : public QDialog
{
Q_OBJECT
friend class MainWindow;
public:
explicit Dialog_Scan(class MainWindow *mainWnd);
~Dialog_Scan();
private:
static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param);
protected:
virtual void closeEvent(QCloseEvent *e) override;
signals:
void deviceArrive(QString devName);
void deviceRemove(QString devName);
private slots:
void on_deviceArrive(QString devName);
void on_deviceRemove(QString devName);
void on_comboBox_currentIndexChanged(const QString &arg1);
private:
Ui::Dialog_Scan *ui;
class MainWindow *m_mainWnd;
QString m_devName;
SANE_Handle m_devHandle;
};
#endif // DIALOG_SCAN_H

View File

@ -1,12 +1,12 @@
#include "form_deviceconfig.h"
#include "ui_form_deviceconfig.h"
Form_DeviceConfig::Form_DeviceConfig(DeviceType deviceType, const std::string &deviceConfig, QWidget *parent)
Form_DeviceConfig::Form_DeviceConfig(SANE_Handle devHandle, const std::string &deviceConfig, QWidget *parent)
: QWidget(parent)
, ui(new Ui::Form_DeviceConfig)
{
ui->setupUi(this);
Update(deviceType, deviceConfig);
CreateUI(devHandle, deviceConfig);
}
Form_DeviceConfig::~Form_DeviceConfig()
@ -14,11 +14,6 @@ Form_DeviceConfig::~Form_DeviceConfig()
delete ui;
}
void Form_DeviceConfig::Update(DeviceType deviceType, const std::string &deviceConfig)
{
// TODO 展示界面
}
std::string Form_DeviceConfig::GetDeviceConfig()
{
std::string deviceConfig;
@ -27,3 +22,8 @@ std::string Form_DeviceConfig::GetDeviceConfig()
return deviceConfig;
}
void Form_DeviceConfig::CreateUI(SANE_Handle devHandle, const std::string &deviceConfig)
{
// 创建UI
}

View File

@ -2,30 +2,25 @@
#define FORM_DEVICECONFIG_H
#include <QWidget>
#include "sane/sane_ex.h"
namespace Ui {
class Form_DeviceConfig;
}
enum DeviceType
{
DeviceType_G100 = 1,
DeviceType_G200,
DeviceType_G300,
DeviceType_G400
};
class Form_DeviceConfig : public QWidget
{
Q_OBJECT
public:
explicit Form_DeviceConfig(DeviceType deviceType, const std::string &deviceConfig, QWidget *parent = nullptr);
explicit Form_DeviceConfig(SANE_Handle devHandle, const std::string &deviceConfig, QWidget *parent = nullptr);
~Form_DeviceConfig();
void Update(DeviceType deviceType, const std::string &deviceConfig);
std::string GetDeviceConfig();
private:
void CreateUI(SANE_Handle devHandle, const std::string &deviceConfig);
private:
Ui::Form_DeviceConfig *ui;
};

View File

@ -44,8 +44,8 @@ MainWindow::MainWindow(QWidget *parent)
ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Button Type"));
ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("Device Config"));
ui->tableWidget->setHorizontalHeaderItem(3, new QTableWidgetItem("Save Param"));
ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch);
@ -57,8 +57,7 @@ MainWindow::MainWindow(QWidget *parent)
{
ui->tableWidget->setRowHeight(index, 30);
const char *devTypeStr[] = {NULL, "G100", "G200", "G300", "G400"};
ui->tableWidget->setItem(index, 0, new QTableWidgetItem(devTypeStr[m_vScanParams[index].deviceType]));
ui->tableWidget->setItem(index, 0, new QTableWidgetItem(QString(m_vScanParams[index].deviceType.c_str())));
ui->tableWidget->item(index, 0)->setTextAlignment(Qt::AlignCenter);
ui->tableWidget->item(index, 0)->setFlags(ui->tableWidget->item(index, 0)->flags() & ~Qt::ItemIsEditable);
@ -85,7 +84,7 @@ MainWindow::~MainWindow()
delete ui;
}
bool MainWindow::GetScanParam(DeviceType deviceType, ButtonType buttonType, ScanParam &scanParam)
bool MainWindow::GetScanParam(const std::string &deviceType, ButtonType buttonType, ScanParam &scanParam)
{
for (int i = 0; i < (int)m_vScanParams.size(); ++i)
{
@ -99,7 +98,7 @@ bool MainWindow::GetScanParam(DeviceType deviceType, ButtonType buttonType, Scan
return false;
}
bool MainWindow::FindScanParam(DeviceType deviceType, ButtonType buttonType, int ignoreIndex)
bool MainWindow::FindScanParam(const std::string &deviceType, ButtonType buttonType, int ignoreIndex)
{
for (int i = 0; i < (int)m_vScanParams.size(); ++i)
{
@ -183,7 +182,21 @@ void MainWindow::on_showMainWindowDlg()
void MainWindow::on_pushButtonAdd_clicked()
{
Dialog_Add dlg(this);
if (NULL == m_scanDlg->m_devHandle)
{
QMessageBox::information(this, tr("Tips"), tr("Device is offline"));
return;
}
// TODO 获取m_scanDlg->m_devHandle是否支持按键扫描
if (0)
{
QMessageBox::information(this, tr("Tips"), tr("The device does not support key scanning"));
return;
}
std::string deviceType = m_scanDlg->m_devName.toStdString(); // TODO 获取m_scanDlg->m_devHandle设备类型
Dialog_Add dlg(m_scanDlg->m_devHandle, this, deviceType);
if (dlg.exec())
{
ScanParam scanParam = dlg.GetScanParam();
@ -195,8 +208,7 @@ void MainWindow::on_pushButtonAdd_clicked()
ui->tableWidget->setRowHeight(index, 30);
const char *devTypeStr[] = {NULL, "G100", "G200", "G300", "G400"};
ui->tableWidget->setItem(index, 0, new QTableWidgetItem(devTypeStr[m_vScanParams[index].deviceType]));
ui->tableWidget->setItem(index, 0, new QTableWidgetItem(QString(m_vScanParams[index].deviceType.c_str())));
ui->tableWidget->item(index, 0)->setTextAlignment(Qt::AlignCenter);
ui->tableWidget->item(index, 0)->setFlags(ui->tableWidget->item(index, 0)->flags() & ~Qt::ItemIsEditable);
@ -226,15 +238,27 @@ void MainWindow::on_pushButtonModify_clicked()
return;
}
Dialog_Add dlg(this, m_vScanParams[index], index);
if (NULL == m_scanDlg->m_devHandle)
{
QMessageBox::information(this, tr("Tips"), tr("Device is offline"));
return;
}
std::string deviceType = m_scanDlg->m_devName.toStdString(); // TODO 获取m_scanDlg->m_devHandle设备类型
if (deviceType != m_vScanParams[index].deviceType)
{
QMessageBox::information(this, tr("Tips"), tr("Device type mismatch"));
return;
}
Dialog_Add dlg(m_scanDlg->m_devHandle, this, m_vScanParams[index], index);
if (dlg.exec())
{
ScanParam scanParam = dlg.GetScanParam();
m_vScanParams[index] = scanParam;
// TODO 保存m_vScanParams
const char *devTypeStr[] = {NULL, "G100", "G200", "G300", "G400"};
ui->tableWidget->item(index, 0)->setText(QString::fromStdString(devTypeStr[m_vScanParams[index].deviceType]));
ui->tableWidget->item(index, 0)->setText(QString::fromStdString(m_vScanParams[index].deviceType));
const char *btnTypeStr[] = {NULL, "Button 1", "Button 2", "Button 3"};
ui->tableWidget->item(index, 1)->setText(QString::fromStdString(btnTypeStr[m_vScanParams[index].buttonType]));

View File

@ -21,8 +21,8 @@ public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
bool GetScanParam(DeviceType deviceType, ButtonType buttonType, ScanParam &scanParam);
bool FindScanParam(DeviceType deviceType, ButtonType buttonType, int ignoreIndex);
bool GetScanParam(const std::string &deviceType, ButtonType buttonType, ScanParam &scanParam);
bool FindScanParam(const std::string &deviceType, ButtonType buttonType, int ignoreIndex);
private:
QString GetDesc(const std::string &deviceConfig);

View File

@ -48,7 +48,9 @@ win32 {
LIBS += -lgdi32 -lgdiplus -ldbghelp -luser32 -ladvapi32
LIBS += -L$$PWD/../../build/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE} -l$${OEM_PREFIX}Base -l$${OEM_PREFIX}ImgFmt -l$${OEM_PREFIX}ImgProc
LIBS += -L$$PWD/../../../../sdk/lib/win/$${MY_ARCH}/OEM/$${OEM_NAME} -lsanexy
# sane.dll
LIBS += -L$$PWD/../../../../release/win/$${MY_ARCH}/OEM/$${OEM_NAME}
}
@ -56,6 +58,7 @@ INCLUDEPATH += $$PWD/../../../modules
INCLUDEPATH += $$PWD/../../../utility
INCLUDEPATH += $$PWD/../../../third_party/sqlite
INCLUDEPATH += $$PWD/../../../third_party/json
INCLUDEPATH += $$PWD/../../../../sdk/include
DESTDIR = $$PWD/../../build/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE}
UI_DIR = $$PWD/../../temp/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE}/$${TARGET}