From fb387e6837dd2c191fdf49da806b7487ea354064 Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Thu, 25 Apr 2024 16:06:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E9=85=8D=E7=BD=AE=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E5=AE=9E=E7=8E=B0=E5=B1=9E=E6=80=A7UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/scantool/form_deviceconfig.cpp | 377 +++++++++++++++++++++++++++-- app/scantool/form_deviceconfig.h | 12 +- 2 files changed, 368 insertions(+), 21 deletions(-) diff --git a/app/scantool/form_deviceconfig.cpp b/app/scantool/form_deviceconfig.cpp index cc7eedca..77225d66 100644 --- a/app/scantool/form_deviceconfig.cpp +++ b/app/scantool/form_deviceconfig.cpp @@ -1,10 +1,50 @@ #include "form_deviceconfig.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include Form_DeviceConfig::Form_DeviceConfig(SANE_Handle devHandle, const std::vector& deviceConfigs, QWidget *parent) : QWidget(parent) { - ResetDevice(devHandle); - CreateUI(deviceConfigs); + Init(devHandle); + + std::vector 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 Form_DeviceConfig::GetDeviceConfigs() { std::vector 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 &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& deviceConfigs) +void Form_DeviceConfig::on_defaultBtn_clicked() { - assert(!m_deviceConfigsGroups.empty()); - - // TODO 通过m_deviceConfigsGroups和deviceConfigs创建UI + Update(m_baseDeviceConfigsGroups); } diff --git a/app/scantool/form_deviceconfig.h b/app/scantool/form_deviceconfig.h index 6f5d9055..32c3292d 100644 --- a/app/scantool/form_deviceconfig.h +++ b/app/scantool/form_deviceconfig.h @@ -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 stringValueList; std::vector intValueList; @@ -59,11 +61,15 @@ public: std::vector GetDeviceConfigs(); private: - void ResetDevice(SANE_Handle devHandle); - void CreateUI(const std::vector& deviceConfigs); + void Init(SANE_Handle devHandle); + void Update(std::vector &deviceConfigsGroups); + +private slots: + void on_defaultBtn_clicked(); private: - std::vector m_deviceConfigsGroups; + std::vector m_baseDeviceConfigsGroups; + std::vector m_ctrlList; }; #endif // FORM_DEVICECONFIG_H