#include "DeviceWidget.h" #include #include #include #include #include #include #include #include "bank/BankSettingsWindow.h" DeviceWidget::DeviceWidget(const DeviceInfo &device, QWidget *parent): QWidget(parent) { auto *layout = new QGridLayout(this); layout->setContentsMargins(2, 2, 2, 2); layout->setSpacing(0); this->setStyleSheet("background-color: lightgray;padding: 2px;"); QImage img; img.loadFromData(device.image, "JPG"); auto *imageLabel = new QLabel(this); imageLabel->setPixmap(QPixmap::fromImage(img).scaled(300, 450, Qt::KeepAspectRatio, Qt::SmoothTransformation)); imageLabel->setAlignment(Qt::AlignCenter); layout->addWidget(imageLabel, 0, 0); auto *statusLabel = new QLabel(device.name, this); statusLabel->setWordWrap(true); statusLabel->setMaximumWidth(300); statusLabel->setStyleSheet( "background-color: rgba(0, 0, 0, 0.5);" "color: white;" ); // статус — в ту же ячейку, но поверх картинки и по углу layout->addWidget(statusLabel, 0, 0, Qt::AlignTop | Qt::AlignLeft); auto *batteryLabel = new QLabel(QString("%1%").arg(device.battery), this); batteryLabel->setWordWrap(true); batteryLabel->setMaximumWidth(300); batteryLabel->setStyleSheet( "background-color: rgba(0, 0, 0, 0.5);" "color: white;" ); // статус — в ту же ячейку, но поверх картинки и по углу layout->addWidget(batteryLabel, 0, 0, Qt::AlignTop | Qt::AlignRight); auto *overlay = new QWidget(this); overlay->setAttribute(Qt::WA_TransparentForMouseEvents, false); overlay->setStyleSheet("background: transparent;"); // сам фон прозрачный // вертикальный лэйаут списка внутри overlay auto *vbox = new QVBoxLayout(overlay); vbox->setContentsMargins(2, 0, 0, 2); vbox->setSpacing(2); // пример трёх строк (можете генерировать их динамически) for (int i = 0; i < 3; ++i) { auto *rowWidget = new QWidget(overlay); rowWidget->setContentsMargins(0, 0, 0, 0); rowWidget->setStyleSheet( "background-color: rgba(0, 0, 0, 0.6);" // полупрозрачный фон "border-radius: 4px;" // скруглённые углы, если нужно ); // вешаем на контейнер ваш QHBoxLayout auto *hbox = new QHBoxLayout(rowWidget); hbox->setContentsMargins(2, 1, 1, 1); hbox->setSpacing(0); auto *icon = new QLabel(overlay); QPixmap pixmap(QCoreApplication::applicationDirPath() + "/images/alfa_icon.png"); icon->setPixmap(pixmap); icon->setPixmap(pixmap.scaled(18, 18, Qt::KeepAspectRatio, Qt::SmoothTransformation)); icon->setStyleSheet( "background-color: transparent;" "margin: 0px;" ); auto *label = new QLabel(QString("Банк %1").arg(i + 1), overlay); label->setStyleSheet( "background-color: transparent;" "margin: 0px;" "font-size: 10px;" "color: white;" ); auto *circle = new QLabel(overlay); circle->setFixedSize(12, 12); circle->setStyleSheet( "margin: 0px;" "background-color: red; " "border-radius: 6px;" ); auto *btn1 = new QPushButton(overlay); QIcon btnIcon(QCoreApplication::applicationDirPath() + "/images/turn_on.png"); btn1->setIcon(btnIcon); btn1->setIconSize(QSize(16, 16)); btn1->setFlat(true); btn1->setStyleSheet( "margin: 0px;" "background-color: transparent;" "border: none;" ); auto *btn2 = new QPushButton(overlay); QIcon btn2Icon(QCoreApplication::applicationDirPath() + "/images/cogwheel.png"); btn2->setIcon(btn2Icon); btn2->setIconSize(QSize(16, 16)); btn2->setFlat(true); btn2->setStyleSheet( "margin: 0px;" "background-color: transparent;" "border: none;" ); // собираем hbox->addWidget(icon); hbox->addWidget(label); hbox->addWidget(circle); hbox->addWidget(btn1); hbox->addWidget(btn2); hbox->addStretch(); vbox->addWidget(rowWidget); } vbox->addStretch(); // кладём overlay в ту же ячейку, что и картинку, // но выравниваем его по левому-нижнему углу layout->addWidget(overlay, 0, 0, Qt::AlignLeft | Qt::AlignBottom); auto *addBankBtn = new QPushButton(this); addBankBtn->setMaximumWidth(300); addBankBtn->setText("Добавить банк +"); addBankBtn->setStyleSheet( "background-color: #fff;" "margin-top: 2px;" "padding: 4px;" "color: #000;" ); QString deviceId = device.id; QString deviceName = device.name; connect(addBankBtn, &QPushButton::clicked, this, [deviceId, deviceName]() { static QPointer bankSettingsWindow; // Если окна нет (либо ещё не было создано, либо уже удалилось) — создаём заново if (!bankSettingsWindow) { bankSettingsWindow = new BankSettingsWindow(nullptr, deviceId, deviceName); bankSettingsWindow->setWindowFlags(bankSettingsWindow->windowFlags() | Qt::Window); bankSettingsWindow->setAttribute(Qt::WA_DeleteOnClose); } // Показать/поднять/активировать bankSettingsWindow->show(); bankSettingsWindow->raise(); bankSettingsWindow->activateWindow(); }); layout->addWidget(addBankBtn, 1, 0); }