设备配置界面实现属性UI
This commit is contained in:
parent
cd6b2c8dbf
commit
fb387e6837
|
@ -1,10 +1,50 @@
|
|||
#include "form_deviceconfig.h"
|
||||
#include <QTabWidget>
|
||||
#include <QScrollArea>
|
||||
#include <QFormLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QComboBox>
|
||||
#include <QSlider>
|
||||
#include <QCheckBox>
|
||||
#include <QSpinBox>
|
||||
#include <QSpacerItem>
|
||||
#include <QPushButton>
|
||||
|
||||
Form_DeviceConfig::Form_DeviceConfig(SANE_Handle devHandle, const std::vector<DeviceConfig>& deviceConfigs, QWidget *parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
ResetDevice(devHandle);
|
||||
CreateUI(deviceConfigs);
|
||||
Init(devHandle);
|
||||
|
||||
std::vector<DeviceConfigsGroup> deviceConfigsGroups = m_baseDeviceConfigsGroups;
|
||||
for (int i = 0; i < (int)deviceConfigs.size(); ++i)
|
||||
{
|
||||
bool set = false;
|
||||
for (int m = 0; m < (int)deviceConfigsGroups.size(); ++m)
|
||||
{
|
||||
for (int n = 0; n < (int)deviceConfigsGroups[m].deviceConfigs.size(); ++n)
|
||||
{
|
||||
DeviceConfig &deviceConfig = deviceConfigsGroups[m].deviceConfigs[n];
|
||||
if (deviceConfig.name == deviceConfigs[i].name && deviceConfig.valueType == deviceConfigs[i].valueType)
|
||||
{
|
||||
deviceConfig.stringValue = deviceConfigs[i].stringValue;
|
||||
deviceConfig.intValue = deviceConfigs[i].intValue;
|
||||
deviceConfig.doubleValue = deviceConfigs[i].doubleValue;
|
||||
deviceConfig.boolValue = deviceConfigs[i].boolValue;
|
||||
set = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (set)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Update(deviceConfigsGroups);
|
||||
}
|
||||
|
||||
Form_DeviceConfig::~Form_DeviceConfig()
|
||||
|
@ -16,12 +56,116 @@ std::vector<DeviceConfig> Form_DeviceConfig::GetDeviceConfigs()
|
|||
{
|
||||
std::vector<DeviceConfig> deviceConfigs;
|
||||
|
||||
// TODO 从界面获取配置,再提取和m_deviceConfigsGroups里比较的差异部分
|
||||
for (int i = 0; i < (int)m_baseDeviceConfigsGroups.size(); ++i)
|
||||
{
|
||||
for (int j = 0; j < (int)m_baseDeviceConfigsGroups[i].deviceConfigs.size(); ++j)
|
||||
{
|
||||
const DeviceConfig &deviceConfig = m_baseDeviceConfigsGroups[i].deviceConfigs[j];
|
||||
|
||||
QWidget *ctrl = nullptr;
|
||||
for (int k = 0; k < (int)m_ctrlList.size(); ++k)
|
||||
{
|
||||
if (deviceConfig.name == m_ctrlList[k]->property("config_name").toString().toStdString())
|
||||
{
|
||||
ctrl = m_ctrlList[k];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (nullptr != ctrl)
|
||||
{
|
||||
DeviceConfig dc;
|
||||
dc.name = deviceConfig.name;
|
||||
dc.title = deviceConfig.title;
|
||||
dc.valueType = deviceConfig.valueType;
|
||||
|
||||
if (1 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(1 == deviceConfig.valueType);
|
||||
QComboBox *comboBox = (QComboBox *)ctrl;
|
||||
if (deviceConfig.stringValue != comboBox->currentText().toStdString())
|
||||
{
|
||||
dc.stringValue = comboBox->currentText().toStdString();
|
||||
deviceConfigs.push_back(dc);
|
||||
}
|
||||
}
|
||||
else if (2 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(2 == deviceConfig.valueType);
|
||||
QComboBox *comboBox = (QComboBox *)ctrl;
|
||||
if (deviceConfig.intValue != comboBox->currentText().toInt())
|
||||
{
|
||||
dc.intValue = comboBox->currentText().toInt();
|
||||
deviceConfigs.push_back(dc);
|
||||
}
|
||||
}
|
||||
else if (3 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(3 == deviceConfig.valueType);
|
||||
QComboBox *comboBox = (QComboBox *)ctrl;
|
||||
if (deviceConfig.doubleValue != comboBox->currentText().toDouble())
|
||||
{
|
||||
dc.doubleValue = comboBox->currentText().toDouble();
|
||||
deviceConfigs.push_back(dc);
|
||||
}
|
||||
}
|
||||
else if (4 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(2 == deviceConfig.valueType);
|
||||
QSlider *slider = (QSlider *)ctrl;
|
||||
if (deviceConfig.intValue != slider->value())
|
||||
{
|
||||
dc.intValue = slider->value();
|
||||
deviceConfigs.push_back(dc);
|
||||
}
|
||||
}
|
||||
else if (5 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(3 == deviceConfig.valueType);
|
||||
QSlider *slider = (QSlider *)ctrl;
|
||||
if (deviceConfig.doubleValue * 100 != slider->value())
|
||||
{
|
||||
dc.doubleValue = slider->value() / 100.0;
|
||||
deviceConfigs.push_back(dc);
|
||||
}
|
||||
}
|
||||
else if (0 == deviceConfig.rangeType)
|
||||
{
|
||||
if (1 == deviceConfig.valueType)
|
||||
{
|
||||
|
||||
}
|
||||
else if (2 == deviceConfig.valueType)
|
||||
{
|
||||
QSpinBox* spinBox = (QSpinBox *)ctrl;
|
||||
if (deviceConfig.intValue != spinBox->value())
|
||||
{
|
||||
dc.intValue = spinBox->value();
|
||||
deviceConfigs.push_back(dc);
|
||||
}
|
||||
}
|
||||
else if (3 == deviceConfig.valueType)
|
||||
{
|
||||
|
||||
}
|
||||
else if (4 == deviceConfig.valueType)
|
||||
{
|
||||
QCheckBox *checkBox = (QCheckBox *)ctrl;
|
||||
if (deviceConfig.boolValue != checkBox->isChecked())
|
||||
{
|
||||
dc.boolValue = checkBox->isChecked();
|
||||
deviceConfigs.push_back(dc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return deviceConfigs;
|
||||
}
|
||||
|
||||
void Form_DeviceConfig::ResetDevice(SANE_Handle devHandle)
|
||||
void Form_DeviceConfig::Init(SANE_Handle devHandle)
|
||||
{
|
||||
// 1.重置设备
|
||||
|
||||
|
@ -45,8 +189,8 @@ void Form_DeviceConfig::ResetDevice(SANE_Handle devHandle)
|
|||
}
|
||||
|
||||
// 2.获取基本配置
|
||||
m_deviceConfigsGroups.clear();
|
||||
|
||||
m_baseDeviceConfigsGroups.clear();
|
||||
for (int i = 1; i < num_dev_options; ++i)
|
||||
{
|
||||
const SANE_Option_Descriptor* desp = sane_get_option_descriptor(devHandle, i);
|
||||
|
@ -65,7 +209,7 @@ void Form_DeviceConfig::ResetDevice(SANE_Handle devHandle)
|
|||
{
|
||||
DeviceConfigsGroup group;
|
||||
group.groupTitle = title;
|
||||
m_deviceConfigsGroups.push_back(group);
|
||||
m_baseDeviceConfigsGroups.push_back(group);
|
||||
}
|
||||
else if (SANE_TYPE_STRING == desp->type)
|
||||
{
|
||||
|
@ -88,8 +232,8 @@ void Form_DeviceConfig::ResetDevice(SANE_Handle devHandle)
|
|||
++p;
|
||||
}
|
||||
|
||||
assert(!m_deviceConfigsGroups.empty());
|
||||
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
|
||||
assert(!m_baseDeviceConfigsGroups.empty());
|
||||
m_baseDeviceConfigsGroups[m_baseDeviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
|
||||
}
|
||||
}
|
||||
else if (SANE_TYPE_INT == desp->type)
|
||||
|
@ -119,8 +263,8 @@ void Form_DeviceConfig::ResetDevice(SANE_Handle devHandle)
|
|||
devConfig.intValueMax = desp->constraint.range->max;
|
||||
}
|
||||
|
||||
assert(!m_deviceConfigsGroups.empty());
|
||||
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
|
||||
assert(!m_baseDeviceConfigsGroups.empty());
|
||||
m_baseDeviceConfigsGroups[m_baseDeviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
|
||||
}
|
||||
else if (SANE_TYPE_FIXED == desp->type)
|
||||
{
|
||||
|
@ -149,8 +293,8 @@ void Form_DeviceConfig::ResetDevice(SANE_Handle devHandle)
|
|||
devConfig.doubleValueMax = SANE_UNFIX(desp->constraint.range->max);
|
||||
}
|
||||
|
||||
assert(!m_deviceConfigsGroups.empty());
|
||||
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
|
||||
assert(!m_baseDeviceConfigsGroups.empty());
|
||||
m_baseDeviceConfigsGroups[m_baseDeviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
|
||||
}
|
||||
else if (SANE_TYPE_BOOL == desp->type)
|
||||
{
|
||||
|
@ -163,15 +307,212 @@ void Form_DeviceConfig::ResetDevice(SANE_Handle devHandle)
|
|||
devConfig.valueType = 4;
|
||||
devConfig.boolValue = (bool)value;
|
||||
|
||||
assert(!m_deviceConfigsGroups.empty());
|
||||
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
|
||||
assert(!m_baseDeviceConfigsGroups.empty());
|
||||
m_baseDeviceConfigsGroups[m_baseDeviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
|
||||
}
|
||||
}
|
||||
|
||||
// 3.创建UI
|
||||
|
||||
QPushButton *defaultBtn = new QPushButton(tr("Default"));
|
||||
connect(defaultBtn, &QPushButton::clicked, this, &Form_DeviceConfig::on_defaultBtn_clicked);
|
||||
QHBoxLayout *hLayout = new QHBoxLayout;
|
||||
hLayout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Expanding));
|
||||
hLayout->addWidget(defaultBtn);
|
||||
QTabWidget *tabWidget = new QTabWidget(this);
|
||||
tabWidget->setTabPosition(QTabWidget::North);
|
||||
QVBoxLayout *mainLayout = new QVBoxLayout(this);
|
||||
mainLayout->addLayout(hLayout);
|
||||
mainLayout->addWidget(tabWidget);
|
||||
this->setLayout(mainLayout);
|
||||
|
||||
for (int i = 0; i < (int)m_baseDeviceConfigsGroups.size(); ++i)
|
||||
{
|
||||
QWidget *widget = new QWidget;
|
||||
QFormLayout* layout = new QFormLayout;
|
||||
widget->setLayout(layout);
|
||||
|
||||
QScrollArea* scrollArea = new QScrollArea(this);
|
||||
scrollArea->setWidgetResizable(true);
|
||||
scrollArea->setAlignment(Qt::AlignCenter);
|
||||
scrollArea->setWindowTitle(QString::fromStdString(m_baseDeviceConfigsGroups[i].groupTitle));
|
||||
scrollArea->setWidget(widget);
|
||||
|
||||
for (int j = 0; j < (int)m_baseDeviceConfigsGroups[i].deviceConfigs.size(); ++j)
|
||||
{
|
||||
const DeviceConfig &deviceConfig = m_baseDeviceConfigsGroups[i].deviceConfigs[j];
|
||||
|
||||
// 创建Label
|
||||
QLabel *label = new QLabel;
|
||||
label->setText(QString::fromStdString(deviceConfig.title) + QString(" : "));
|
||||
|
||||
// 创建控件
|
||||
QWidget *ctrl = nullptr;
|
||||
if (1 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(1 == deviceConfig.valueType);
|
||||
QComboBox *comboBox = new QComboBox;
|
||||
for (int k = 0; k < (int)deviceConfig.stringValueList.size(); ++k)
|
||||
comboBox->addItem(QString::fromStdString(deviceConfig.stringValueList[k]));
|
||||
//comboBox->setCurrentText(QString::fromStdString(deviceConfig.stringValue));
|
||||
ctrl = comboBox;
|
||||
}
|
||||
else if (2 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(2 == deviceConfig.valueType);
|
||||
QComboBox *comboBox = new QComboBox;
|
||||
for (int k = 0; k < (int)deviceConfig.intValueList.size(); ++k)
|
||||
comboBox->addItem(QString::number(deviceConfig.intValueList[k]));
|
||||
//comboBox->setCurrentText(QString::number(deviceConfig.intValue));
|
||||
ctrl = comboBox;
|
||||
}
|
||||
else if (3 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(3 == deviceConfig.valueType);
|
||||
QComboBox *comboBox = new QComboBox;
|
||||
for (int k = 0; k < (int)deviceConfig.doubleValueList.size(); ++k)
|
||||
comboBox->addItem(QString::number(deviceConfig.doubleValueList[k]));
|
||||
//comboBox->setCurrentText(QString::number(deviceConfig.doubleValue));
|
||||
ctrl = comboBox;
|
||||
}
|
||||
else if (4 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(2 == deviceConfig.valueType);
|
||||
QSlider *slider = new QSlider;
|
||||
slider->setOrientation(Qt::Horizontal);
|
||||
slider->setRange(deviceConfig.intValueMin, deviceConfig.intValueMax);
|
||||
//slider->setValue(deviceConfig.intValue);
|
||||
ctrl = slider;
|
||||
}
|
||||
else if (5 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(3 == deviceConfig.valueType);
|
||||
QSlider *slider = new QSlider;
|
||||
slider->setOrientation(Qt::Horizontal);
|
||||
slider->setRange(deviceConfig.doubleValueMin * 100, deviceConfig.doubleValueMax * 100);
|
||||
//slider->setValue(deviceConfig.doubleValue * 100);
|
||||
ctrl = slider;
|
||||
}
|
||||
else if (0 == deviceConfig.rangeType)
|
||||
{
|
||||
if (1 == deviceConfig.valueType)
|
||||
{
|
||||
|
||||
}
|
||||
else if (2 == deviceConfig.valueType)
|
||||
{
|
||||
QSpinBox* spinBox = new QSpinBox;
|
||||
#ifdef HG_CMP_MSC
|
||||
spinBox->setMinimumWidth(75);
|
||||
#else
|
||||
spinBox->setMinimumWidth(150);
|
||||
#endif
|
||||
spinBox->setRange(1, 1000);
|
||||
//spinBox->setValue(deviceConfig.intValue);
|
||||
ctrl = spinBox;
|
||||
}
|
||||
else if (3 == deviceConfig.valueType)
|
||||
{
|
||||
|
||||
}
|
||||
else if (4 == deviceConfig.valueType)
|
||||
{
|
||||
QCheckBox *checkBox = new QCheckBox;
|
||||
//checkBox->setChecked(deviceConfig.boolValue);
|
||||
ctrl = checkBox;
|
||||
}
|
||||
}
|
||||
|
||||
if (nullptr != ctrl)
|
||||
{
|
||||
ctrl->setProperty("config_name", QString::fromStdString(deviceConfig.name));
|
||||
m_ctrlList.push_back(ctrl);
|
||||
}
|
||||
|
||||
layout->addRow(label, ctrl);
|
||||
}
|
||||
|
||||
tabWidget->addTab(scrollArea, QString::fromStdString(m_baseDeviceConfigsGroups[i].groupTitle));
|
||||
}
|
||||
}
|
||||
|
||||
void Form_DeviceConfig::Update(std::vector<DeviceConfigsGroup> &deviceConfigsGroups)
|
||||
{
|
||||
for (int i = 0; i < (int)deviceConfigsGroups.size(); ++i)
|
||||
{
|
||||
for (int j = 0; j < (int)deviceConfigsGroups[i].deviceConfigs.size(); ++j)
|
||||
{
|
||||
const DeviceConfig &deviceConfig = deviceConfigsGroups[i].deviceConfigs[j];
|
||||
|
||||
QWidget *ctrl = nullptr;
|
||||
for (int k = 0; k < (int)m_ctrlList.size(); ++k)
|
||||
{
|
||||
if (deviceConfig.name == m_ctrlList[k]->property("config_name").toString().toStdString())
|
||||
{
|
||||
ctrl = m_ctrlList[k];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (nullptr != ctrl)
|
||||
{
|
||||
if (1 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(1 == deviceConfig.valueType);
|
||||
QComboBox *comboBox = (QComboBox *)ctrl;
|
||||
comboBox->setCurrentText(QString::fromStdString(deviceConfig.stringValue));
|
||||
}
|
||||
else if (2 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(2 == deviceConfig.valueType);
|
||||
QComboBox *comboBox = (QComboBox *)ctrl;
|
||||
comboBox->setCurrentText(QString::number(deviceConfig.intValue));
|
||||
}
|
||||
else if (3 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(3 == deviceConfig.valueType);
|
||||
QComboBox *comboBox = (QComboBox *)ctrl;
|
||||
comboBox->setCurrentText(QString::number(deviceConfig.doubleValue));
|
||||
}
|
||||
else if (4 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(2 == deviceConfig.valueType);
|
||||
QSlider *slider = (QSlider *)ctrl;
|
||||
slider->setValue(deviceConfig.intValue);
|
||||
}
|
||||
else if (5 == deviceConfig.rangeType)
|
||||
{
|
||||
assert(3 == deviceConfig.valueType);
|
||||
QSlider *slider = (QSlider *)ctrl;
|
||||
slider->setValue(deviceConfig.doubleValue * 100);
|
||||
}
|
||||
else if (0 == deviceConfig.rangeType)
|
||||
{
|
||||
if (1 == deviceConfig.valueType)
|
||||
{
|
||||
|
||||
}
|
||||
else if (2 == deviceConfig.valueType)
|
||||
{
|
||||
QSpinBox* spinBox = (QSpinBox *)ctrl;
|
||||
spinBox->setValue(deviceConfig.intValue);
|
||||
}
|
||||
else if (3 == deviceConfig.valueType)
|
||||
{
|
||||
|
||||
}
|
||||
else if (4 == deviceConfig.valueType)
|
||||
{
|
||||
QCheckBox *checkBox = (QCheckBox *)ctrl;
|
||||
checkBox->setChecked(deviceConfig.boolValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Form_DeviceConfig::CreateUI(const std::vector<DeviceConfig>& deviceConfigs)
|
||||
void Form_DeviceConfig::on_defaultBtn_clicked()
|
||||
{
|
||||
assert(!m_deviceConfigsGroups.empty());
|
||||
|
||||
// TODO 通过m_deviceConfigsGroups和deviceConfigs创建UI
|
||||
Update(m_baseDeviceConfigsGroups);
|
||||
}
|
||||
|
|
|
@ -26,12 +26,14 @@ struct DeviceConfig
|
|||
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;
|
||||
|
@ -59,11 +61,15 @@ public:
|
|||
std::vector<DeviceConfig> GetDeviceConfigs();
|
||||
|
||||
private:
|
||||
void ResetDevice(SANE_Handle devHandle);
|
||||
void CreateUI(const std::vector<DeviceConfig>& deviceConfigs);
|
||||
void Init(SANE_Handle devHandle);
|
||||
void Update(std::vector<DeviceConfigsGroup> &deviceConfigsGroups);
|
||||
|
||||
private slots:
|
||||
void on_defaultBtn_clicked();
|
||||
|
||||
private:
|
||||
std::vector<DeviceConfigsGroup> m_deviceConfigsGroups;
|
||||
std::vector<DeviceConfigsGroup> m_baseDeviceConfigsGroups;
|
||||
std::vector<QWidget*> m_ctrlList;
|
||||
};
|
||||
|
||||
#endif // FORM_DEVICECONFIG_H
|
||||
|
|
Loading…
Reference in New Issue