// // Created by HW on 2023/07/26. // // You may need to build the project (run Qt uic code generator) to get "ui_NavBar.h" resolved #include "navbar.h" #include "ui_NavBar.h" #include "config.h" #include #include #include #include "mainwindowlayout.h" #include "globalvariables.h" #ifdef _DEBUG #pragma comment(lib, "Qt5Svgd.lib") #else #pragma comment(lib, "Qt5Svg.lib") #endif QString url_param; void ConvertImageToTransparent(QImage &img) { img = img.convertToFormat(QImage::Format_ARGB32); union myrgb { uint rgba; uchar rgba_bits[4]; }; myrgb* mybits = (myrgb*)img.bits(); int len = img.width()*img.height(); while (len--> 0) { mybits->rgba_bits[3] = (mybits->rgba == 0xFFFFFFFF) ? 0 : 255; mybits++; } } NavBar::NavBar(ConfigResponse *configResponse, MainScreen *mainScreen,QWidget *parent) : QWidget(parent), ui(new Ui::NavBar) { ui->setupUi(this); //this->setAttribute(Qt::WA_DeleteOnClose); buffer = new QByteArray; /*QString style = "background-color:"; style += configResponse->basic.backgroud_color.toUpper(); style += ";"; setStyleSheet(style);*/ //setStyleSheet("margin:0"); setContentsMargins(0, 0, 0, 0); if (configResponse->succeed&&configResponse->menus.empty()!=true) { getLogoFromInternet(configResponse); } else { getLogoFromLocal(); } layout2 = new QHBoxLayout; layout_right = new QHBoxLayout; layout_left = new QHBoxLayout; logo_label = new QLabel(this); //*logo = logo->scaled(this->width() / (5 / scale), this->height()); logo_label->setScaledContents(true); logo_label->setPixmap(QPixmap::fromImage(*logo)); logo_label->setMaximumHeight(parent->height() / 8); layout_left->addWidget(logo_label); layout_left->setAlignment(Qt::AlignCenter); for (auto buttonStruct : buttonStructs) { MyButton *myButton = new MyButton(buttonStruct, height(), height(), &buttons,this); myButton->setMaximumHeight(parent->height() / 8); layout_right->addWidget(myButton); //myButton->show(); connect(myButton, &MyButton::clicked1, mainWindowLayout, &MainWindowLayout::clickButton); buttons << myButton; } layout_right->setAlignment(Qt::AlignLeft); if (!buttonStructs.empty()) { connect(this, &NavBar::firstUrl, mainScreen, &MainScreen::firstUrl); emit firstUrl(buttonStructs[0].url); } layout2->addLayout(layout_left, 1); layout2->addLayout(layout_right, 4); layout_right->setMargin(0); layout2->setMargin(0); //layout2->setAlignment(Qt::AlignJustify); this->setLayout(layout2); logo_label->show(); } NavBar::~NavBar() { for (auto buttonStruct : buttonStructs) { delete buttonStruct.image; delete buttonStruct.image_cover; } for(auto button : buttons){ layout_right->removeWidget(button); delete button; } layout2->removeWidget(logo_label); delete logo_label; delete logo; //delete layout_left; delete layout_right; delete layout2; delete ui; } void NavBar::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); QRectF rect(0, 0, this->width(), this->height()); painter.fillRect(rect, qColor); } void NavBar::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); for(auto button:buttons){ button->setMaximumSize(event->size().height(), event->size().height()); button->update(); } logo_label->setMaximumSize(event->size().width() / 5, event->size().height()); } void NavBar::getLogoFromInternet(ConfigResponse *configResponse) { qColor.setNamedColor(configResponse->basic.backgroud_color); QUrl url_logo(configResponse->basic.logo_url); QNetworkRequest *request_logo = new QNetworkRequest(url_logo); manager = new QNetworkAccessManager; reply = manager->get(*request_logo); QTimer timer; timer.setInterval(5000); connect(reply, &QNetworkReply::finished, &eventLoop,&QEventLoop::quit); connect(&timer, &QTimer::timeout,this, &NavBar::cancelDownload); eventLoop.exec(); timer.stop(); buffer = new QByteArray; delete request_logo; reply->close(); if (downloadSuccess == true) { *buffer = reply->readAll(); logo = new QImage(); logo->loadFromData(*buffer); buffer->clear(); for (auto button : configResponse->menus) { QUrl url_image(button.img); QNetworkRequest *request_image = new QNetworkRequest(url_image); reply = manager->get(*request_image); QTimer timer; timer.setInterval(5000); connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); connect(&timer, &QTimer::timeout, this, &NavBar::cancelDownload); eventLoop.exec(); timer.stop(); if (!downloadSuccess) { break; } *buffer = reply->readAll(); QSvgRenderer *render_image = new QSvgRenderer(*buffer); QImage *image = new QImage(200, 200, QImage::Format_ARGB32); QPainter painter_image(image); painter_image.setCompositionMode(QPainter::CompositionMode_Clear); // 清除画布 painter_image.fillRect(rect(), Qt::transparent); // 填充透明色 painter_image.setCompositionMode(QPainter::CompositionMode_SourceOver); // 恢复默认值 render_image->render(&painter_image); buffer->clear(); reply->close(); QUrl url_image_cover(button.img_cover); QNetworkRequest *request_image_cover = new QNetworkRequest(url_image_cover); reply = manager->get(*request_image_cover); timer.setInterval(5000); connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); connect(&timer, &QTimer::timeout, this, &NavBar::cancelDownload); if (!downloadSuccess) { break; } eventLoop.exec(); *buffer = reply->readAll(); qDebug() << *buffer; QSvgRenderer *render_image_cover = new QSvgRenderer(*buffer); QImage *image_cover = new QImage(200, 200, QImage::Format_ARGB32); QPainter painter_image_cover(image_cover); painter_image_cover.setCompositionMode(QPainter::CompositionMode_Clear); // 清除画布 painter_image_cover.fillRect(rect(), Qt::transparent); // 填充透明色 painter_image_cover.setCompositionMode(QPainter::CompositionMode_SourceOver); // 恢复默认值 render_image_cover->render(&painter_image_cover); buffer->clear(); reply->close(); ButtonStruct buttonStruct; buttonStruct.image = image; buttonStruct.image_cover = image_cover; buttonStruct.text = button.title; buttonStruct.url = button.url; buttonStruct.background_color = configResponse->basic.backgroud_color; buttonStruct.text_color.setNamedColor(configResponse->basic.title_color); buttonStruct.text_cover_color.setNamedColor(configResponse->basic.title_cover_color); buttonStructs << buttonStruct; delete request_image; delete render_image; delete request_image_cover; delete render_image_cover; } } delete manager; manager = nullptr; } void NavBar::storeToBuffer() { buffer = new QByteArray; } void NavBar::cancelDownload() { disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); eventLoop.quit(); reply->abort(); downloadSuccess = false; } void NavBar::getLogoFromLocal() { QString dir = QApplication::applicationDirPath(); QFile file(dir + DEFAULT_FILE); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(nullptr, QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("无法打开配置文件")); exit(1); } buffer->clear(); *buffer = file.readAll(); file.close(); QJsonDocument *qJsonDocument = new QJsonDocument; *qJsonDocument = QJsonDocument::fromJson(*buffer); QJsonObject *obj_root = new QJsonObject; if (qJsonDocument->isObject()) { *obj_root = qJsonDocument->object(); delete qJsonDocument; QString logo_path = obj_root->value("basic").toObject().value("logo").toString(); logo = new QImage(logo_path); QString color= obj_root->value("basic").toObject().value("backgroud_color").toString(); qColor.setNamedColor(color); QJsonArray *array = new QJsonArray; *array = obj_root->value("menu").toArray(); for (auto obj : *array) { ButtonStruct buttonStruct; buttonStruct.text = obj.toObject().value("title").toString(); buttonStruct.url = QString(BASE_URL)+obj.toObject().value("url").toString(); buttonStruct.image = new QImage(obj.toObject().value("img").toString()); buttonStruct.image_cover = new QImage(obj.toObject().value("img_cover").toString()); buttonStructs << buttonStruct; } delete array; } else { QMessageBox::warning(nullptr, QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("配置文件损坏")); delete obj_root; exit(1); } delete obj_root; }