#include "mainwindow.h" #include "./ui_mainwindow.h" #include "httpclient.h" #include "sensorlayout.h" #include "sensorwidget.h" #include #include #include #include #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) { ui->setupUi(this); QScrollArea *scrollArea = new QScrollArea(this); scrollArea->setStyleSheet("background: transparent; border: 0;"); scrollArea->setWidgetResizable(true); // Контейнер будет растягиваться по области просмотра scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); // Прокрутка по вертикали по мере необходимости scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // Прокрутка по горизонтали по мере необходимости // Создаем контейнер виджетов и устанавливаем кастомный FlowLayout QWidget *widgetContainer = new QWidget(scrollArea); // Контейнер для виджетов FlowLayout *layout = new FlowLayout(widgetContainer, 10, 10, 10); // Используем FlowLayout // Добавляем виджеты в контейнер int num = 0; for (int row = 0; row < 10; ++row) { for (int col = 0; col < 10; ++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"); qDebug() << "GET Response:" << getResult; }*/ } MainWindow::~MainWindow() { delete ui; } void MainWindow::ResizeEvent(QResizeEvent *event) {} void MainWindow::SetupTabs() {} void MainWindow::SetupSensorTab(QWidget *tab, QVBoxLayout *mainLayout) {} void MainWindow::SetupIncidentTab(QWidget *tab, QVBoxLayout *mainLayout) {} void MainWindow::SetupStatisticsTab(QWidget *tab, QVBoxLayout *mainLayout) {} void MainWindow::SetupJournalTab(QWidget *tab, QVBoxLayout *mainLayout) {} void MainWindow::SetupSettingsTab(QWidget *tab, QVBoxLayout *mainLayout) {}