设备配置界面实现属性UI

This commit is contained in:
luoliangyi 2024-04-25 16:06:21 +08:00
parent cd6b2c8dbf
commit fb387e6837
2 changed files with 368 additions and 21 deletions

View File

@ -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);
}

View File

@ -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