From 3d517ab8235470184281ef2c320d59cc401e4be8 Mon Sep 17 00:00:00 2001 From: keke <243768648@qq.com> Date: Thu, 3 Sep 2026 21:02:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4Dialog=E6=8E=A7?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Widgets/Dialog.cpp | 82 +++++++++++++++++++++++++++----------- src/Widgets/Dialog.h | 21 +++++++--- src/Widgets/TitleBar.cpp | 60 +++++++++++++++++++--------- src/Widgets/TitleBar.h | 7 ++++ src/appmanagerwidget.cpp | 2 +- src/dlg/pkgdownloaddlg.cpp | 75 ++++++++++------------------------ src/dlg/pkgdownloaddlg.h | 17 +------- 7 files changed, 147 insertions(+), 117 deletions(-) diff --git a/src/Widgets/Dialog.cpp b/src/Widgets/Dialog.cpp index 1de777d..9bf3b31 100644 --- a/src/Widgets/Dialog.cpp +++ b/src/Widgets/Dialog.cpp @@ -6,6 +6,9 @@ Dialog::Dialog(QWidget *parent) : QWidget(parent) , m_onButtonClickedClose(false) +#ifdef USE_DTK + , m_centralWidgetBlurBg(nullptr) +#endif , m_titleBar(nullptr) , m_messageLabel(nullptr) , m_contentLayout(nullptr) @@ -13,22 +16,38 @@ Dialog::Dialog(QWidget *parent) , m_btnListLayout(nullptr) { setWindowFlag(Qt::WindowType::Dialog); - setFocusPolicy(Qt::FocusPolicy::ClickFocus); - setWindowFlag(Qt::WindowType::FramelessWindowHint); - setAttribute(Qt::WA_TranslucentBackground); // 启用背景透明(关键!) - // Qt 5.15+/Qt 6 建议额外启用(解决部分平台 QSS 不生效): - setAttribute(Qt::WA_StyledBackground, true); +#ifdef USE_DTK + // 设置背景 + setAttribute(Qt::WA_TranslucentBackground); - QVBoxLayout *mainLayout = new QVBoxLayout(this); - mainLayout->setContentsMargins(3, 3, 3, 3); + m_centralWidgetBlurBg = new DBlurEffectWidget(this); + m_centralWidgetBlurBg->setBlendMode(DBlurEffectWidget::BlendMode::BehindWindowBlend); + m_centralWidgetBlurBg->setFixedSize(size()); + m_centralWidgetBlurBg->lower(); +#endif + + QVBoxLayout *windowLayout = new QVBoxLayout(this); + windowLayout->setContentsMargins(0, 0, 0, 0); // title area m_titleBar = new TitleBar(this); - mainLayout->addWidget(m_titleBar, 0, Qt::AlignTop); + m_titleBar->SetMenuBtnVisible(false); + m_titleBar->SetMinBtnVisible(false); + m_titleBar->SetMaxBtnVisible(false); + windowLayout->addWidget(m_titleBar, 0, Qt::AlignTop); + m_titleBar->setVisible(false); +#ifdef USE_DTK + m_titleBar->setVisible(true); +#endif + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(3, 3, 3, 3); + windowLayout->addLayout(mainLayout); // message m_messageLabel = new QLabel(this); mainLayout->addWidget(m_messageLabel, 0, Qt::AlignLeft); + m_messageLabel->setVisible(false); // content m_contentLayout = new QVBoxLayout(); @@ -43,6 +62,27 @@ Dialog::Dialog(QWidget *parent) //// connect } +Dialog::~Dialog() +{ +} + +void Dialog::setWindowTitle(const QString &title) +{ + m_titleBar->SetTitle(title); + QWidget::setWindowTitle(title); +} + +void Dialog::setWindowIcon(const QIcon &icon) +{ + m_titleBar->SetIcon(icon); + QWidget::setWindowIcon(icon); +} + +TitleBar *Dialog::GetTitleBar() const +{ + return m_titleBar; +} + QList Dialog::GetButtons() const { return m_btnList; @@ -58,17 +98,12 @@ QWidget *Dialog::GetContent() const return m_contentWidget; } -QString Dialog::Title() const -{ - return m_titleBar->Title(); -} - QString Dialog::Message() const { return m_messageLabel->text(); } -QIcon Dialog::Icon() const +QIcon Dialog::WindowIcon() const { return m_titleBar->Icon(); } @@ -121,7 +156,12 @@ void Dialog::SetTitle(const QString &title) void Dialog::SetMessage(const QString &message) { + if (message.isEmpty()) { + m_messageLabel->setVisible(false); + return; + } m_messageLabel->setText(message); + m_messageLabel->setVisible(true); } void Dialog::SetIcon(const QIcon &icon) @@ -151,17 +191,13 @@ void Dialog::closeEvent(QCloseEvent *e) QWidget::closeEvent(e); } -void Dialog::paintEvent(QPaintEvent*) +void Dialog::resizeEvent(QResizeEvent *event) { - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿必备 - painter.setPen(Qt::NoPen); - painter.setBrush(QColor("#ffffff")); - painter.drawRoundedRect(rect().adjusted(1, 1, -1, -1), 8, 8); // 内缩 1px 防边缘白线 + QWidget::resizeEvent(event); - painter.setPen(QPen(Qt::black, 1)); // 设置线宽/颜色 - painter.setBrush(Qt::NoBrush); - painter.drawRoundedRect(rect().adjusted(1, 1, -1, -1), 8, 8); // 内缩 1px 防边缘白线 +#ifdef USE_DTK + m_centralWidgetBlurBg->setFixedSize(size()); +#endif } void Dialog::onBtnClicked() diff --git a/src/Widgets/Dialog.h b/src/Widgets/Dialog.h index ab4e86d..ff2180c 100644 --- a/src/Widgets/Dialog.h +++ b/src/Widgets/Dialog.h @@ -3,6 +3,12 @@ #include "TitleBar.h" +#ifdef USE_DTK +#include + +DWIDGET_USE_NAMESPACE +#endif + #include #include #include @@ -28,21 +34,23 @@ public: }; explicit Dialog(QWidget *parent = nullptr); + ~Dialog() override; + + void setWindowTitle(const QString &title); + void setWindowIcon(const QIcon &icon); + TitleBar *GetTitleBar() const; QList GetButtons() const; QAbstractButton* GetButton(int index) const; QWidget* GetContent() const; - QString Title() const; QString Message() const; - QIcon Icon() const; + QIcon WindowIcon() const; Q_SIGNALS: void Closed(); void ButtonClicked(int index, const QString &text); void TitleChanged(QString title); void MessageChanged(QString massage); - // void SizeChanged(QSize size); - // void VisibleChanged(bool visible); public Q_SLOTS: void AddButton(const QString &text, ButtonType type = ButtonNormal); @@ -59,7 +67,7 @@ public Q_SLOTS: protected: void closeEvent(QCloseEvent *e) override; - void paintEvent(QPaintEvent*) override; + void resizeEvent(QResizeEvent *event) override; private slots: void onBtnClicked(); @@ -69,6 +77,9 @@ private: int m_clickedBtnIndex; QEventLoop m_loop; +#ifdef USE_DTK + DBlurEffectWidget *m_centralWidgetBlurBg; +#endif TitleBar *m_titleBar; QLabel *m_messageLabel; QVBoxLayout *m_contentLayout; diff --git a/src/Widgets/TitleBar.cpp b/src/Widgets/TitleBar.cpp index 0eaabb1..d48e755 100644 --- a/src/Widgets/TitleBar.cpp +++ b/src/Widgets/TitleBar.cpp @@ -11,6 +11,9 @@ TitleBar::TitleBar(QWidget *parent) , m_iconLabel(nullptr) , m_titleLabel(nullptr) , m_menuBtn(nullptr) + , m_minBtn(nullptr) + , m_maxBtn(nullptr) + , m_closeBtn(nullptr) { setMouseTracking(true); setContentsMargins(0, 0, 0, 0); @@ -27,6 +30,7 @@ TitleBar::TitleBar(QWidget *parent) mainLayout->addSpacing(5); m_titleLabel = new QLabel(this); + m_titleLabel->setText(window()->windowTitle()); mainLayout->addWidget(m_titleLabel, 0, Qt::AlignLeft); mainLayout->addStretch(1); @@ -37,28 +41,28 @@ TitleBar::TitleBar(QWidget *parent) m_menuBtn->setStyleSheet("QPushButton::menu-indicator {image:none;}"); mainLayout->addWidget(m_menuBtn, 0, Qt::AlignRight); - QPushButton *minBtn = new QPushButton(this); - minBtn->setFixedSize(40, 40); - minBtn->setIconSize(QSize(40, 40)); - minBtn->setIcon(style()->standardIcon(QStyle::StandardPixmap::SP_TitleBarMinButton)); - mainLayout->addWidget(minBtn, 0, Qt::AlignRight); + m_minBtn = new QPushButton(this); + m_minBtn->setFixedSize(40, 40); + m_minBtn->setIconSize(QSize(40, 40)); + m_minBtn->setIcon(style()->standardIcon(QStyle::StandardPixmap::SP_TitleBarMinButton)); + mainLayout->addWidget(m_minBtn, 0, Qt::AlignRight); - QPushButton *maxBtn = new QPushButton(this); - maxBtn->setFixedSize(40, 40); - maxBtn->setIconSize(QSize(40, 40)); - maxBtn->setIcon(style()->standardIcon(QStyle::StandardPixmap::SP_TitleBarMaxButton)); - mainLayout->addWidget(maxBtn, 0, Qt::AlignRight); + m_maxBtn = new QPushButton(this); + m_maxBtn->setFixedSize(40, 40); + m_maxBtn->setIconSize(QSize(40, 40)); + m_maxBtn->setIcon(style()->standardIcon(QStyle::StandardPixmap::SP_TitleBarMaxButton)); + mainLayout->addWidget(m_maxBtn, 0, Qt::AlignRight); - QPushButton *closeBtn = new QPushButton(this); - closeBtn->setFixedSize(40, 40); - closeBtn->setIconSize(QSize(40, 40)); - closeBtn->setIcon(style()->standardIcon(QStyle::StandardPixmap::SP_TitleBarCloseButton)); - mainLayout->addWidget(closeBtn, 0, Qt::AlignRight); + m_closeBtn = new QPushButton(this); + m_closeBtn->setFixedSize(40, 40); + m_closeBtn->setIconSize(QSize(40, 40)); + m_closeBtn->setIcon(style()->standardIcon(QStyle::StandardPixmap::SP_TitleBarCloseButton)); + mainLayout->addWidget(m_closeBtn, 0, Qt::AlignRight); //// connect - connect(minBtn, &QPushButton::clicked, this, &TitleBar::onWindowMinBtnClicked); - connect(maxBtn, &QPushButton::clicked, this, &TitleBar::onWindowMaxBtnClicked); - connect(closeBtn, &QPushButton::clicked, this, &TitleBar::onWindowCloseBtnClicked); + connect(m_minBtn, &QPushButton::clicked, this, &TitleBar::onWindowMinBtnClicked); + connect(m_maxBtn, &QPushButton::clicked, this, &TitleBar::onWindowMaxBtnClicked); + connect(m_closeBtn, &QPushButton::clicked, this, &TitleBar::onWindowCloseBtnClicked); } TitleBar::~TitleBar() @@ -91,6 +95,26 @@ void TitleBar::SetMenu(QMenu *menu) m_menuBtn->setMenu(menu); } +void TitleBar::SetMenuBtnVisible(bool visible) +{ + m_menuBtn->setVisible(visible); +} + +void TitleBar::SetMinBtnVisible(bool visible) +{ + m_minBtn->setVisible(visible); +} + +void TitleBar::SetMaxBtnVisible(bool visible) +{ + m_maxBtn->setVisible(visible); +} + +void TitleBar::SetCloseBtnVisible(bool visible) +{ + m_closeBtn->setVisible(visible); +} + void TitleBar::mousePressEvent(QMouseEvent *e) { QWidget::mousePressEvent(e); diff --git a/src/Widgets/TitleBar.h b/src/Widgets/TitleBar.h index 6fbf3e3..0c553c8 100644 --- a/src/Widgets/TitleBar.h +++ b/src/Widgets/TitleBar.h @@ -24,6 +24,10 @@ public: void SetTitle(const QString &title); QString Title() const; void SetMenu(QMenu *menu); + void SetMenuBtnVisible(bool visible); + void SetMinBtnVisible(bool visible); + void SetMaxBtnVisible(bool visible); + void SetCloseBtnVisible(bool visible); protected: void mousePressEvent(QMouseEvent *e) override; @@ -38,4 +42,7 @@ private: QLabel *m_iconLabel; QLabel *m_titleLabel; QPushButton *m_menuBtn; + QPushButton *m_minBtn; + QPushButton *m_maxBtn; + QPushButton *m_closeBtn; }; diff --git a/src/appmanagerwidget.cpp b/src/appmanagerwidget.cpp index 79ee3a5..c2e03d5 100644 --- a/src/appmanagerwidget.cpp +++ b/src/appmanagerwidget.cpp @@ -155,7 +155,7 @@ AppManagerWidget::AppManagerWidget(AppManagerModel *model, QWidget *parent) m_appListView = new QListView(this); m_appListView->setSpacing(0); m_appListView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - m_appListView->setLineWidth(2); + m_appListView->setLineWidth(1); m_appListView->setTextElideMode(Qt::TextElideMode::ElideMiddle); m_appListView->setEditTriggers(QListView::EditTrigger::NoEditTriggers); m_appListView->setAutoFillBackground(true); diff --git a/src/dlg/pkgdownloaddlg.cpp b/src/dlg/pkgdownloaddlg.cpp index 6be8461..1d4c97b 100644 --- a/src/dlg/pkgdownloaddlg.cpp +++ b/src/dlg/pkgdownloaddlg.cpp @@ -14,14 +14,9 @@ using namespace AM; PkgDownloadDlg::PkgDownloadDlg(const AM::AppInfo &appInfo, AppManagerModel *model, QWidget *parent) - : QFrame(parent) + : Dialog(parent) , m_model(model) , m_showingAppInfo(appInfo) -#ifdef USE_DTK - , m_centralWidgetBlurBg(nullptr) -#endif - , m_titleBar(nullptr) - , m_windowCloseBtn(nullptr) , m_versionSelectMenu(nullptr) , m_versionSelectBtn(nullptr) , m_downloadBtn(nullptr) @@ -32,37 +27,19 @@ PkgDownloadDlg::PkgDownloadDlg(const AM::AppInfo &appInfo, AppManagerModel *mode , m_infoEdit(nullptr) { setMinimumSize(600, 400); - setWindowFlag(Qt::WindowType::Dialog); - setWindowModality(Qt::WindowModality::ApplicationModal); - setFocusPolicy(Qt::FocusPolicy::ClickFocus); - -#ifdef USE_DTK - // 设置背景 - setAttribute(Qt::WA_TranslucentBackground); - - m_centralWidgetBlurBg = new DBlurEffectWidget(this); - m_centralWidgetBlurBg->setBlendMode(DBlurEffectWidget::BlendMode::BehindWindowBlend); - m_centralWidgetBlurBg->setFixedSize(size()); - m_centralWidgetBlurBg->lower(); -#endif - - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->setContentsMargins(0, 0, 0, 0); - setLayout(mainLayout); - - m_titleBar = new TitleBar(this); - m_titleBar->SetIcon(QIcon(":/icons/spark-app-manager_56px.svg")); - m_titleBar->SetTitle("应用安装包下载器"); - mainLayout->addWidget(m_titleBar, 0, Qt::AlignTop); - m_titleBar->setVisible(false); -#ifdef USE_DTK - m_titleBar->setVisible(true); -#endif - - mainLayout->addSpacing(3); + setWindowIcon(QIcon(":/icons/spark-app-manager_56px.svg")); + setWindowTitle("应用安装包下载器"); + + QWidget *contentWidget = new QWidget(this); + SetContent(contentWidget); + + QVBoxLayout *contentLayout = new QVBoxLayout(contentWidget); + contentLayout->setContentsMargins(0, 0, 0, 0); + + contentLayout->addSpacing(3); QHBoxLayout *pkgDownloadLayout = new QHBoxLayout; pkgDownloadLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->addLayout(pkgDownloadLayout); + contentLayout->addLayout(pkgDownloadLayout); pkgDownloadLayout->addSpacing(LEFT_MARGIN); QLabel *tipLabel = new QLabel("选择版本:", this); @@ -97,7 +74,7 @@ PkgDownloadDlg::PkgDownloadDlg(const AM::AppInfo &appInfo, AppManagerModel *mode // 保存位置 QHBoxLayout *savedlocationLayout = new QHBoxLayout; savedlocationLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->addLayout(savedlocationLayout); + contentLayout->addLayout(savedlocationLayout); savedlocationLayout->addSpacing(LEFT_MARGIN); QLabel *savedlocationTitleLable = new QLabel("保存位置:"); @@ -116,7 +93,7 @@ PkgDownloadDlg::PkgDownloadDlg(const AM::AppInfo &appInfo, AppManagerModel *mode // 包大小 QHBoxLayout *pkgSizeLayout = new QHBoxLayout; pkgSizeLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->addLayout(pkgSizeLayout); + contentLayout->addLayout(pkgSizeLayout); pkgSizeLayout->addSpacing(LEFT_MARGIN); QLabel *pkgSizeTitleLable = new QLabel("已下载/总大小:"); @@ -130,7 +107,7 @@ PkgDownloadDlg::PkgDownloadDlg(const AM::AppInfo &appInfo, AppManagerModel *mode // 进度条 QHBoxLayout *progressLayout = new QHBoxLayout; progressLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->addLayout(progressLayout); + contentLayout->addLayout(progressLayout); progressLayout->addSpacing(LEFT_MARGIN); m_progressBar = new QProgressBar(this); @@ -143,7 +120,7 @@ PkgDownloadDlg::PkgDownloadDlg(const AM::AppInfo &appInfo, AppManagerModel *mode // 包信息 QHBoxLayout *pkgInfoLayout = new QHBoxLayout; pkgInfoLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->addLayout(pkgInfoLayout); + contentLayout->addLayout(pkgInfoLayout); pkgInfoLayout->addSpacing(LEFT_MARGIN); m_infoEdit = new QTextEdit(this); @@ -152,7 +129,7 @@ PkgDownloadDlg::PkgDownloadDlg(const AM::AppInfo &appInfo, AppManagerModel *mode pkgInfoLayout->addWidget(m_infoEdit, 1); pkgInfoLayout->addSpacing(RIGHT_MARGIN); - mainLayout->addSpacing(10); + contentLayout->addSpacing(10); // init connection initConnection(); @@ -166,19 +143,9 @@ PkgDownloadDlg::~PkgDownloadDlg() { } -void PkgDownloadDlg::resizeEvent(QResizeEvent *event) -{ - QFrame::resizeEvent(event); - -#ifdef USE_DTK - m_centralWidgetBlurBg->setFixedSize(size()); -#endif -} - void PkgDownloadDlg::closeEvent(QCloseEvent *event) { - QFrame::closeEvent(event); - this->hide(); + Dialog::closeEvent(event); this->deleteLater(); } @@ -227,8 +194,6 @@ void PkgDownloadDlg::onFileDownloadProgressChanged(const AM::PkgInfo &info, qint void PkgDownloadDlg::initConnection() { - connect(m_windowCloseBtn, &QPushButton::clicked, this, &QFrame::close); - connect(m_versionSelectMenu, &QMenu::triggered, this, &PkgDownloadDlg::onVerSelectMenuTrigered); connect(m_downloadBtn, &QPushButton::clicked, this, [this](bool) { this->m_model->notifyThreadDownloadPkgFile(m_selectedPkgInfo); @@ -265,11 +230,11 @@ void PkgDownloadDlg::initConnection() void PkgDownloadDlg::updateUI() { if (m_isDownloading) { - m_titleBar->setEnabled(false); + GetTitleBar()->setEnabled(false); m_versionSelectBtn->setEnabled(false); m_downloadBtn->setEnabled(false); } else { - m_titleBar->setEnabled(true); + GetTitleBar()->setEnabled(true); m_versionSelectBtn->setEnabled(true); m_downloadBtn->setEnabled(true); } diff --git a/src/dlg/pkgdownloaddlg.h b/src/dlg/pkgdownloaddlg.h index 577442e..0fc4949 100644 --- a/src/dlg/pkgdownloaddlg.h +++ b/src/dlg/pkgdownloaddlg.h @@ -1,13 +1,7 @@ #pragma once #include "../common/appmanagercommon.h" #include "../appmanagermodel.h" -#include "../Widgets/TitleBar.h" - -#ifdef USE_DTK -#include - -DWIDGET_USE_NAMESPACE -#endif +#include "../Widgets/Dialog.h" #include #include @@ -17,7 +11,7 @@ DWIDGET_USE_NAMESPACE #include #include -class PkgDownloadDlg : public QFrame +class PkgDownloadDlg : public Dialog { Q_OBJECT public: @@ -25,7 +19,6 @@ public: virtual ~PkgDownloadDlg() override; protected: - virtual void resizeEvent(QResizeEvent *event) override; virtual void closeEvent(QCloseEvent *event) override; public Q_SLOTS: @@ -39,12 +32,6 @@ private: private: AppManagerModel *m_model; AM::AppInfo m_showingAppInfo; -#ifdef USE_DTK - DBlurEffectWidget *m_centralWidgetBlurBg; -#endif - TitleBar *m_titleBar; - QPushButton *m_windowCloseBtn; - AM::PkgInfo m_selectedPkgInfo; QMenu *m_versionSelectMenu; QList m_versionActionList; -- Gitee