/
klischa
/
AstraScanner2
Обзор
Документация
Войти
/
klischa
/
AstraScanner2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/controllers/HomeTabBinder.cpp
192 строки
9 KB
Arena Agent
ui: add built-in scanner help and user guide
18 июн 2026, 20:40
18 июн 2026, 20:40
cfd7428
Код
Авторство
О чём код?
#include "HomeTabBinder.h" #include <QTabWidget> #include <QWidget> #include <QVBoxLayout> #include <QHBoxLayout> #include <QFormLayout> #include <QGroupBox> #include <QLabel> #include <QComboBox> #include <QPushButton> #include <QCheckBox> #include <QSpinBox> #include <QSizePolicy> #include <opencv2/imgproc.hpp> HomeTabBinder::HomeTabBinder(QObject *parent) : QObject(parent) { } HomeTabBinder::Widgets HomeTabBinder::bind(QTabWidget *tabWidget, QWidget *owner) { Widgets w; QWidget* homeTab = new QWidget(); tabWidget->addTab(homeTab, "Главная"); QVBoxLayout* homeLayout = new QVBoxLayout(homeTab); homeLayout->setContentsMargins(8, 8, 8, 8); homeLayout->setSpacing(8); QLabel* quickStartLabel = new QLabel( "<b>Быстрый старт перед сканированием</b>: " "1) откройте или создайте проект, " "2) проверьте камеру и отображение, " "3) выполните калибровку, " "4) перейдите на вкладку «Сканирование».", owner); quickStartLabel->setWordWrap(true); quickStartLabel->setStyleSheet("padding: 4px 2px;"); homeLayout->addWidget(quickStartLabel); QGroupBox* projectGroup = new QGroupBox("Шаг 1. Проект", owner); QVBoxLayout* projectLayout = new QVBoxLayout(projectGroup); projectLayout->setSpacing(6); QHBoxLayout* projectButtonsLayout = new QHBoxLayout(); w.newProjectBtn = new QPushButton("Новый проект", owner); w.openProjectBtn = new QPushButton("Открыть проект", owner); w.saveProjectBtn = new QPushButton("Сохранить", owner); w.saveProjectAsBtn = new QPushButton("Сохранить как", owner); projectButtonsLayout->addWidget(w.newProjectBtn); projectButtonsLayout->addWidget(w.openProjectBtn); projectButtonsLayout->addWidget(w.saveProjectBtn); projectButtonsLayout->addWidget(w.saveProjectAsBtn); projectButtonsLayout->addStretch(); projectLayout->addLayout(projectButtonsLayout); w.projectStatusLabel = new QLabel("Проект: (не открыт)", owner); w.projectStatusLabel->setStyleSheet("font-weight: bold;"); projectLayout->addWidget(w.projectStatusLabel); QHBoxLayout* quickActionLayout = new QHBoxLayout(); w.showHelpBtn = new QPushButton("Справка для новичка", owner); w.showHelpBtn->setToolTip("Открыть встроенное руководство по работе со сканером, вкладкам и настройкам."); quickActionLayout->addWidget(w.showHelpBtn); quickActionLayout->addStretch(); w.goToScanBtn = new QPushButton("Перейти к сканированию →", owner); w.goToScanBtn->setToolTip("Открыть вкладку «Сканирование» после подготовки проекта и калибровки."); quickActionLayout->addWidget(w.goToScanBtn); projectLayout->addLayout(quickActionLayout); homeLayout->addWidget(projectGroup); QGroupBox* preparationGroup = new QGroupBox("Шаг 2–3. Подготовка камеры и калибровка", owner); QHBoxLayout* preparationLayout = new QHBoxLayout(preparationGroup); preparationLayout->setSpacing(10); QWidget* leftPanel = new QWidget(owner); leftPanel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); QVBoxLayout* leftLayout = new QVBoxLayout(leftPanel); leftLayout->setContentsMargins(0, 0, 0, 0); leftLayout->setSpacing(8); QGroupBox* cameraGroup = new QGroupBox("Шаг 2. Проверка камеры", owner); QVBoxLayout* cameraLayout = new QVBoxLayout(cameraGroup); QLabel* cameraStatusLabel = new QLabel("Камера: не инициализирована", owner); QLabel* intrinsicsLabel = new QLabel("Интринсики: не загружены", owner); QLabel* calibrationLabel = new QLabel("Калибровка: не загружена", owner); cameraStatusLabel->setWordWrap(true); intrinsicsLabel->setWordWrap(true); calibrationLabel->setWordWrap(true); cameraLayout->addWidget(cameraStatusLabel); cameraLayout->addWidget(intrinsicsLabel); cameraLayout->addWidget(calibrationLabel); leftLayout->addWidget(cameraGroup); QGroupBox* settingsGroup = new QGroupBox("Отображение preview", owner); QFormLayout* settingsLayout = new QFormLayout(settingsGroup); settingsLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); QHBoxLayout* colormapLayout = new QHBoxLayout(); w.colormapCombo = new QComboBox(owner); w.colormapCombo->addItem("Jet", cv::COLORMAP_JET); w.colormapCombo->addItem("Hot", cv::COLORMAP_HOT); w.colormapCombo->addItem("Rainbow", cv::COLORMAP_RAINBOW); w.colormapCombo->addItem("Grayscale", cv::COLORMAP_BONE); w.applyColormapBtn = new QPushButton("Применить", owner); colormapLayout->addWidget(w.colormapCombo, 1); colormapLayout->addWidget(w.applyColormapBtn); settingsLayout->addRow("Цветовая карта:", colormapLayout); QHBoxLayout* rangeLayout = new QHBoxLayout(); QSpinBox* minRangeSpin = new QSpinBox(owner); minRangeSpin->setRange(0, 2000); minRangeSpin->setValue(0); minRangeSpin->setSuffix(" мм"); QSpinBox* maxRangeSpin = new QSpinBox(owner); maxRangeSpin->setRange(500, 5000); maxRangeSpin->setValue(2000); maxRangeSpin->setSuffix(" мм"); rangeLayout->addWidget(new QLabel("от", owner)); rangeLayout->addWidget(minRangeSpin); rangeLayout->addWidget(new QLabel("до", owner)); rangeLayout->addWidget(maxRangeSpin); settingsLayout->addRow("Диапазон:", rangeLayout); QCheckBox* smoothingCheck = new QCheckBox("Сглаживание глубины", owner); settingsLayout->addRow("", smoothingCheck); QCheckBox* invertCheck = new QCheckBox("Инвертировать цвета", owner); settingsLayout->addRow("", invertCheck); leftLayout->addWidget(settingsGroup); QGroupBox* distanceGroup = new QGroupBox("Подсказка по дистанции", owner); QVBoxLayout* distanceLayout = new QVBoxLayout(distanceGroup); QLabel* distanceHintLabel = new QLabel( "Зелёный: оптимально | Оранжевый: допустимо | Красный: скорректируйте положение объекта/камеры", owner); distanceHintLabel->setWordWrap(true); distanceHintLabel->setStyleSheet("font-size: 10px; color: gray;"); distanceLayout->addWidget(distanceHintLabel); leftLayout->addWidget(distanceGroup); leftLayout->addStretch(); preparationLayout->addWidget(leftPanel, 1); QGroupBox* calibrationGroup = new QGroupBox("Шаг 3. Калибровка", owner); calibrationGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); QVBoxLayout* calibrationLayout = new QVBoxLayout(calibrationGroup); calibrationLayout->setSpacing(6); QLabel* calibrationHint = new QLabel( "Соберите 5–12 кадров шахматной доски под разными углами, затем нажмите «Калибровать».", owner); calibrationHint->setWordWrap(true); calibrationHint->setStyleSheet("color: gray; font-size: 10px;"); calibrationLayout->addWidget(calibrationHint); QHBoxLayout* calibBtnLayout = new QHBoxLayout(); w.homeCalibPreviewBtn = new QPushButton("Preview", owner); w.homeCalibCaptureBtn = new QPushButton("Захватить кадр", owner); w.homeCalibCalibrateBtn = new QPushButton("Калибровать", owner); w.homeCalibResetBtn = new QPushButton("Сброс", owner); w.homeCalibCalibrateBtn->setEnabled(false); calibBtnLayout->addWidget(w.homeCalibPreviewBtn); calibBtnLayout->addWidget(w.homeCalibCaptureBtn); calibBtnLayout->addWidget(w.homeCalibCalibrateBtn); calibBtnLayout->addWidget(w.homeCalibResetBtn); calibBtnLayout->addStretch(); calibrationLayout->addLayout(calibBtnLayout); w.homeCalibRgbLabel = new QLabel("RGB кадр", owner); w.homeCalibRgbLabel->setMinimumSize(640, 420); w.homeCalibRgbLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); w.homeCalibRgbLabel->setStyleSheet("border: 1px solid gray; background-color: black;"); w.homeCalibRgbLabel->setAlignment(Qt::AlignCenter); calibrationLayout->addWidget(w.homeCalibRgbLabel, 1); w.homeCalibFrameCountLabel = new QLabel("Кадров: 0 / 12", owner); w.homeCalibFrameCountLabel->setStyleSheet("font-weight: bold;"); w.homeCalibStatusLabel = new QLabel("Нажмите Preview для начала", owner); calibrationLayout->addWidget(w.homeCalibFrameCountLabel); calibrationLayout->addWidget(w.homeCalibStatusLabel); preparationLayout->addWidget(calibrationGroup, 2); homeLayout->addWidget(preparationGroup, 1); return w; }