#include "MainWindow.h" #include "bank/AccountWindow.h" #include #include #include #include #include "TutorialWindow.h" #include "bank/BankListWindow.h" #include "event/EventWindow.h" #include "log/LogWindow.h" #include "db/DeviceInfo.h" #include "device/DeviceWidget.h" #include "dao/DeviceDAO.h" #include "widget/common/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(m_devicesWindow); stackedWidget->setCurrentWidget(m_devicesWindow); // FIXME переделать на ленивое создание // m_accountsWindow = new AccountWindow(this); // stackedWidget->addWidget(m_accountsWindow); // stackedWidget->setCurrentWidget(accountPage); resize(800, 600); // Работа с меню QMenu *menu = menuBar()->addMenu("Меню"); auto *devicesPageAction = new QAction("Активные устройства", this); // auto *accountPageAction = new QAction("Аккаунты", this); auto *bankListAction = new QAction("Банки", this); auto *tutorialPageAction = new QAction("Инструкция", this); auto *eventAction = new QAction("События", this); auto *logAction = new QAction("Логи", this); menu->addAction(devicesPageAction); // menu->addAction(accountPageAction); menu->addAction(bankListAction); menu->addAction(eventAction); menu->addAction(tutorialPageAction); menu->addAction(logAction); connect(devicesPageAction, &QAction::triggered, this, [=]() { if (!m_devicesWindow) { createDevicePage(); } stackedWidget->setCurrentWidget(m_devicesWindow); }); // connect(accountPageAction, &QAction::triggered, this, [=]() { // stackedWidget->setCurrentWidget(m_accountsWindow); // deleteDevicePage(); // освобождаем ресурсы // }); connect(bankListAction, &QAction::triggered, this, [=]() { if (!m_bankListWindow) { m_bankListWindow = new BankListWindow(this); } m_bankListWindow->show(); m_bankListWindow->raise(); m_bankListWindow->activateWindow(); }); connect(tutorialPageAction, &QAction::triggered, this, [=]() { if (!m_tutorialWindow) { m_tutorialWindow = new TutorialWindow(this); } m_tutorialWindow->show(); m_tutorialWindow->raise(); m_tutorialWindow->activateWindow(); }); connect(eventAction, &QAction::triggered, this, [=]() { if (!m_eventWindow) { m_eventWindow = new EventWindow(this); } m_eventWindow->show(); m_eventWindow->raise(); m_eventWindow->activateWindow(); }); connect(logAction, &QAction::triggered, this, [=]() { if (!m_logWindow) { m_logWindow = new LogWindow(this); } m_logWindow->show(); m_logWindow->raise(); m_logWindow->activateWindow(); }); // m_tutorialWindow = new TutorialWindow(this); // m_tutorialWindow->show(); // QTimer::singleShot(0, m_tutorialWindow, [w = m_tutorialWindow]() { // w->raise(); // w->activateWindow(); // }); } void MainWindow::createDevicePage() { if (m_devicesWindow) { return; } auto *scrollArea = new QScrollArea(this); auto *contentWidget = new QWidget; flowLayout = new FlowLayout(contentWidget, 0, 0, 0); // flowLayout->setContentsMargins(0, 0, 0, 0); // flowLayout->setSpacing(0); QVector devices = DeviceDAO::getAllDevices(false); 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); m_devicesWindow = scrollArea; stackedWidget->addWidget(m_devicesWindow); timer->start(1000); } void MainWindow::deleteDevicePage() { if (!m_devicesWindow) { return; } timer->stop(); stackedWidget->removeWidget(m_devicesWindow); m_devicesWindow->deleteLater(); m_devicesWindow = nullptr; flowLayout = nullptr; } /** * Однако, в нем вы вызываете delete для элементов, что изменяет память. * Для того, чтобы не нарушать константность, этот метод должен быть неконстантным (без const в сигнатуре). */ void MainWindow::loadDevices() { const auto devices = DeviceDAO::getAllDevices(false); // Очистить старые виджеты 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)); } }