/
MaximU
/
arraywidget
Обзор
Документация
Войти
/
MaximU
/
arraywidget
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
plotsetcontainerwidget.cpp
323 строки
11 KB
user
Forward declaration namespace Ui { class …; } и Ui::… *ui.
27 июл 2026, 14:24
27 июл 2026, 14:24
2696d58
Код
Авторство
О чём код?
#include "plotsetcontainerwidget.h" #include "ui_plotsetcontainerwidget.h" const int PlotSetHeightInc = 50; //!< Шаг изменения высоты набора графиков. const int PlotSetHeightMin = 300; //!< Минимальный размер набора графиков. const int PlotSetHeightMax = 1000; //!< Максимальный размер набора графиков. /*! * \brief Конструктор. */ PlotSetContainerWidget::PlotSetContainerWidget(QWidget *parent) : QScrollArea(parent), ui(new Ui::PlotSetContainerWidgetClass) { ui->setupUi(this); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); } /*! * \brief Деструктор. */ PlotSetContainerWidget::~PlotSetContainerWidget() { delete ui; } /*! * \brief Изменяет размер контейнера, содержащего наборы графиков. * \param event Событие изменения размера. */ void PlotSetContainerWidget::resizeEvent(QResizeEvent *event) { Q_UNUSED(event) int w = viewport()->width(); // Если набор графиков один, то он отображается во весь виджет. int h = (mPlotsets.count() == 1) ? viewport()->height() : std::max(viewport()->height(), mPlotsets.count() * mPlotsetHeight); widget()->resize(w, h); widget()->updateGeometry(); } /*! * \brief Возвращает список наборов графиков, находящихся в контейнере. * \return Список наборов графиков. */ const QList<PlotSetWidget *> &PlotSetContainerWidget::plotsets() { return mPlotsets; } /*! * \brief Обновляет все наборы графиков, помещенные в контейнер. */ void PlotSetContainerWidget::updateView() { foreach (PlotSetWidget *plotset, mPlotsets) { plotset->updateView(); } } /*! * \brief Устанавливает формат текста заголовка. * \param format Формат текста заголовка. */ void PlotSetContainerWidget::setPlotsetTitleFormat(const QString &format) { mPlotsetTitleFormat = format; foreach (PlotSetWidget *plotset, mPlotsets) { plotset->setTitleFormat(format); } } /*! * \brief Устанавливает схему контейнера. Схемой является список специальных значений для графиков (например, канал для каждого графика). * \param scheme Список устанавливаемых значений свойств наборов графиков, помещенных в контейнер. */ void PlotSetContainerWidget::setScheme(const QVariantList &newScheme) { QVariantList curScheme = scheme(); if (curScheme != newScheme) { int curSize = curScheme.size(); int newSize = newScheme.size(); if (curSize != newSize) { if (curSize > newSize) { for (int i = curSize; i > newSize; i --) { widget()->layout()->removeWidget(mPlotsets.last()); delete mPlotsets.takeLast(); } } if (curSize < newSize) { for (int i = curSize; i < newSize; i ++) { PlotSetWidget *plotset = new PlotSetWidget(widget()); mPlotsets << plotset; connect(plotset, &PlotSetWidget::initRequest, this, &PlotSetContainerWidget::slot_plotset_initRequest); connect(plotset, &PlotSetWidget::closeRequest, this, &PlotSetContainerWidget::slot_plotset_closeRequest); connect(plotset, &PlotSetWidget::updateRequest, this, &PlotSetContainerWidget::slot_plotset_updateRequest); connect(plotset, &PlotSetWidget::divisionChanged, this, &PlotSetContainerWidget::slot_plotset_divisionChanged); connect(plotset, &PlotSetWidget::mousePress, this, &PlotSetContainerWidget::mousePress); connect(plotset, &PlotSetWidget::mouseMove, this, &PlotSetContainerWidget::mouseMove); connect(plotset, &PlotSetWidget::mouseRelease, this, &PlotSetContainerWidget::mouseRelease); plotset->init(mPlotsetTitleFormat, mPlotsetDivision, mPlotsetLeftPlotVisible, mPlotsetBottomPlotVisible); plotset->setVisible(false); // 1 - Для устранения изменения размеров имеющихся plotset-ов. widget()->layout()->addWidget(plotset); plotset->setVisible(true); // 2 - Для устранения изменения размеров имеющихся plotset-ов. } } // Установка размеров наборов графиков. resizeEvent(nullptr); } //// Установка служебных значений наборам графиков. QVariantList::const_iterator j = newScheme.begin(); for (auto i = mPlotsets.begin(); i != mPlotsets.end(); i ++, j ++) { (*i)->setValue(*j); } } // schemeChanged вызывается всегда для обновления текста окна редактирования схемы. emit schemeChanged(); } /*! * \brief Возвращает текущую схему (список специальных значений каждого набора) контейнера */ QVariantList PlotSetContainerWidget::scheme() const { QVariantList scheme; foreach (PlotSetWidget *plotset, mPlotsets) { scheme << plotset->value(); } return scheme; } /*! * \brief Устанавливает высоту панели набора графиков. * \param height Высота панели набора графиков. */ void PlotSetContainerWidget::setPlotsetHeight(int height) { mPlotsetHeight = height; resizeEvent(nullptr); } /*! * \brief Возвращает высоту панели набора графиков. * \return Высота панели набора графиков. */ int PlotSetContainerWidget::plotsetHeight() { return mPlotsetHeight; } /*! * \brief Устанавливает пропорции ширины и высоты графиков. * \param division Пропорции ширины и высоты графиков. */ void PlotSetContainerWidget::setPlotsetDivision(QSizeF division) { mPlotsetDivision = division; foreach (PlotSetWidget *plotset, mPlotsets) { plotset->setDivision(mPlotsetDivision); } } /*! * \brief Возвращает пропорции ширины и высоты графиков. * \return Пропорции ширины и высоты графиков. */ QSizeF PlotSetContainerWidget::plotsetDivision() { return mPlotsetDivision; } /*! * \brief Устанавливает признак отображения левого графика набора. * \param visible Признак отображения левого графика набора. */ void PlotSetContainerWidget::setPlotsetLeftPlotVisible(bool visible) { mPlotsetLeftPlotVisible = visible; foreach (PlotSetWidget *plotset, mPlotsets) { plotset->setLeftPlotVisible(mPlotsetLeftPlotVisible); } } /*! * \brief Возвращает признак отображения левого графика набора. * \return Признак отображения левого графика набора. */ bool PlotSetContainerWidget::isPlotsetLeftPlotVisible() { return mPlotsetLeftPlotVisible; } /*! * \brief Устанавливает признак отображения верхнего графика набора. * \param visible Признак отображения верхнего графика набора. */ void PlotSetContainerWidget::setPlotsetBottomPlotVisible(bool visible) { mPlotsetBottomPlotVisible = visible; foreach (PlotSetWidget *plotset, mPlotsets) { plotset->setTopPlotVisible(mPlotsetBottomPlotVisible); } } /*! * \brief Возвращает признак отображения нижнего графика набора. * \return Признак отображения нижнего графика набора. */ bool PlotSetContainerWidget::isPlotsetBottomPlotVisible() { return mPlotsetBottomPlotVisible; } /*! * \brief Увеличивает высоту наборов графиков. */ void PlotSetContainerWidget::widenPlotsets() { int plotsetHeight = qMin(mPlotsetHeight + PlotSetHeightInc, PlotSetHeightMax); setPlotsetHeight(plotsetHeight); } /*! * \brief Уменьшает высоту наборов графиков. */ void PlotSetContainerWidget::narrowPlotsets() { int plotsetHeight = qMax(mPlotsetHeight - PlotSetHeightInc, PlotSetHeightMin); setPlotsetHeight(plotsetHeight); } /*! * \brief Обрабатывает сигнал об инициализации набора графиков. Определяет sender'а этого сигнала и перенаправляет дальше. */ void PlotSetContainerWidget::slot_plotset_initRequest() { emit plotsetInitRequest(qobject_cast<PlotSetWidget *>(sender())); } /*! * \brief Вызывается при нажатии кнопки Закрыть набора графиков. */ void PlotSetContainerWidget::slot_plotset_closeRequest() { PlotSetWidget *plotset = qobject_cast<PlotSetWidget *>(sender()); widget()->layout()->removeWidget(plotset); mPlotsets.removeAll(plotset); plotset->deleteLater(); resizeEvent(nullptr); emit schemeChanged(); } /*! * \brief Обрабатывает сигнал об необходимости обновить содержимое графиков набора графиков. Определяет sender'а этого сигнала и перенаправляет дальше. */ void PlotSetContainerWidget::slot_plotset_updateRequest() { emit plotsetUpdateRequest(qobject_cast<PlotSetWidget *>(sender())); } /*! * \brief Вызывается при изменении пропорций ширины и высоты графиков. */ void PlotSetContainerWidget::slot_plotset_divisionChanged() { PlotSetWidget *plotset = qobject_cast<PlotSetWidget *>(sender()); setPlotsetDivision(plotset->division()); emit divisionChanged(); } /*! * \brief Сбрасывает стек масштабирования. */ void PlotSetContainerWidget::resetZoomStack() { for (auto i = mPlotsets.begin(); i != mPlotsets.end(); i ++) { (*i)->resetZoomStack(); } }