// // 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" #include "MyButton.h" #include "sqlitehelper.h" #ifdef _DEBUG #pragma comment(lib, "Qt5Svgd.lib") #pragma comment(lib, "Qt5Sqld.lib") #else #pragma comment(lib, "Qt5Svg.lib") #pragma comment(lib, "Qt5Sql.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(MainScreen *mainScreen,QWidget *parent) : QWidget(parent), ui(new Ui::NavBar) { ui->setupUi(this); this->parent = parent; //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); ConfigResponse config_response; ConfigRequest config_request; config_request.sendRequest(&config_response); SQLiteHelper sqlite_helper; sqlite_helper.get_software(&buttonStructs, &config_response); if(!config_response.succeed) { qColor.setNamedColor(background_color); }else { qColor.setNamedColor(background_color); } layout2 = new QHBoxLayout; layout_right = new QHBoxLayout; layout_left = new QHBoxLayout; getLogoFromInternet(&config_response); logo_label = new QLabel(this); logo_label->setAttribute(Qt::WA_TranslucentBackground); //*logo = logo->scaled(this->width() / (5 / scale), this->height()); logo_label->setScaledContents(true); QPixmap pixmap(QApplication::applicationDirPath() + DEFAULT_LOGO); pixmap.setMask(pixmap.createMaskFromColor(QColor(Qt::transparent))); logo_label->setAutoFillBackground(true); QPalette palette = logo_label->palette(); palette.setColor(QPalette::Window, Qt::transparent); logo_label->setPalette(palette); logo_label->setPixmap(pixmap); 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 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) { 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; if (downloadSuccess == true&& reply->error() == QNetworkReply::NoError) { *buffer = reply->readAll(); QFile logo(QApplication::applicationDirPath() + DEFAULT_LOGO); if (logo.open(QIODevice::WriteOnly)) { logo.write(*buffer); logo.close(); } buffer->clear(); reply->close(); } 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::refresh(int state) { SQLiteHelper sqlite_helper; buttonStructs.clear(); sqlite_helper.get_software(&buttonStructs, background_color,text_color,text_cover_color); for(auto button:buttons) { layout_right->removeWidget(button); delete button; buttons.removeOne(button); } 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; } emit application_manager->refresh();//在这里refresh,避免因为refresh导致信号和槽断开 }