#include "MainWindow.h" #include "AccountWindow.h" #include #include #include #include #include "db/DeviceInfo.h" #include "DeviceWidget.h" #include "dao/DeviceDAO.h" #include "widget/FlowLayout.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // Инициализируем таймер обновления timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &MainWindow::loadDevices); stackedWidget = new QStackedWidget(this); setCentralWidget(stackedWidget); createDevicePage(); stackedWidget->addWidget(devicePage); // stackedWidget->setCurrentWidget(devicePage); FIXME // FIXME переделать на ленивое создание accountPage = new AccountWindow(this); stackedWidget->addWidget(accountPage); stackedWidget->setCurrentWidget(accountPage); resize(800, 600); // Работа с меню QMenu *menu = menuBar()->addMenu("Меню"); auto *devicesPageAction = new QAction("Активные устройства", this); auto *accountPageAction = new QAction("Аккаунты", this); menu->addAction(devicesPageAction); menu->addAction(accountPageAction); connect(devicesPageAction, &QAction::triggered, this, [=]() { if (!devicePage) { createDevicePage(); } stackedWidget->setCurrentWidget(devicePage); }); connect(accountPageAction, &QAction::triggered, this, [=]() { stackedWidget->setCurrentWidget(accountPage); deleteDevicePage(); // освобождаем ресурсы }); } void MainWindow::createDevicePage() { if (devicePage) { return; } auto *scrollArea = new QScrollArea(this); auto *contentWidget = new QWidget; flowLayout = new FlowLayout(contentWidget); flowLayout->setContentsMargins(0, 0, 0, 0); flowLayout->setSpacing(0); QVector devices = DeviceDAO::getAllDevices(true); for (const auto &device: devices) { auto *deviceWidget = new DeviceWidget(device); deviceWidget->setFixedSize(220, 400); flowLayout->addWidget(deviceWidget); } contentWidget->setLayout(flowLayout); scrollArea->setWidget(contentWidget); scrollArea->setWidgetResizable(true); devicePage = scrollArea; stackedWidget->addWidget(devicePage); timer->start(1000); } void MainWindow::deleteDevicePage() { if (!devicePage) { return; } timer->stop(); stackedWidget->removeWidget(devicePage); devicePage->deleteLater(); devicePage = nullptr; flowLayout = nullptr; } /** * Однако, в нем вы вызываете delete для элементов, что изменяет память. * Для того, чтобы не нарушать константность, этот метод должен быть неконстантным (без const в сигнатуре). */ void MainWindow::loadDevices() { const auto devices = DeviceDAO::getAllDevices(true); // Очистить старые виджеты QLayoutItem *item; while ((item = flowLayout->takeAt(0)) != nullptr) { if (item->widget()) { delete item->widget(); // Удаляем виджет } delete item; // Удаляем сам элемент из layout } // Добавляем новые виджеты для каждого устройства for (const auto &device: devices) { flowLayout->addWidget(new DeviceWidget(device)); } }