diff --git a/CMakeLists.txt b/CMakeLists.txt index f814c5a..c58e3dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,8 +28,9 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) ${PROJECT_SOURCES} resources.qrc sensorwidget.h sensorwidget.cpp - sensorlayout.h sensorlayout.cpp + httpclient.h httpclient.cpp + flowlayout.h flowlayout.cpp ) # Define target properties for Android with Qt 6 as: diff --git a/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/FemaSoftware b/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/FemaSoftware index f58d356..efc3c73 100755 Binary files a/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/FemaSoftware and b/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/FemaSoftware differ diff --git a/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/FemaSoftware_autogen/include/ui_mainwindow.h b/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/FemaSoftware_autogen/include/ui_mainwindow.h index 3c587c2..5b96c49 100644 --- a/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/FemaSoftware_autogen/include/ui_mainwindow.h +++ b/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/FemaSoftware_autogen/include/ui_mainwindow.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -37,7 +38,6 @@ public: QLabel *group; QLabel *showHidden; QSpacerItem *horizontalSpacer_4; - QSpacerItem *horizontalSpacer; QHBoxLayout *selectLayout; QComboBox *showHiddenSelect; QComboBox *groupSelect; @@ -48,6 +48,21 @@ public: QVBoxLayout *sensorsLayout; QWidget *incidentsTab; QGridLayout *gridLayout_8; + QScrollArea *scrollArea; + QWidget *scrollAreaWidgetContents; + QVBoxLayout *verticalLayout_2; + QHBoxLayout *horizontalLayout_3; + QLabel *label_2; + QLabel *label; + QSpacerItem *horizontalSpacer_7; + QHBoxLayout *horizontalLayout_2; + QComboBox *comboBox_2; + QComboBox *comboBox; + QSpacerItem *horizontalSpacer_8; + QHBoxLayout *horizontalLayout; + QLineEdit *lineEdit; + QSpacerItem *horizontalSpacer; + QHBoxLayout *asd; QWidget *journalTab; QGridLayout *gridLayout_7; QWidget *statisticsTab; @@ -70,7 +85,7 @@ public: MainWindow->setMaximumSize(QSize(16777215, 16777215)); MainWindow->setBaseSize(QSize(0, 0)); MainWindow->setStyleSheet(QString::fromUtf8("")); - MainWindow->setTabShape(QTabWidget::Rounded); + MainWindow->setTabShape(QTabWidget::TabShape::Rounded); centralwidget = new QWidget(MainWindow); centralwidget->setObjectName("centralwidget"); centralwidget->setAutoFillBackground(false); @@ -84,7 +99,12 @@ public: gridLayout_4->setContentsMargins(0, 0, 0, 0); tabWidget = new QTabWidget(centralwidget); tabWidget->setObjectName("tabWidget"); - tabWidget->setMinimumSize(QSize(0, 0)); + QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Expanding); + sizePolicy1.setHorizontalStretch(0); + sizePolicy1.setVerticalStretch(0); + sizePolicy1.setHeightForWidth(tabWidget->sizePolicy().hasHeightForWidth()); + tabWidget->setSizePolicy(sizePolicy1); + tabWidget->setMinimumSize(QSize(488, 60)); tabWidget->setAutoFillBackground(false); tabWidget->setStyleSheet(QString::fromUtf8("QTabBar::tab{\n" " background: #dcd174;\n" @@ -115,11 +135,11 @@ public: "}")); sensorsTab = new QWidget(); sensorsTab->setObjectName("sensorsTab"); - QSizePolicy sizePolicy1(QSizePolicy::Expanding, QSizePolicy::Expanding); - sizePolicy1.setHorizontalStretch(0); - sizePolicy1.setVerticalStretch(0); - sizePolicy1.setHeightForWidth(sensorsTab->sizePolicy().hasHeightForWidth()); - sensorsTab->setSizePolicy(sizePolicy1); + QSizePolicy sizePolicy2(QSizePolicy::Expanding, QSizePolicy::Expanding); + sizePolicy2.setHorizontalStretch(0); + sizePolicy2.setVerticalStretch(0); + sizePolicy2.setHeightForWidth(sensorsTab->sizePolicy().hasHeightForWidth()); + sensorsTab->setSizePolicy(sizePolicy2); sensorsTab->setMinimumSize(QSize(0, 0)); sensorsTab->setStyleSheet(QString::fromUtf8("#sensorsTab {\n" " image: url(:/visual/res/svg/fema-wing.svg);\n" @@ -129,20 +149,20 @@ public: SensorsTabLayout = new QVBoxLayout(sensorsTab); SensorsTabLayout->setSpacing(10); SensorsTabLayout->setObjectName("SensorsTabLayout"); - SensorsTabLayout->setSizeConstraint(QLayout::SetDefaultConstraint); + SensorsTabLayout->setSizeConstraint(QLayout::SizeConstraint::SetDefaultConstraint); SensorsTabLayout->setContentsMargins(0, 25, 0, 0); nameLayout = new QHBoxLayout(); nameLayout->setSpacing(15); nameLayout->setObjectName("nameLayout"); - nameLayout->setSizeConstraint(QLayout::SetFixedSize); + nameLayout->setSizeConstraint(QLayout::SizeConstraint::SetFixedSize); nameLayout->setContentsMargins(25, -1, -1, -1); group = new QLabel(sensorsTab); group->setObjectName("group"); - QSizePolicy sizePolicy2(QSizePolicy::Fixed, QSizePolicy::Fixed); - sizePolicy2.setHorizontalStretch(0); - sizePolicy2.setVerticalStretch(0); - sizePolicy2.setHeightForWidth(group->sizePolicy().hasHeightForWidth()); - group->setSizePolicy(sizePolicy2); + QSizePolicy sizePolicy3(QSizePolicy::Fixed, QSizePolicy::Fixed); + sizePolicy3.setHorizontalStretch(0); + sizePolicy3.setVerticalStretch(0); + sizePolicy3.setHeightForWidth(group->sizePolicy().hasHeightForWidth()); + group->setSizePolicy(sizePolicy3); group->setMinimumSize(QSize(488, 36)); group->setStyleSheet(QString::fromUtf8("width: 488px;\n" "height: 36px;\n" @@ -159,8 +179,8 @@ public: showHidden = new QLabel(sensorsTab); showHidden->setObjectName("showHidden"); - sizePolicy2.setHeightForWidth(showHidden->sizePolicy().hasHeightForWidth()); - showHidden->setSizePolicy(sizePolicy2); + sizePolicy3.setHeightForWidth(showHidden->sizePolicy().hasHeightForWidth()); + showHidden->setSizePolicy(sizePolicy3); showHidden->setMinimumSize(QSize(275, 36)); showHidden->setStyleSheet(QString::fromUtf8("width: 275px;\n" "height: 36px;\n" @@ -179,22 +199,18 @@ public: nameLayout->addItem(horizontalSpacer_4); - horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - - nameLayout->addItem(horizontalSpacer); - SensorsTabLayout->addLayout(nameLayout); selectLayout = new QHBoxLayout(); selectLayout->setSpacing(15); selectLayout->setObjectName("selectLayout"); - selectLayout->setSizeConstraint(QLayout::SetFixedSize); + selectLayout->setSizeConstraint(QLayout::SizeConstraint::SetFixedSize); selectLayout->setContentsMargins(25, -1, -1, 10); showHiddenSelect = new QComboBox(sensorsTab); showHiddenSelect->setObjectName("showHiddenSelect"); - sizePolicy2.setHeightForWidth(showHiddenSelect->sizePolicy().hasHeightForWidth()); - showHiddenSelect->setSizePolicy(sizePolicy2); + sizePolicy3.setHeightForWidth(showHiddenSelect->sizePolicy().hasHeightForWidth()); + showHiddenSelect->setSizePolicy(sizePolicy3); showHiddenSelect->setMinimumSize(QSize(488, 60)); showHiddenSelect->setStyleSheet(QString::fromUtf8("QComboBox::drop-down {\n" " border: 0px;\n" @@ -213,8 +229,8 @@ public: groupSelect = new QComboBox(sensorsTab); groupSelect->setObjectName("groupSelect"); - sizePolicy2.setHeightForWidth(groupSelect->sizePolicy().hasHeightForWidth()); - groupSelect->setSizePolicy(sizePolicy2); + sizePolicy3.setHeightForWidth(groupSelect->sizePolicy().hasHeightForWidth()); + groupSelect->setSizePolicy(sizePolicy3); groupSelect->setMinimumSize(QSize(275, 60)); groupSelect->setStyleSheet(QString::fromUtf8("QComboBox::drop-down {\n" " border: 0px;\n" @@ -241,12 +257,12 @@ public: searchLayout = new QHBoxLayout(); searchLayout->setSpacing(0); searchLayout->setObjectName("searchLayout"); - searchLayout->setSizeConstraint(QLayout::SetFixedSize); + searchLayout->setSizeConstraint(QLayout::SizeConstraint::SetFixedSize); searchLayout->setContentsMargins(25, -1, -1, 10); search = new QLineEdit(sensorsTab); search->setObjectName("search"); - sizePolicy2.setHeightForWidth(search->sizePolicy().hasHeightForWidth()); - search->setSizePolicy(sizePolicy2); + sizePolicy3.setHeightForWidth(search->sizePolicy().hasHeightForWidth()); + search->setSizePolicy(sizePolicy3); search->setMinimumSize(QSize(778, 60)); search->setStyleSheet(QString::fromUtf8("width: 778px;\n" "height: 60px;\n" @@ -281,8 +297,8 @@ public: tabWidget->addTab(sensorsTab, QString()); incidentsTab = new QWidget(); incidentsTab->setObjectName("incidentsTab"); - sizePolicy1.setHeightForWidth(incidentsTab->sizePolicy().hasHeightForWidth()); - incidentsTab->setSizePolicy(sizePolicy1); + sizePolicy2.setHeightForWidth(incidentsTab->sizePolicy().hasHeightForWidth()); + incidentsTab->setSizePolicy(sizePolicy2); incidentsTab->setStyleSheet(QString::fromUtf8("#incidentsTab {\n" " image: url(:/visual/res/svg/fema-wing.svg);\n" " background-color: #ffffff; \n" @@ -290,11 +306,156 @@ public: "}")); gridLayout_8 = new QGridLayout(incidentsTab); gridLayout_8->setObjectName("gridLayout_8"); + scrollArea = new QScrollArea(incidentsTab); + scrollArea->setObjectName("scrollArea"); + scrollArea->setStyleSheet(QString::fromUtf8("background: transparent")); + scrollArea->setWidgetResizable(true); + scrollAreaWidgetContents = new QWidget(); + scrollAreaWidgetContents->setObjectName("scrollAreaWidgetContents"); + scrollAreaWidgetContents->setGeometry(QRect(0, 0, 1608, 770)); + verticalLayout_2 = new QVBoxLayout(scrollAreaWidgetContents); + verticalLayout_2->setObjectName("verticalLayout_2"); + horizontalLayout_3 = new QHBoxLayout(); + horizontalLayout_3->setSpacing(15); + horizontalLayout_3->setObjectName("horizontalLayout_3"); + horizontalLayout_3->setContentsMargins(25, -1, -1, -1); + label_2 = new QLabel(scrollAreaWidgetContents); + label_2->setObjectName("label_2"); + label_2->setMinimumSize(QSize(488, 36)); + label_2->setStyleSheet(QString::fromUtf8("width: 488px;\n" +"height: 36px;\n" +"background: transparent;\n" +"font-family: Inter;\n" +"font-size: 30px;\n" +"font-weight: 400;\n" +"line-height: 36.31px;\n" +"text-align: left;\n" +"color: #13385F;\n" +"")); + + horizontalLayout_3->addWidget(label_2); + + label = new QLabel(scrollAreaWidgetContents); + label->setObjectName("label"); + label->setMinimumSize(QSize(275, 36)); + label->setStyleSheet(QString::fromUtf8("width: 275px;\n" +"height: 36px;\n" +"background: transparent;\n" +"font-family: Inter;\n" +"font-size: 30px;\n" +"font-weight: 400;\n" +"line-height: 36.31px;\n" +"text-align: left;\n" +"color: #13385F;\n" +"")); + + horizontalLayout_3->addWidget(label); + + horizontalSpacer_7 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + horizontalLayout_3->addItem(horizontalSpacer_7); + + + verticalLayout_2->addLayout(horizontalLayout_3); + + horizontalLayout_2 = new QHBoxLayout(); + horizontalLayout_2->setSpacing(15); + horizontalLayout_2->setObjectName("horizontalLayout_2"); + horizontalLayout_2->setContentsMargins(25, -1, -1, -1); + comboBox_2 = new QComboBox(scrollAreaWidgetContents); + comboBox_2->setObjectName("comboBox_2"); + QSizePolicy sizePolicy4(QSizePolicy::Preferred, QSizePolicy::Fixed); + sizePolicy4.setHorizontalStretch(0); + sizePolicy4.setVerticalStretch(0); + sizePolicy4.setHeightForWidth(comboBox_2->sizePolicy().hasHeightForWidth()); + comboBox_2->setSizePolicy(sizePolicy4); + comboBox_2->setMinimumSize(QSize(488, 60)); + comboBox_2->setStyleSheet(QString::fromUtf8("QComboBox::drop-down {\n" +" border: 0px;\n" +"}\n" +"\n" +"QComboBox::down-arrow {\n" +" image: url(:/visual/res/svg/chevron-down.png);\n" +"}\n" +"\n" +"QComboBox {\n" +" border: 2px solid #DCD174;\n" +" background: transparent;\n" +"}")); + + horizontalLayout_2->addWidget(comboBox_2); + + comboBox = new QComboBox(scrollAreaWidgetContents); + comboBox->setObjectName("comboBox"); + comboBox->setMinimumSize(QSize(275, 60)); + comboBox->setStyleSheet(QString::fromUtf8("QComboBox::drop-down {\n" +" border: 0px;\n" +"}\n" +"\n" +"QComboBox::down-arrow {\n" +" image: url(:/visual/res/svg/chevron-down.png);\n" +"}\n" +"\n" +"QComboBox {\n" +" border: 2px solid #DCD174;\n" +" background: transparent;\n" +"}")); + + horizontalLayout_2->addWidget(comboBox); + + horizontalSpacer_8 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + horizontalLayout_2->addItem(horizontalSpacer_8); + + + verticalLayout_2->addLayout(horizontalLayout_2); + + horizontalLayout = new QHBoxLayout(); + horizontalLayout->setObjectName("horizontalLayout"); + horizontalLayout->setContentsMargins(25, -1, -1, -1); + lineEdit = new QLineEdit(scrollAreaWidgetContents); + lineEdit->setObjectName("lineEdit"); + sizePolicy4.setHeightForWidth(lineEdit->sizePolicy().hasHeightForWidth()); + lineEdit->setSizePolicy(sizePolicy4); + lineEdit->setMinimumSize(QSize(778, 60)); + lineEdit->setStyleSheet(QString::fromUtf8("width: 778px;\n" +"height: 60px;\n" +"border: 2px solid #DCD174;\n" +"font-family: Inter;\n" +"font-size: 26px;\n" +"font-weight: 400;\n" +"line-height: 31.47px;\n" +"text-align: left;\n" +"background: #00000000;\n" +"color: #a6a6a6;\n" +"\n" +"\n" +"\n" +"")); + + horizontalLayout->addWidget(lineEdit); + + horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + horizontalLayout->addItem(horizontalSpacer); + + + verticalLayout_2->addLayout(horizontalLayout); + + asd = new QHBoxLayout(); + asd->setObjectName("asd"); + + verticalLayout_2->addLayout(asd); + + scrollArea->setWidget(scrollAreaWidgetContents); + + gridLayout_8->addWidget(scrollArea, 0, 0, 1, 1); + tabWidget->addTab(incidentsTab, QString()); journalTab = new QWidget(); journalTab->setObjectName("journalTab"); - sizePolicy1.setHeightForWidth(journalTab->sizePolicy().hasHeightForWidth()); - journalTab->setSizePolicy(sizePolicy1); + sizePolicy2.setHeightForWidth(journalTab->sizePolicy().hasHeightForWidth()); + journalTab->setSizePolicy(sizePolicy2); journalTab->setStyleSheet(QString::fromUtf8("#journalTab {\n" " image: url(:/visual/res/svg/fema-wing.svg);\n" " background-color: #ffffff; \n" @@ -305,8 +466,8 @@ public: tabWidget->addTab(journalTab, QString()); statisticsTab = new QWidget(); statisticsTab->setObjectName("statisticsTab"); - sizePolicy1.setHeightForWidth(statisticsTab->sizePolicy().hasHeightForWidth()); - statisticsTab->setSizePolicy(sizePolicy1); + sizePolicy2.setHeightForWidth(statisticsTab->sizePolicy().hasHeightForWidth()); + statisticsTab->setSizePolicy(sizePolicy2); statisticsTab->setStyleSheet(QString::fromUtf8("#statisticsTab {\n" " image: url(:/visual/res/svg/fema-wing.svg);\n" " background-color: #ffffff; \n" @@ -317,8 +478,8 @@ public: tabWidget->addTab(statisticsTab, QString()); settingsTab = new QWidget(); settingsTab->setObjectName("settingsTab"); - sizePolicy1.setHeightForWidth(settingsTab->sizePolicy().hasHeightForWidth()); - settingsTab->setSizePolicy(sizePolicy1); + sizePolicy2.setHeightForWidth(settingsTab->sizePolicy().hasHeightForWidth()); + settingsTab->setSizePolicy(sizePolicy2); settingsTab->setStyleSheet(QString::fromUtf8("#settingsTab {\n" " image: url(:/visual/res/svg/fema-wing.svg);\n" " background-color: #ffffff; \n" @@ -350,6 +511,8 @@ public: showHidden->setText(QCoreApplication::translate("MainWindow", "\320\237\320\276\320\272\320\260\320\267\320\260\321\202\321\214 \321\201\320\272\321\200\321\213\321\202\321\213\320\265", nullptr)); search->setText(QCoreApplication::translate("MainWindow", "\320\237\320\276\320\270\321\201\320\272...", nullptr)); tabWidget->setTabText(tabWidget->indexOf(sensorsTab), QCoreApplication::translate("MainWindow", "\320\224\320\260\321\202\321\207\320\270\320\272\320\270", nullptr)); + label_2->setText(QCoreApplication::translate("MainWindow", "\320\223\321\200\321\203\320\277\320\277\320\260:", nullptr)); + label->setText(QCoreApplication::translate("MainWindow", "\320\237\320\276\320\272\320\260\320\267\320\260\321\202\321\214 \321\201\320\272\321\200\321\213\321\202\321\213\320\265", nullptr)); tabWidget->setTabText(tabWidget->indexOf(incidentsTab), QCoreApplication::translate("MainWindow", "\320\230\320\275\321\206\320\270\320\264\320\265\320\275\321\202\321\213", nullptr)); tabWidget->setTabText(tabWidget->indexOf(journalTab), QCoreApplication::translate("MainWindow", "\320\226\321\203\321\200\320\275\320\260\320\273", nullptr)); tabWidget->setTabText(tabWidget->indexOf(statisticsTab), QCoreApplication::translate("MainWindow", "\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\260", nullptr)); diff --git a/flowlayout.cpp b/flowlayout.cpp new file mode 100644 index 0000000..b20a708 --- /dev/null +++ b/flowlayout.cpp @@ -0,0 +1,108 @@ +#include "flowlayout.h" + +#include + +FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing) + : QLayout(parent), m_hSpacing(hSpacing), m_vSpacing(vSpacing) { + setContentsMargins(margin, margin, margin, margin); +} + +FlowLayout::~FlowLayout() { + QLayoutItem *item; + while ((item = takeAt(0))) { + delete item; + } +} + +void FlowLayout::addItem(QLayoutItem *item) { + m_items.append(item); +} + +int FlowLayout::count() const { + return m_items.size(); +} + +QLayoutItem *FlowLayout::itemAt(int index) const { + return m_items.value(index); +} + +QLayoutItem *FlowLayout::takeAt(int index) { + return (index >= 0 && index < m_items.size()) ? m_items.takeAt(index) : nullptr; +} + +Qt::Orientations FlowLayout::expandingDirections() const { + return Qt::Orientation(0); +} + +bool FlowLayout::hasHeightForWidth() const { + return true; +} + +int FlowLayout::heightForWidth(int width) const { + return doLayout(QRect(0, 0, width, 0), true); +} + +void FlowLayout::setGeometry(const QRect &rect) { + QLayout::setGeometry(rect); + doLayout(rect, false); +} + +QSize FlowLayout::sizeHint() const { + return minimumSize(); +} + +QSize FlowLayout::minimumSize() const { + QSize size; + for (const QLayoutItem *item : qAsConst(m_items)) { + size = size.expandedTo(item->minimumSize()); + } + const QMargins margins = contentsMargins(); + size += QSize(margins.left() + margins.right(), margins.top() + margins.bottom()); + return size; +} + +int FlowLayout::doLayout(const QRect &rect, bool testOnly) const { + int x = rect.x(); + int y = rect.y(); + int lineHeight = 0; + + for (QLayoutItem *item : qAsConst(m_items)) { + int spaceX = horizontalSpacing(); + int spaceY = verticalSpacing(); + int nextX = x + item->sizeHint().width() + spaceX; + + if (nextX - spaceX > rect.right() && lineHeight > 0) { + x = rect.x(); + y += lineHeight + spaceY; + nextX = x + item->sizeHint().width() + spaceX; + lineHeight = 0; + } + + if (!testOnly) { + item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); + } + + x = nextX; + lineHeight = qMax(lineHeight, item->sizeHint().height()); + } + return y + lineHeight - rect.y(); +} + +int FlowLayout::horizontalSpacing() const { + return (m_hSpacing >= 0) ? m_hSpacing : smartSpacing(QStyle::PM_LayoutHorizontalSpacing); +} + +int FlowLayout::verticalSpacing() const { + return (m_vSpacing >= 0) ? m_vSpacing : smartSpacing(QStyle::PM_LayoutVerticalSpacing); +} + +int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const { + QObject *parent = this->parent(); + if (!parent) { + return -1; + } else if (parent->isWidgetType()) { + return static_cast(parent)->style()->pixelMetric(pm, nullptr, static_cast(parent)); + } else { + return static_cast(parent)->spacing(); + } +} diff --git a/flowlayout.h b/flowlayout.h new file mode 100644 index 0000000..9bcf599 --- /dev/null +++ b/flowlayout.h @@ -0,0 +1,38 @@ +#ifndef FLOWLAYOUT_H +#define FLOWLAYOUT_H + +#include +#include +#include +#include + +class FlowLayout : public QLayout { +public: + explicit FlowLayout(QWidget *parent = nullptr, int margin = 0, int hSpacing = -1, int vSpacing = -1); + ~FlowLayout() override; + + void addItem(QLayoutItem *item) override; + int count() const override; + QLayoutItem *itemAt(int index) const override; + QLayoutItem *takeAt(int index) override; + + Qt::Orientations expandingDirections() const override; + bool hasHeightForWidth() const override; + int heightForWidth(int width) const override; + + void setGeometry(const QRect &rect) override; + QSize sizeHint() const override; + QSize minimumSize() const override; + +private: + int doLayout(const QRect &rect, bool testOnly) const; + int horizontalSpacing() const; + int verticalSpacing() const; + int smartSpacing(QStyle::PixelMetric pm) const; + + QList m_items; + int m_hSpacing; + int m_vSpacing; +}; + +#endif // FLOWLAYOUT_H diff --git a/mainwindow.cpp b/mainwindow.cpp index f270958..47ec1ce 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,7 +1,7 @@ #include "mainwindow.h" #include "./ui_mainwindow.h" #include "httpclient.h" -#include "sensorlayout.h" +#include "flowlayout.h" #include "sensorwidget.h" #include @@ -11,126 +11,6 @@ #include -#include -#include -#include -#include -#include - -class FlowLayout : public QLayout { -public: - explicit FlowLayout(QWidget *parent = nullptr, int margin = 0, int hSpacing = -1, int vSpacing = -1) - : QLayout(parent), m_hSpacing(hSpacing), m_vSpacing(vSpacing) { - setContentsMargins(margin, margin, margin, margin); - } - - ~FlowLayout() override { - QLayoutItem *item; - while ((item = takeAt(0))) { - delete item; - } - } - - void addItem(QLayoutItem *item) override { - m_items.append(item); - } - - int horizontalSpacing() const { - return (m_hSpacing >= 0) ? m_hSpacing : smartSpacing(QStyle::PM_LayoutHorizontalSpacing); - } - - int verticalSpacing() const { - return (m_vSpacing >= 0) ? m_vSpacing : smartSpacing(QStyle::PM_LayoutVerticalSpacing); - } - - Qt::Orientations expandingDirections() const override { - return Qt::Orientation(0); - } - - bool hasHeightForWidth() const override { - return true; - } - - int heightForWidth(int width) const override { - int height = doLayout(QRect(0, 0, width, 0), true); - return height; - } - - int count() const override { - return m_items.size(); - } - - QLayoutItem *itemAt(int index) const override { - return m_items.value(index); - } - - QLayoutItem *takeAt(int index) override { - return (index >= 0 && index < m_items.size()) ? m_items.takeAt(index) : nullptr; - } - - void setGeometry(const QRect &rect) override { - QLayout::setGeometry(rect); - doLayout(rect, false); - } - - QSize sizeHint() const override { - return minimumSize(); - } - - QSize minimumSize() const override { - QSize size; - for (const QLayoutItem *item : qAsConst(m_items)) { - size = size.expandedTo(item->minimumSize()); - } - const QMargins margins = contentsMargins(); - size += QSize(margins.left() + margins.right(), margins.top() + margins.bottom()); - return size; - } - -private: - int doLayout(const QRect &rect, bool testOnly) const { - int x = rect.x(); - int y = rect.y(); - int lineHeight = 0; - - for (QLayoutItem *item : qAsConst(m_items)) { - QWidget *wid = item->widget(); - int spaceX = horizontalSpacing(); - int spaceY = verticalSpacing(); - int nextX = x + item->sizeHint().width() + spaceX; - if (nextX - spaceX > rect.right() && lineHeight > 0) { - x = rect.x(); - y += lineHeight + spaceY; - nextX = x + item->sizeHint().width() + spaceX; - lineHeight = 0; - } - - if (!testOnly) { - item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); - } - - x = nextX; - lineHeight = qMax(lineHeight, item->sizeHint().height()); - } - return y + lineHeight - rect.y(); - } - - int smartSpacing(QStyle::PixelMetric pm) const { - QObject *parent = this->parent(); - if (!parent) { - return -1; - } else if (parent->isWidgetType()) { - return static_cast(parent)->style()->pixelMetric(pm, nullptr, static_cast(parent)); - } else { - return static_cast(parent)->spacing(); - } - } - - QList m_items; - int m_hSpacing; - int m_vSpacing; -}; - MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) @@ -139,42 +19,30 @@ MainWindow::MainWindow(QWidget *parent) QScrollArea *scrollArea = new QScrollArea(this); scrollArea->setStyleSheet("background: transparent; border: 0;"); - scrollArea->setWidgetResizable(true); // Контейнер будет растягиваться по области просмотра - scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); // Прокрутка по вертикали по мере необходимости - scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // Прокрутка по горизонтали по мере необходимости + scrollArea->setWidgetResizable(true); + scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - // Создаем контейнер виджетов и устанавливаем кастомный FlowLayout - QWidget *widgetContainer = new QWidget(scrollArea); // Контейнер для виджетов - FlowLayout *layout = new FlowLayout(widgetContainer, 10, 10, 10); // Используем FlowLayout + QWidget *widgetContainer = new QWidget(scrollArea); + FlowLayout *layout = new FlowLayout(widgetContainer, 10, 10, 10); - // Добавляем виджеты в контейнер int num = 0; for (int row = 0; row < 10; ++row) { - for (int col = 0; col < 10; ++col) { + for (int col = 0; col < 1; ++col) { const QString a = QString::number(row); const QString b = QString::number(col); const QString c = QString::number(num); num++; - // Создаем экземпляр SensorWidget SensorWidget *sensor = new SensorWidget(nullptr, a, b, c); - // Добавляем SensorWidget в FlowLayout layout->addWidget(sensor); } } - // Устанавливаем FlowLayout в качестве основного layout для контейнера widgetContainer->setLayout(layout); - - // Устанавливаем контейнер виджетов как виджет для QScrollArea scrollArea->setWidget(widgetContainer); - - // Добавляем QScrollArea в основной layout (предполагаем, что это ui->SensorsTabLayout) ui->SensorsTabLayout->addWidget(scrollArea); - qDebug() << "ScrollArea Size:" << scrollArea->size(); - //qDebug() << "Widget Count:" << sensorLayout->count(); - /* HttpClient httpClient; for (int i = 0; i < 10; ++i) { QJsonObject getResult = httpClient.get("http://raspberrypi.lan:8080/data/getDevices"); diff --git a/sensorlayout.cpp b/sensorlayout.cpp deleted file mode 100644 index 9780385..0000000 --- a/sensorlayout.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include "sensorlayout.h" - -SensorLayout::SensorLayout(QWidget *parent) - : QLayout(parent) -{} - -SensorLayout::~SensorLayout() -{ - while (!items.isEmpty()) - delete items.takeFirst(); -} - -void SensorLayout::addItem(QLayoutItem *item) -{ - items.append(item); -} - -QSize SensorLayout::sizeHint() const -{ - return QSize(400, 400); // Базовый размер -} - -QSize SensorLayout::minimumSize() const -{ - return QSize(200, 200); // Минимальный размер -} - -int SensorLayout::count() const -{ - return items.size(); -} - -QLayoutItem *SensorLayout::itemAt(int index) const -{ - return items.value(index); -} - -QLayoutItem *SensorLayout::takeAt(int index) -{ - if (index >= 0 && index < items.size()) - return items.takeAt(index); - return nullptr; -} - -void SensorLayout::setGeometry(const QRect &rect) -{ - QLayout::setGeometry(rect); - - int x = spacing; // Отступ слева - int y = spacing; // Отступ сверху - int maxWidth = rect.width(); // Максимальная ширина доступного пространства - int rowHeight = 0; // Высота текущей строки - - for (QLayoutItem *item : qAsConst(items)) { - QSize itemSize = item->sizeHint(); - - // Проверяем, помещается ли элемент в текущую строку - if (x + itemSize.width() > maxWidth - spacing) { - // Переход на новую строку - x = spacing; // Сбрасываем горизонтальное положение - y += rowHeight + spacing; // Увеличиваем вертикальное положение - rowHeight = 0; // Сбрасываем высоту строки - } - - // Устанавливаем элемент - item->setGeometry(QRect(QPoint(x, y), itemSize)); - - // Обновляем `x` для следующего элемента - x += itemSize.width() + spacing; - - // Высота строки обновляется, если текущий элемент выше - rowHeight = qMax(rowHeight, itemSize.height()); - } -} diff --git a/sensorlayout.h b/sensorlayout.h deleted file mode 100644 index 6061812..0000000 --- a/sensorlayout.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SENSORLAYOUT_H -#define SENSORLAYOUT_H - -#include -#include -#include - -class SensorLayout : public QLayout -{ -public: - SensorLayout(QWidget *parent = nullptr); - ~SensorLayout(); - - void addItem(QLayoutItem *item) override; - QSize sizeHint() const override; - QSize minimumSize() const override; - int count() const override; - QLayoutItem *itemAt(int index) const override; - QLayoutItem *takeAt(int index) override; - void setGeometry(const QRect &rect) override; - -private: - QList items; - int spacing = 20; -}; - -#endif // SENSORLAYOUT_H