Compare commits

...

2 Commits

Author SHA1 Message Date
luoliangyi cd6b2c8dbf 将deviceType改为通过sane接口获取 2024-04-25 11:06:28 +08:00
luoliangyi 0f18fb46d2 去掉deviceconfig的ui文件 2024-04-25 09:54:44 +08:00
9 changed files with 232 additions and 50 deletions

View File

@ -20,10 +20,10 @@ Dialog_Add::Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const s
m_scanParam.deviceType = deviceType; m_scanParam.deviceType = deviceType;
m_scanParam.buttonType = ButtonType(ui->comboBoxButtonType->currentIndex() + 1); m_scanParam.buttonType = ButtonType(ui->comboBoxButtonType->currentIndex() + 1);
m_scanParam.deviceConfig.clear(); m_scanParam.deviceConfigs.clear();
m_scanParam.saveParam = Form_SaveParam::GetDefSaveParam(); m_scanParam.saveParam = Form_SaveParam::GetDefSaveParam();
m_formDeviceConfig = new Form_DeviceConfig(devHandle, m_scanParam.deviceConfig, this); m_formDeviceConfig = new Form_DeviceConfig(devHandle, m_scanParam.deviceConfigs, this);
m_formSaveParam = new Form_SaveParam(m_scanParam.saveParam, this); m_formSaveParam = new Form_SaveParam(m_scanParam.saveParam, this);
ui->stackedWidget->addWidget(m_formDeviceConfig); ui->stackedWidget->addWidget(m_formDeviceConfig);
ui->stackedWidget->addWidget(m_formSaveParam); ui->stackedWidget->addWidget(m_formSaveParam);
@ -48,7 +48,7 @@ Dialog_Add::Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const S
m_scanParam = scanParam; m_scanParam = scanParam;
ui->comboBoxButtonType->setCurrentIndex(m_scanParam.buttonType - 1); ui->comboBoxButtonType->setCurrentIndex(m_scanParam.buttonType - 1);
m_formDeviceConfig = new Form_DeviceConfig(devHandle, m_scanParam.deviceConfig, this); m_formDeviceConfig = new Form_DeviceConfig(devHandle, m_scanParam.deviceConfigs, this);
m_formSaveParam = new Form_SaveParam(m_scanParam.saveParam, this); m_formSaveParam = new Form_SaveParam(m_scanParam.saveParam, this);
ui->stackedWidget->addWidget(m_formDeviceConfig); ui->stackedWidget->addWidget(m_formDeviceConfig);
ui->stackedWidget->addWidget(m_formSaveParam); ui->stackedWidget->addWidget(m_formSaveParam);
@ -90,7 +90,7 @@ void Dialog_Add::on_pushButtonOK_clicked()
return; return;
} }
m_scanParam.deviceConfig = m_formDeviceConfig->GetDeviceConfig(); m_scanParam.deviceConfigs = m_formDeviceConfig->GetDeviceConfigs();
m_scanParam.saveParam = m_formSaveParam->GetSaveParam(); m_scanParam.saveParam = m_formSaveParam->GetSaveParam();
accept(); accept();
} }

View File

@ -21,7 +21,7 @@ struct ScanParam
{ {
std::string deviceType; std::string deviceType;
ButtonType buttonType; ButtonType buttonType;
std::string deviceConfig; std::vector<DeviceConfig> deviceConfigs;
SaveParam saveParam; SaveParam saveParam;
}; };

View File

@ -30,7 +30,6 @@ Dialog_Scan::~Dialog_Scan()
} }
sane_exit(); sane_exit();
delete ui; delete ui;
} }

View File

@ -1,29 +1,177 @@
#include "form_deviceconfig.h" #include "form_deviceconfig.h"
#include "ui_form_deviceconfig.h"
Form_DeviceConfig::Form_DeviceConfig(SANE_Handle devHandle, const std::string &deviceConfig, QWidget *parent) Form_DeviceConfig::Form_DeviceConfig(SANE_Handle devHandle, const std::vector<DeviceConfig>& deviceConfigs, QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::Form_DeviceConfig)
{ {
ui->setupUi(this); ResetDevice(devHandle);
CreateUI(devHandle, deviceConfig); CreateUI(deviceConfigs);
} }
Form_DeviceConfig::~Form_DeviceConfig() Form_DeviceConfig::~Form_DeviceConfig()
{ {
delete ui;
} }
std::string Form_DeviceConfig::GetDeviceConfig() std::vector<DeviceConfig> Form_DeviceConfig::GetDeviceConfigs()
{ {
std::string deviceConfig; std::vector<DeviceConfig> deviceConfigs;
// 从界面获取配置 // TODO 从界面获取配置再提取和m_deviceConfigsGroups里比较的差异部分
return deviceConfig; return deviceConfigs;
} }
void Form_DeviceConfig::CreateUI(SANE_Handle devHandle, const std::string &deviceConfig) void Form_DeviceConfig::ResetDevice(SANE_Handle devHandle)
{ {
// 创建UI // 1.重置设备
SANE_Int num_dev_options = 0;
sane_control_option(devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL);
for (int i = 1; i < num_dev_options; ++i)
{
const SANE_Option_Descriptor* desp = sane_get_option_descriptor(devHandle, i);
if (NULL == desp)
continue;
const char* name = desp->name;
while (' ' == *name)
++name;
if (0 == strcmp(SANE_STD_OPT_NAME_RESTORE, name) && SANE_TYPE_BUTTON == desp->type)
{
sane_control_option(devHandle, i, SANE_ACTION_SET_VALUE, NULL, NULL);
break;
}
}
// 2.获取基本配置
m_deviceConfigsGroups.clear();
for (int i = 1; i < num_dev_options; ++i)
{
const SANE_Option_Descriptor* desp = sane_get_option_descriptor(devHandle, i);
if (NULL == desp)
continue;
const char* name = desp->name;
while (' ' == *name)
++name;
const char* title = desp->title;
while (' ' == *title)
++title;
if (SANE_TYPE_GROUP == desp->type)
{
DeviceConfigsGroup group;
group.groupTitle = title;
m_deviceConfigsGroups.push_back(group);
}
else if (SANE_TYPE_STRING == desp->type)
{
char value[256] = { 0 };
sane_control_option(devHandle, i, SANE_ACTION_GET_VALUE, value, NULL);
DeviceConfig devConfig;
devConfig.name = name;
devConfig.title = title;
devConfig.valueType = 1;
devConfig.stringValue = value;
devConfig.rangeType = 1;
if (SANE_CONSTRAINT_STRING_LIST == desp->constraint_type)
{
const SANE_String_Const* p = desp->constraint.string_list;
while (NULL != *p)
{
devConfig.stringValueList.push_back(*p);
++p;
}
assert(!m_deviceConfigsGroups.empty());
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
}
}
else if (SANE_TYPE_INT == desp->type)
{
SANE_Int value = 0;
sane_control_option(devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
DeviceConfig devConfig;
devConfig.name = name;
devConfig.title = title;
devConfig.valueType = 2;
devConfig.intValue = (int)value;
if (SANE_CONSTRAINT_WORD_LIST == desp->constraint_type)
{
devConfig.rangeType = 2;
const SANE_Word* p = desp->constraint.word_list;
for (SANE_Int i = 0; i < p[0]; ++i)
{
devConfig.intValueList.push_back(p[i + 1]);
}
}
else if (SANE_CONSTRAINT_RANGE == desp->constraint_type)
{
devConfig.rangeType = 4;
devConfig.intValueMin = desp->constraint.range->min;
devConfig.intValueMax = desp->constraint.range->max;
}
assert(!m_deviceConfigsGroups.empty());
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
}
else if (SANE_TYPE_FIXED == desp->type)
{
SANE_Word value = 0;
sane_control_option(devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
DeviceConfig devConfig;
devConfig.name = name;
devConfig.title = title;
devConfig.valueType = 3;
devConfig.doubleValue = SANE_UNFIX(value);
if (SANE_CONSTRAINT_WORD_LIST == desp->constraint_type)
{
devConfig.rangeType = 3;
const SANE_Word* p = desp->constraint.word_list;
for (SANE_Int i = 0; i < p[0]; ++i)
{
devConfig.doubleValueList.push_back(SANE_UNFIX(p[i + 1]));
}
}
else if (SANE_CONSTRAINT_RANGE == desp->constraint_type)
{
devConfig.rangeType = 5;
devConfig.doubleValueMin = SANE_UNFIX(desp->constraint.range->min);
devConfig.doubleValueMax = SANE_UNFIX(desp->constraint.range->max);
}
assert(!m_deviceConfigsGroups.empty());
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
}
else if (SANE_TYPE_BOOL == desp->type)
{
SANE_Bool value = 0;
sane_control_option(devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
DeviceConfig devConfig;
devConfig.name = name;
devConfig.title = title;
devConfig.valueType = 4;
devConfig.boolValue = (bool)value;
assert(!m_deviceConfigsGroups.empty());
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
}
}
}
void Form_DeviceConfig::CreateUI(const std::vector<DeviceConfig>& deviceConfigs)
{
assert(!m_deviceConfigsGroups.empty());
// TODO 通过m_deviceConfigsGroups和deviceConfigs创建UI
} }

View File

@ -2,27 +2,68 @@
#define FORM_DEVICECONFIG_H #define FORM_DEVICECONFIG_H
#include <QWidget> #include <QWidget>
#include <string>
#include <vector>
#include "sane/sane_ex.h" #include "sane/sane_ex.h"
namespace Ui { struct DeviceConfig
class Form_DeviceConfig; {
} DeviceConfig()
{
valueType = 0;
intValue = 0;
doubleValue = 0;
boolValue = false;
rangeType = 0;
intValueMin = 0;
intValueMax = 0;
doubleValueMin = 0;
doubleValueMax = 0;
}
// 配置名
std::string name;
std::string title;
int valueType; // 0-无1-字符串2-整型3-浮点4-布尔
std::string stringValue;
int intValue;
double doubleValue;
bool boolValue;
int rangeType; // 0-无1-字符串列表2-整型列表3-浮点数列表4-整型范围5-浮点数范围
std::vector<std::string> stringValueList;
std::vector<int> intValueList;
std::vector<double> doubleValueList;
int intValueMin;
int intValueMax;
double doubleValueMin;
double doubleValueMax;
};
struct DeviceConfigsGroup
{
std::string groupTitle;
std::vector<DeviceConfig> deviceConfigs;
};
class Form_DeviceConfig : public QWidget class Form_DeviceConfig : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit Form_DeviceConfig(SANE_Handle devHandle, const std::string &deviceConfig, QWidget *parent = nullptr); explicit Form_DeviceConfig(SANE_Handle devHandle, const std::vector<DeviceConfig>& deviceConfigs, QWidget *parent = nullptr);
~Form_DeviceConfig(); ~Form_DeviceConfig();
std::string GetDeviceConfig(); std::vector<DeviceConfig> GetDeviceConfigs();
private: private:
void CreateUI(SANE_Handle devHandle, const std::string &deviceConfig); void ResetDevice(SANE_Handle devHandle);
void CreateUI(const std::vector<DeviceConfig>& deviceConfigs);
private: private:
Ui::Form_DeviceConfig *ui; std::vector<DeviceConfigsGroup> m_deviceConfigsGroups;
}; };
#endif // FORM_DEVICECONFIG_H #endif // FORM_DEVICECONFIG_H

View File

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form_DeviceConfig</class>
<widget class="QWidget" name="Form_DeviceConfig">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>691</width>
<height>471</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -66,7 +66,7 @@ MainWindow::MainWindow(QWidget *parent)
ui->tableWidget->item(index, 1)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 1)->setTextAlignment(Qt::AlignCenter);
ui->tableWidget->item(index, 1)->setFlags(ui->tableWidget->item(index, 1)->flags() & ~Qt::ItemIsEditable); ui->tableWidget->item(index, 1)->setFlags(ui->tableWidget->item(index, 1)->flags() & ~Qt::ItemIsEditable);
ui->tableWidget->setItem(index, 2, new QTableWidgetItem(GetDesc(m_vScanParams[index].deviceConfig))); ui->tableWidget->setItem(index, 2, new QTableWidgetItem(GetDesc(m_vScanParams[index].deviceConfigs)));
ui->tableWidget->item(index, 2)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 2)->setTextAlignment(Qt::AlignCenter);
ui->tableWidget->item(index, 2)->setFlags(ui->tableWidget->item(index, 2)->flags() & ~Qt::ItemIsEditable); ui->tableWidget->item(index, 2)->setFlags(ui->tableWidget->item(index, 2)->flags() & ~Qt::ItemIsEditable);
@ -118,7 +118,7 @@ bool MainWindow::FindScanParam(const std::string &deviceType, ButtonType buttonT
return false; return false;
} }
QString MainWindow::GetDesc(const std::string &deviceConfig) QString MainWindow::GetDesc(const std::vector<DeviceConfig> &deviceConfigs)
{ {
QString desc; QString desc;
@ -196,6 +196,13 @@ void MainWindow::on_pushButtonAdd_clicked()
} }
std::string deviceType = m_scanDlg->m_devName.toStdString(); // TODO 获取m_scanDlg->m_devHandle设备类型 std::string deviceType = m_scanDlg->m_devName.toStdString(); // TODO 获取m_scanDlg->m_devHandle设备类型
char v[256] = {0};
SANE_Status status = sane_control_option(m_scanDlg->m_devHandle, (SANE_Int)0x886D, SANE_ACTION_GET_VALUE, v, NULL);
if (SANE_STATUS_GOOD == status)
{
deviceType = v;
}
Dialog_Add dlg(m_scanDlg->m_devHandle, this, deviceType); Dialog_Add dlg(m_scanDlg->m_devHandle, this, deviceType);
if (dlg.exec()) if (dlg.exec())
{ {
@ -217,7 +224,7 @@ void MainWindow::on_pushButtonAdd_clicked()
ui->tableWidget->item(index, 1)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 1)->setTextAlignment(Qt::AlignCenter);
ui->tableWidget->item(index, 1)->setFlags(ui->tableWidget->item(index, 1)->flags() & ~Qt::ItemIsEditable); ui->tableWidget->item(index, 1)->setFlags(ui->tableWidget->item(index, 1)->flags() & ~Qt::ItemIsEditable);
ui->tableWidget->setItem(index, 2, new QTableWidgetItem(GetDesc(m_vScanParams[index].deviceConfig))); ui->tableWidget->setItem(index, 2, new QTableWidgetItem(GetDesc(m_vScanParams[index].deviceConfigs)));
ui->tableWidget->item(index, 2)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 2)->setTextAlignment(Qt::AlignCenter);
ui->tableWidget->item(index, 2)->setFlags(ui->tableWidget->item(index, 2)->flags() & ~Qt::ItemIsEditable); ui->tableWidget->item(index, 2)->setFlags(ui->tableWidget->item(index, 2)->flags() & ~Qt::ItemIsEditable);
@ -245,6 +252,13 @@ void MainWindow::on_pushButtonModify_clicked()
} }
std::string deviceType = m_scanDlg->m_devName.toStdString(); // TODO 获取m_scanDlg->m_devHandle设备类型 std::string deviceType = m_scanDlg->m_devName.toStdString(); // TODO 获取m_scanDlg->m_devHandle设备类型
char v[256] = {0};
SANE_Status status = sane_control_option(m_scanDlg->m_devHandle, (SANE_Int)0x886D, SANE_ACTION_GET_VALUE, v, NULL);
if (SANE_STATUS_GOOD == status)
{
deviceType = v;
}
if (deviceType != m_vScanParams[index].deviceType) if (deviceType != m_vScanParams[index].deviceType)
{ {
QMessageBox::information(this, tr("Tips"), tr("Device type mismatch")); QMessageBox::information(this, tr("Tips"), tr("Device type mismatch"));
@ -263,7 +277,7 @@ void MainWindow::on_pushButtonModify_clicked()
const char *btnTypeStr[] = {NULL, "Button 1", "Button 2", "Button 3"}; const char *btnTypeStr[] = {NULL, "Button 1", "Button 2", "Button 3"};
ui->tableWidget->item(index, 1)->setText(QString::fromStdString(btnTypeStr[m_vScanParams[index].buttonType])); ui->tableWidget->item(index, 1)->setText(QString::fromStdString(btnTypeStr[m_vScanParams[index].buttonType]));
ui->tableWidget->item(index, 2)->setText(GetDesc(m_vScanParams[index].deviceConfig)); ui->tableWidget->item(index, 2)->setText(GetDesc(m_vScanParams[index].deviceConfigs));
ui->tableWidget->item(index, 3)->setText(GetDesc(m_vScanParams[index].saveParam)); ui->tableWidget->item(index, 3)->setText(GetDesc(m_vScanParams[index].saveParam));
} }
} }

View File

@ -25,7 +25,7 @@ public:
bool FindScanParam(const std::string &deviceType, ButtonType buttonType, int ignoreIndex); bool FindScanParam(const std::string &deviceType, ButtonType buttonType, int ignoreIndex);
private: private:
QString GetDesc(const std::string &deviceConfig); QString GetDesc(const std::vector<DeviceConfig> &deviceConfigs);
QString GetDesc(const SaveParam &saveParam); QString GetDesc(const SaveParam &saveParam);
protected: protected:

View File

@ -129,7 +129,6 @@ FORMS += \
../../../app/scantool/dialog_add.ui \ ../../../app/scantool/dialog_add.ui \
../../../app/scantool/dialog_scan.ui \ ../../../app/scantool/dialog_scan.ui \
../../../app/scantool/dialog_writesettings.ui \ ../../../app/scantool/dialog_writesettings.ui \
../../../app/scantool/form_deviceconfig.ui \
../../../app/scantool/form_saveparam.ui \ ../../../app/scantool/form_saveparam.ui \
../../../app/scantool/mainwindow.ui ../../../app/scantool/mainwindow.ui