From ed2d68ff0abae01674249a808bd9bb46a0bc7fda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E6=B0=91=E5=8B=87?= Date: Sat, 8 Oct 2022 13:58:39 +0800 Subject: [PATCH] =?UTF-8?q?16551=E9=9C=80=E6=B1=82=EF=BC=9APC=E4=B8=AD?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=8C=96=E5=92=8C=E7=AA=97=E5=8F=A3=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=E5=8F=98=E5=8C=96=E9=80=82=E9=85=8D=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/utils.cpp | 12 ++ common/utils.h | 6 + kybackup/component/backuplistwidget.cpp | 54 +++++++-- kybackup/component/backuplistwidget.h | 6 +- kybackup/component/mylabel.cpp | 25 +++++ kybackup/component/mylabel.h | 6 +- kybackup/globalsignals.h | 3 + kybackup/gsettingswrapper.cpp | 1 + kybackup/maindialog.cpp | 46 ++++++-- kybackup/maindialog.h | 4 + kybackup/maindialog.ui | 6 +- kybackup/module/databackup.cpp | 141 ++++++++++++++++++------ kybackup/module/datarestore.cpp | 98 ++++++++++++++-- kybackup/module/ghostimage.cpp | 98 ++++++++++++++-- kybackup/module/systembackup.cpp | 128 +++++++++++++++++---- kybackup/module/systemrestore.cpp | 104 ++++++++++++++--- 16 files changed, 629 insertions(+), 109 deletions(-) diff --git a/common/utils.cpp b/common/utils.cpp index 813aa69..b75b602 100755 --- a/common/utils.cpp +++ b/common/utils.cpp @@ -185,6 +185,18 @@ bool Utils::checkBootInfoExists() return true; } +/** + * @brief 是否有平板模式 + * @return bool + */ +bool Utils::isTablet() +{ + QString otaPath = Utils::m_sysRootPath + "/etc/apt/ota_version"; + otaPath.replace("//", "/"); + + return QFile::exists(otaPath); +} + /** * @brief 获取备份分区的UUID * @return 备份分区的UUID diff --git a/common/utils.h b/common/utils.h index ff85639..f3957f2 100755 --- a/common/utils.h +++ b/common/utils.h @@ -72,6 +72,12 @@ public: */ static bool checkBootInfoExists(); + /** + * @brief 是否有平板模式 + * @return bool + */ + static bool isTablet(); + /** * @brief 获取备份分区的UUID * @return 备份分区的UUID diff --git a/kybackup/component/backuplistwidget.cpp b/kybackup/component/backuplistwidget.cpp index dd7bac8..98f84a9 100755 --- a/kybackup/component/backuplistwidget.cpp +++ b/kybackup/component/backuplistwidget.cpp @@ -12,15 +12,19 @@ #define WIDTH_ITEM 36 #define MERGE_IN 8 +#define WIDTH_SPACING 5 -MyItemWidget::MyItemWidget(QWidget* parent) : - QWidget(parent) +MyItemWidget::MyItemWidget(QWidget* parent, QListWidgetItem *item) : + QWidget(parent), + m_item(item) { + if (parent && item) + item->setSizeHint(QSize(parent->width() - 5, WIDTH_ITEM)); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); QHBoxLayout *hlayout = new QHBoxLayout; hlayout->setContentsMargins(5, 2, 2, 2); - hlayout->setSpacing(5); + hlayout->setSpacing(WIDTH_SPACING); m_label = new MyLabel; m_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); @@ -37,6 +41,8 @@ MyItemWidget::MyItemWidget(QWidget* parent) : // hlayout->setAlignment(Qt::AlignLeft); connect(this, &MyItemWidget::setScrollWidth, this, [=](int width) { + if (parent && this->m_item) + item->setSizeHint(QSize(width - 5 - this->m_scrollWidth, WIDTH_ITEM)); int labelWidth = this->m_label->width(); this->m_extWidth = 0; // 隐藏滚动条时会增加右侧边距 @@ -64,7 +70,7 @@ MyItemWidget::MyItemWidget(QWidget* parent) : int labelWidth = this->m_label->width(); if (checked) { this->m_buttonDelete->setVisible(true); - this->m_label->setFixedWidth(labelWidth - 5 - m_buttonDelete->width()); + this->m_label->setFixedWidth(labelWidth - WIDTH_SPACING - m_buttonDelete->width()); this->m_label->setElidedText(this->m_text, Qt::ElideLeft); this->m_label->setFontColor(Qt::white); this->m_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); @@ -73,7 +79,7 @@ MyItemWidget::MyItemWidget(QWidget* parent) : this->m_checked = true; } else { this->m_buttonDelete->setVisible(false); - this->m_label->setFixedWidth(labelWidth + 5 + m_buttonDelete->width()); + this->m_label->setFixedWidth(labelWidth + WIDTH_SPACING + m_buttonDelete->width()); this->m_label->setElidedText(this->m_text, Qt::ElideLeft); this->m_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); this->m_label->setStyleSheet("QLabel {color:palette(windowText)}" @@ -82,7 +88,32 @@ MyItemWidget::MyItemWidget(QWidget* parent) : } }); - connect(m_buttonDelete, &QPushButton::clicked, this, &MyItemWidget::deleteItem); + connect(this, &MyItemWidget::resetItemWidth, this, [=](int width) { + if (parent && item) { + QListWidget *parentWidget = qobject_cast(parent); + QScrollBar *vertScroll = parentWidget->verticalScrollBar(); + int scrollWidth = 0; + if (vertScroll->isVisible()) { + scrollWidth = vertScroll->size().width(); + } + this->m_scrollWidth = scrollWidth; + item->setSizeHint(QSize(width - 5 - this->m_scrollWidth, WIDTH_ITEM)); + } + if (this->m_buttonDelete->isVisible()) { + this->m_label->setFixedWidth(width - WIDTH_SPACING - m_buttonDelete->width() - 7 - this->m_scrollWidth); + this->m_label->setElidedText(this->m_text, Qt::ElideLeft); + this->m_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + } else { + this->m_label->setFixedWidth(width - WIDTH_SPACING - 2 - this->m_scrollWidth); + this->m_label->setElidedText(this->m_text, Qt::ElideLeft); + this->m_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + } + }); + + connect(m_buttonDelete, &QPushButton::clicked, this, [=]() { + this->m_item = nullptr; + emit deleteItem(); + }); this->setLayout(hlayout); } @@ -156,6 +187,11 @@ BackupListWidget::BackupListWidget(QWidget *parent /*= nullptr*/, QHBoxLayout *p } } }); + + // 大小改变 + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=](){ + emit this->resetItemWidth(this->width()); + }); } BackupListWidget::~BackupListWidget() @@ -181,8 +217,7 @@ bool BackupListWidget::appendItem(const QString &text) ++count; QListWidgetItem *item = new QListWidgetItem(this, m_type); - item->setSizeHint(QSize(this->width() - 5, WIDTH_ITEM)); - MyItemWidget *widget = new MyItemWidget; + MyItemWidget *widget = new MyItemWidget(this, item); this->setItemWidget(item, widget); // 必须将scrollToBottom等这种滚动条操作放到判断滚动条是否显示isVisible之前 this->scrollToBottom(); @@ -195,7 +230,6 @@ bool BackupListWidget::appendItem(const QString &text) if (m_parentLayout != nullptr) m_parentLayout->setContentsMargins(MERGE_IN, MERGE_IN, 0, MERGE_IN); scrollWidth = vertScroll->size().width(); - item->setSizeHint(QSize(this->width() - 5 - scrollWidth, WIDTH_ITEM)); emit this->setScrollWidth(scrollWidth); } @@ -222,6 +256,8 @@ bool BackupListWidget::appendItem(const QString &text) } }); + connect(this, &BackupListWidget::resetItemWidth, widget, &MyItemWidget::resetItemWidth); + m_plusLogo->setVisible(false); m_plusText->setVisible(false); emit this->addedItem(); diff --git a/kybackup/component/backuplistwidget.h b/kybackup/component/backuplistwidget.h index 2970524..f040f49 100755 --- a/kybackup/component/backuplistwidget.h +++ b/kybackup/component/backuplistwidget.h @@ -14,7 +14,7 @@ class MyItemWidget : public QWidget { Q_OBJECT public: - explicit MyItemWidget(QWidget* parent = nullptr); + explicit MyItemWidget(QWidget* parent = nullptr, QListWidgetItem *item = nullptr); virtual ~MyItemWidget(); void setSize(int width, int height); @@ -29,6 +29,7 @@ signals: void selected(bool checked); void deleteItem(); void setScrollWidth(int width); + void resetItemWidth(int width); private: QString m_text; @@ -37,6 +38,8 @@ private: int m_scrollWidth = 0; //父窗口QListWidget的滚动条宽度 int m_extWidth = 0; //去掉父窗口QListWidget的父窗口QFrame的右侧边距时扩展的宽度 bool m_checked = false; + + QListWidgetItem *m_item; }; class BackupListWidget : public QListWidget @@ -74,6 +77,7 @@ signals: void deleteEmpty(); void addedItem(); void setScrollWidth(int width); + void resetItemWidth(int width); private: bool checkPathLimit(const QString &path); diff --git a/kybackup/component/mylabel.cpp b/kybackup/component/mylabel.cpp index b93e101..b6a9d0b 100755 --- a/kybackup/component/mylabel.cpp +++ b/kybackup/component/mylabel.cpp @@ -89,6 +89,31 @@ MyLabel::MyLabel(const QString& text, QWidget* parent /*= nullptr*/, Qt::Alignme MyLabel::~MyLabel() {} +void MyLabel::setMaxLenText() +{ + QFontMetrics fontMetrics(this->font()); + int fontSize = fontMetrics.width(this->m_text); + if (this->m_maxWidth > 0 && fontSize >= this->m_maxWidth) { + this->setFixedWidth(this->m_maxWidth); + this->setWordWrap(true); + } else { + this->setFixedWidth(fontSize); + } + this->setText(this->m_text); +} + +/** + * @brief 设置显示文本,根据字体自动设置控件宽度,并限制最大宽度;超过长度换行展示; + * @param text + * @param length 最大宽度 + */ +void MyLabel::setMaxLenText(const QString& text, int width) +{ + m_text = text; + m_maxWidth = width; + setMaxLenText(); +} + /** * @brief 如果文本超长则显示省略号,不超长正常显示 * @param text diff --git a/kybackup/component/mylabel.h b/kybackup/component/mylabel.h index e7836d1..ba96943 100755 --- a/kybackup/component/mylabel.h +++ b/kybackup/component/mylabel.h @@ -16,6 +16,7 @@ public: const QString & getOriginalText() const { return m_text; } void setDeplayText(const QString& text) { m_text = text; this->setText(text);} void setElidedText(const QString& text, Qt::TextElideMode mode = Qt::ElideRight); + void setMaxLenText(const QString& text, int width); void setFontColor(QColor color); void setFontSize(int size); void setFontWordWrap(bool on); @@ -25,13 +26,16 @@ protected: // 主要因为字体变化而重绘,故暂不重写paintEvent,改为在构造方法中监控主题的字体(家族和大小)变化 // void paintEvent(QPaintEvent *event); +private: + void setMaxLenText(); + private: QString m_text; bool m_bWordWrap = false; int m_width = 0; int m_height = 0; + int m_maxWidth = 0; bool m_isOriginal = false; - bool m_needResize = false; QRect m_rect; QColor m_fontColor; diff --git a/kybackup/globalsignals.h b/kybackup/globalsignals.h index 1857131..a76f65e 100755 --- a/kybackup/globalsignals.h +++ b/kybackup/globalsignals.h @@ -28,6 +28,9 @@ signals: // 强调色变化 void themeColorChanged(); + + // 控件宽度发生变化 + void widthChanged(); }; #endif // GLOBALSIGNALS_H diff --git a/kybackup/gsettingswrapper.cpp b/kybackup/gsettingswrapper.cpp index ac805e6..cb9ae73 100755 --- a/kybackup/gsettingswrapper.cpp +++ b/kybackup/gsettingswrapper.cpp @@ -43,6 +43,7 @@ GSettingsWrapper::GSettingsWrapper(token) // 字体大小或字体类型发生变化 int fontSize = m_pGsettingThemeData->get("system-font-size").toInt(); emit GlobelBackupInfo::inst().getGlobalSignals()->fontChanged(fontSize); + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); } else if (key == COLOR_QT_KEY) { // 强调色变化 emit GlobelBackupInfo::inst().getGlobalSignals()->themeColorChanged(); diff --git a/kybackup/maindialog.cpp b/kybackup/maindialog.cpp index 4232250..8f5292a 100755 --- a/kybackup/maindialog.cpp +++ b/kybackup/maindialog.cpp @@ -71,29 +71,34 @@ void MainDialog::initUI() m_totalHLayout->setSpacing(0); ui->centralwidget->setLayout(m_totalHLayout); + // 左栏窗口 if (GlobelBackupInfo::inst().isManager()) m_leftSiderBarWidget = new LeftsiderbarWidget(ui->centralwidget); else m_leftSiderBarWidget = new LeftsiderbarWidget(ui->centralwidget, LeftsiderbarWidget::StartMode::std_user); m_leftSiderBarWidget->setObjectName(QString::fromUtf8("m_leftSiderBarWidget")); - m_leftSiderBarWidget->setFixedSize(200, 640); + m_leftSiderBarWidget->setFixedWidth(200); + //m_leftSiderBarWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); m_leftSiderBarWidget->initUi(); m_totalHLayout->addWidget(m_leftSiderBarWidget); + // 右侧窗口 m_rightWidget = new MyWidget; + //m_rightWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_rightVLayout = new QVBoxLayout; m_rightVLayout->setObjectName(QString::fromUtf8("m_rightVLayout")); m_rightVLayout->setContentsMargins(0, 0, 0, 0); m_rightVLayout->setSpacing(0); + // 右侧窗口:标题栏 m_titleWidget = new QWidget; m_titleWidget->setObjectName(QString::fromUtf8("m_titleWidget")); - m_titleWidget->setFixedSize(760, 40); + m_titleWidget->setFixedHeight(40); m_rightVLayout->addWidget(m_titleWidget); - m_rightVLayout->addStretch(); + // 右侧窗口:工作区 if (GlobelBackupInfo::inst().isManager() && GlobelBackupInfo::inst().hasArgRestore()) selected(FuncTypeConverter::FunType::RESTORE_SYSTEM); else if (!GlobelBackupInfo::inst().isManager() && GlobelBackupInfo::inst().hasArgRestore()) @@ -105,7 +110,6 @@ void MainDialog::initUI() m_rightWidget->setLayout(m_rightVLayout); m_totalHLayout->addWidget(m_rightWidget); - m_totalHLayout->addStretch(); initTileBar(); } @@ -114,14 +118,16 @@ void MainDialog::initTileBar() { m_titleLayout = new QHBoxLayout; m_titleLayout->setContentsMargins(8, 4, 4, 0); - m_titleLayout->setSpacing(0); + m_titleLayout->setSpacing(4); m_menuOptionBtn = new QToolButton; m_minBtn = new QPushButton; + m_maxBtn = new QPushButton; m_closeBtn = new QPushButton; m_menuOptionBtn->setToolTip(tr("Main menu")); m_minBtn->setToolTip(tr("Minimize")); + m_maxBtn->setToolTip(tr("Maximize")); m_closeBtn->setToolTip(tr("Close")); m_menuOptionBtn->setProperty("isWindowButton", 0x1); @@ -130,21 +136,24 @@ void MainDialog::initTileBar() m_menuOptionBtn->setFixedSize(30, 30); m_menuOptionBtn->setAutoRaise(true); m_menuOptionBtn->setPopupMode(QToolButton::InstantPopup); - // m_menuOptionBtn->setProperty("setIconHighlightEffectDefaultColor", m_closeBtn->palette().color(QPalette::Active, QPalette::Base)); m_minBtn->setProperty("isWindowButton", 0x1); m_minBtn->setProperty("useIconHighlightEffect", 0x2); m_minBtn->setFixedSize(30, 30); m_minBtn->setFlat(true); m_minBtn->setIcon(QIcon::fromTheme("window-minimize-symbolic")); - // m_minBtn->setProperty("setIconHighlightEffectDefaultColor", m_closeBtn->palette().color(QPalette::Active, QPalette::Base)); + + m_maxBtn->setProperty("isWindowButton", 0x1); + m_maxBtn->setProperty("useIconHighlightEffect", 0x2); + m_maxBtn->setFixedSize(30, 30); + m_maxBtn->setFlat(true); + m_maxBtn->setIcon(QIcon::fromTheme("window-maximize-symbolic")); m_closeBtn->setProperty("isWindowButton", 0x2); m_closeBtn->setProperty("useIconHighlightEffect", 0x8); m_closeBtn->setFixedSize(30, 30); m_closeBtn->setFlat(true); m_closeBtn->setIcon(QIcon::fromTheme("window-close-symbolic")); - // m_closeBtn->setProperty("setIconHighlightEffectDefaultColor", m_closeBtn->palette().color(QPalette::Active, QPalette::Base)); QMenu* backupMain = new QMenu(m_titleWidget); backupMain->setObjectName("mainMenu"); @@ -173,9 +182,8 @@ void MainDialog::initTileBar() m_titleLayout->addStretch(); m_titleLayout->addWidget(m_menuOptionBtn); - m_titleLayout->addSpacing(4); m_titleLayout->addWidget(m_minBtn); - m_titleLayout->addSpacing(4); + m_titleLayout->addWidget(m_maxBtn); m_titleLayout->addWidget(m_closeBtn); m_titleWidget->setLayout(m_titleLayout); } @@ -204,6 +212,17 @@ void MainDialog::initConnect() //最小化按钮 connect(m_minBtn, &QPushButton::clicked, this, &MainDialog::showMinimized); + //最大化按钮 + connect(m_maxBtn, &QPushButton::clicked, this, [=] { + if (isMaximized()) { + showNormal(); + m_maxBtn->setIcon(QIcon::fromTheme("window-maximize-symbolic")); + } else { + showMaximized(); + m_maxBtn->setIcon(QIcon::fromTheme("window-restore-symbolic")); + } + }); + //关闭按钮 connect(m_closeBtn, &QPushButton::clicked, this, &MainDialog::closeBtn); } @@ -254,7 +273,7 @@ void MainDialog::selected(int func_type) } m_stackedWidget->setObjectName(QString::fromUtf8("m_stackedWidget")); - m_stackedWidget->setFixedSize(760, 600); + // m_stackedWidget->setMinimumSize(760, 600); m_rightVLayout->addWidget(m_stackedWidget); m_leftSiderBarWidget->setCheckedFunc(func_type); @@ -333,6 +352,11 @@ void MainDialog::closeEvent(QCloseEvent *e) e->accept(); } +void MainDialog::resizeEvent(QResizeEvent *event) { + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); + QMainWindow::resizeEvent(event); +} + void MainDialog::closeBtn() { if (this->close()) { diff --git a/kybackup/maindialog.h b/kybackup/maindialog.h index 2bcb8fe..f3b42a2 100755 --- a/kybackup/maindialog.h +++ b/kybackup/maindialog.h @@ -23,6 +23,9 @@ public: void closeEvent(QCloseEvent *e); +protected: + void resizeEvent(QResizeEvent *event); + public slots: void sltMessageReceived(const QString &msg); void closeBtn(); @@ -48,6 +51,7 @@ private: QHBoxLayout *m_titleLayout = nullptr; QToolButton *m_menuOptionBtn = nullptr; QPushButton *m_minBtn = nullptr; + QPushButton *m_maxBtn = nullptr; QPushButton *m_closeBtn = nullptr; QAction *m_backupHelp = nullptr; diff --git a/kybackup/maindialog.ui b/kybackup/maindialog.ui index b22059b..140d493 100755 --- a/kybackup/maindialog.ui +++ b/kybackup/maindialog.ui @@ -11,7 +11,7 @@ - + 0 0 @@ -24,8 +24,8 @@ - 960 - 640 + 16777215 + 16777215 diff --git a/kybackup/module/databackup.cpp b/kybackup/module/databackup.cpp index 7486636..c70238e 100755 --- a/kybackup/module/databackup.cpp +++ b/kybackup/module/databackup.cpp @@ -32,6 +32,11 @@ using namespace kdk; +// bigTitle控件前面的宽度:24+spacing +#define LEN_TITLE_PRE 50 +// labelCheck1、labelCheck2控件前面的宽度:10+6+5 +#define LEN_DOT_PRE 50 + DataBackup::DataBackup(QWidget *parent /*= nullptr*/) : QStackedWidget(parent), m_udector(new UdiskDetector()), @@ -65,15 +70,25 @@ DataBackup::~DataBackup() void DataBackup::initFirstWidget() { QWidget *first = new QWidget; + QVBoxLayout *vLayout = new QVBoxLayout; + vLayout->addStretch(); + // 中部布局包含一个独立的窗口,用于大小变化时局部相对不变 + QWidget *center = new QWidget; + center->setFixedSize(760, 540); + QHBoxLayout *centerHBoxLayout = new QHBoxLayout; + centerHBoxLayout->addStretch(); + centerHBoxLayout->addWidget(center); + centerHBoxLayout->addStretch(); + vLayout->addLayout(centerHBoxLayout); // 图片 - PixmapLabel *imageBackup_firstPage = new PixmapLabel(first); + PixmapLabel *imageBackup_firstPage = new PixmapLabel(center); imageBackup_firstPage->setGeometry(421, 120, 300, 326); imageBackup_firstPage->setScaledContents(true); imageBackup_firstPage->setLightAndDarkPixmap(":/images/data_backup.png", ":/images/data_backup_dark.png"); // 系统备份大字提示 - MyLabel *labelBackup_firstPage = new MyLabel(first); + MyLabel *labelBackup_firstPage = new MyLabel(center); labelBackup_firstPage->setDeplayText(tr("Data Backup")); labelBackup_firstPage->setFixedWidth(500); labelBackup_firstPage->setFixedHeight(48); @@ -90,7 +105,7 @@ void DataBackup::initFirstWidget() labelBackup_firstPage->adjustSize(); // 数据备份说明 - MyLabel *labelNote_firstPage = new MyLabel(first); + MyLabel *labelNote_firstPage = new MyLabel(center); labelNote_firstPage->setFixedWidth(700); labelNote_firstPage->setFixedHeight(24); labelNote_firstPage->move(41, 180); @@ -105,35 +120,35 @@ void DataBackup::initFirstWidget() labelNote_firstPage->adjustSize(); // 多点还原 - MyIconLabel *iconMultiBackup_firstPage = new MyIconLabel(first); + MyIconLabel *iconMultiBackup_firstPage = new MyIconLabel(center); iconMultiBackup_firstPage->setGeometry(41, 244, 210, 36); iconMultiBackup_firstPage->setThemeIcon("ukui-multipoint-symbolic", ":/symbos/ukui-multipoint-symbolic"); iconMultiBackup_firstPage->setDesplayText(tr("Multi-Spot")); iconMultiBackup_firstPage->setEnabled(false); // 安全 - MyIconLabel *iconSecurity_firstPage = new MyIconLabel(first); + MyIconLabel *iconSecurity_firstPage = new MyIconLabel(center); iconSecurity_firstPage->setGeometry(231, 244, 180, 36); iconSecurity_firstPage->setThemeIcon("ukui-bf-security-symbolic", ":/symbos/ukui-bf-security-symbolic"); iconSecurity_firstPage->setDesplayText(tr("Security")); iconSecurity_firstPage->setEnabled(false); // 防止数据丢失 - MyIconLabel *iconDataLoss_firstPage = new MyIconLabel(first); + MyIconLabel *iconDataLoss_firstPage = new MyIconLabel(center); iconDataLoss_firstPage->setGeometry(41, 296, 210, 36); iconDataLoss_firstPage->setThemeIcon("ukui-bf-dataloss-symbolic", ":/symbos/ukui-bf-dataloss-symbolic"); iconDataLoss_firstPage->setDesplayText(tr("Protect Data")); iconDataLoss_firstPage->setEnabled(false); // 方便快捷 - MyIconLabel *iconSimple_firstPage = new MyIconLabel(first); + MyIconLabel *iconSimple_firstPage = new MyIconLabel(center); iconSimple_firstPage->setGeometry(231, 296, 180, 36); iconSimple_firstPage->setThemeIcon("ukui-bf-fast-symbolic", ":/symbos/ukui-bf-fast-symbolic"); iconSimple_firstPage->setDesplayText(tr("Convenient")); iconSimple_firstPage->setEnabled(false); // 开始备份按钮 - MyPushButton *beginBackup = new MyPushButton(first); + MyPushButton *beginBackup = new MyPushButton(center); beginBackup->setGeometry(41, 372, 180, 52); beginBackup->setText(tr("Start Backup")); beginBackup->setEnabled(true); @@ -152,8 +167,8 @@ void DataBackup::initFirstWidget() }); // 增量备份按钮 - KBorderButton *incrementBackup = new KBorderButton(first); - // MyPushButton *incrementBackup = new MyPushButton(first); + KBorderButton *incrementBackup = new KBorderButton(center); + // MyPushButton *incrementBackup = new MyPushButton(center); incrementBackup->setFixedHeight(52); incrementBackup->move(241, 372); incrementBackup->setText(tr("Update Backup")); @@ -209,11 +224,10 @@ void DataBackup::initFirstWidget() bottomHBoxLayout->addSpacing(20); bottomHBoxLayout->setAlignment(Qt::AlignRight); - QVBoxLayout *bottomVBoxLayout = new QVBoxLayout; - bottomVBoxLayout->addStretch(); - bottomVBoxLayout->addLayout(bottomHBoxLayout); - bottomVBoxLayout->addSpacing(20); - first->setLayout(bottomVBoxLayout); + vLayout->addStretch(); + vLayout->addLayout(bottomHBoxLayout); + vLayout->addSpacing(20); + first->setLayout(vLayout); connect(backupPointManage, &MyPushButton::clicked, this, [=]() { ManageBackupPointList backupManager(first, ManageBackupPointList::DATA); @@ -924,7 +938,6 @@ void DataBackup::initThirdWidget() QHBoxLayout *hlayout = new QHBoxLayout; hlayout->addStretch(); - hlayout->addSpacing(80); QWidget *centerFont = new QWidget(third); centerFont->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); QVBoxLayout *vlayoutCenterFont = new QVBoxLayout; @@ -1032,7 +1045,6 @@ void DataBackup::initThirdWidget() centerFont->setLayout(vlayoutCenterFont); hlayout->addWidget(centerFont); - hlayout->addSpacing(80); hlayout->addStretch(); hlayout->setAlignment(Qt::AlignCenter); vlayout->addLayout(hlayout); @@ -1067,6 +1079,7 @@ void DataBackup::initThirdWidget() recheck->setVisible(false); this->on_checkEnv_start(); + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); }); // 检测结果 @@ -1118,6 +1131,39 @@ void DataBackup::initThirdWidget() } preStep->setVisible(true); + + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); + }); + + // 调整中部控件大小 + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=](){ + // 控件bigTitle的宽度 + int len_title = 0; + if (bigTitle->isVisible()) { + QFontMetrics fontMetrics(bigTitle->font()); + len_title = fontMetrics.width(bigTitle->getOriginalText()); + len_title += LEN_TITLE_PRE; + } + // 控件labelCheck1的宽度 + int len_labelCheck1 = 0; + if (labelCheck1->isVisible()) { + QFontMetrics fontMetrics(labelCheck1->font()); + len_labelCheck1 = fontMetrics.width(labelCheck1->getOriginalText()); + len_labelCheck1 += LEN_DOT_PRE; + } + // 控件labelCheck2的宽度 + int len_labelCheck2 = 0; + if (labelCheck2->isVisible()) { + QFontMetrics fontMetrics(labelCheck2->font()); + len_labelCheck2 = fontMetrics.width(labelCheck2->getOriginalText()); + len_labelCheck2 += LEN_DOT_PRE; + } + int len_max = len_title > len_labelCheck1 ? len_title : len_labelCheck1; + len_max = len_max > len_labelCheck2 ? len_max : len_labelCheck2; + if (len_max >= this->width()) + len_max = this->width(); + + centerFont->setFixedWidth(len_max); }); addWidget(third); @@ -1281,9 +1327,10 @@ void DataBackup::initForthWidget() QHBoxLayout *hlayoutCenterLine1 = new QHBoxLayout; // 备份名称 MyLabel *labelBackupName = new MyLabel(forth); - labelBackupName->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - labelBackupName->setAlignment(Qt::AlignRight | Qt::AlignHCenter); labelBackupName->setDeplayText(tr("Backup Name")); + QFontMetrics fontMetrics(labelBackupName->font()); + int fontSize = fontMetrics.width(labelBackupName->getOriginalText()); + labelBackupName->setFixedWidth(fontSize); MyLineEdit *editBackupName = new MyLineEdit(forth); editBackupName->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); editBackupName->setMinimumWidth(350); @@ -1303,13 +1350,11 @@ void DataBackup::initForthWidget() hlayoutCenterLine1->addStretch(); hlayoutCenterLine1->addWidget(labelBackupName); hlayoutCenterLine1->addWidget(editBackupName); - hlayoutCenterLine1->addSpacing(40); hlayoutCenterLine1->addStretch(); hlayoutCenterLine1->setAlignment(Qt::AlignCenter); vlayout->addLayout(hlayoutCenterLine1); // 中部第二行 -// QHBoxLayout *hlayoutCenterLine2 = new QHBoxLayout; // 备份名称错误提示 MyLabel *labelError = new MyLabel(forth); labelError->setFixedSize(editBackupName->size()); @@ -1318,13 +1363,14 @@ void DataBackup::initForthWidget() labelError->setVisible(false); labelError->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); -// hlayoutCenterLine2->addStretch(); -// hlayoutCenterLine2->addSpacing(labelBackupName->width() + 10); // 和上一行对齐 -// hlayoutCenterLine2->addWidget(labelError); -// hlayoutCenterLine2->addSpacing(40); -// hlayoutCenterLine2->addStretch(); -// hlayoutCenterLine2->setAlignment(Qt::AlignCenter); -// vlayout->addLayout(hlayoutCenterLine2); + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=]{ + QFontMetrics fontMetrics(labelBackupName->font()); + int fontSize = fontMetrics.width(labelBackupName->getOriginalText()); + labelBackupName->setFixedWidth(fontSize); + + if (labelError->isVisible()) + labelError->move(editBackupName->geometry().left(), editBackupName->geometry().bottom() + 10); + }); connect(validator, &InputValidator::checked, this, [=](bool valid, QString in, int pos, QChar c) { if (in.isEmpty()) @@ -1391,9 +1437,9 @@ void DataBackup::initForthWidget() nextStep->setProperty("isImportant", true); connect(nextStep, &MyPushButton::clicked, this, [=](bool checked) { Q_UNUSED(checked) - if (labelError->isVisible()) { + /*if (labelError->isVisible()) { editBackupName->setFocus(); - } else { + } else*/ { QString backupName = editBackupName->text(); if (backupName.isEmpty()) { backupName = editBackupName->placeholderText(); @@ -1922,9 +1968,6 @@ void DataBackup::initLastWidget() resultLogo->setVisible(true); // 备份成功 bigTitle->setDeplayText(tr("The backup is successful")); - QFontMetrics fontMetrics(bigTitle->font()); - int fontSize = fontMetrics.width(bigTitle->getOriginalText()); - bigTitle->setFixedWidth(fontSize); hlayoutCenterFont1->setAlignment(Qt::AlignCenter); dot1->setVisible(false); @@ -1951,6 +1994,38 @@ void DataBackup::initLastWidget() homePage->setVisible(true); } + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); + }); + + // 调整中部控件大小 + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=](){ + // 控件bigTitle的宽度 + int len_title = 0; + if (bigTitle->isVisible()) { + QFontMetrics fontMetrics(bigTitle->font()); + len_title = fontMetrics.width(bigTitle->getOriginalText()); + len_title += LEN_TITLE_PRE; + } + // 控件labelError1的宽度 + int len_labelError1 = 0; + if (labelError1->isVisible()) { + QFontMetrics fontMetrics(labelError1->font()); + len_labelError1 = fontMetrics.width(labelError1->getOriginalText()); + len_labelError1 += LEN_DOT_PRE; + } + // 控件labelError2的宽度 + int len_labelError2 = 0; + if (labelError2->isVisible()) { + QFontMetrics fontMetrics(labelError2->font()); + len_labelError2 = fontMetrics.width(labelError2->getOriginalText()); + len_labelError2 += LEN_DOT_PRE; + } + int len_max = len_title > len_labelError1 ? len_title : len_labelError1; + len_max = len_max > len_labelError2 ? len_max : len_labelError2; + if (len_max >= this->width()) + len_max = this->width(); + + centerFont->setFixedWidth(len_max); }); // 再试一次 diff --git a/kybackup/module/datarestore.cpp b/kybackup/module/datarestore.cpp index bab0a90..ff0476b 100755 --- a/kybackup/module/datarestore.cpp +++ b/kybackup/module/datarestore.cpp @@ -25,6 +25,10 @@ #include "kborderbutton.h" using namespace kdk; +// bigTitle控件前面的宽度:24+spacing +#define LEN_TITLE_PRE 50 +// labelCheck1、labelCheck2控件前面的宽度:10+6+5 +#define LEN_DOT_PRE 50 DataRestore::DataRestore(QWidget *parent) : QStackedWidget(parent) @@ -50,15 +54,28 @@ DataRestore::~DataRestore() void DataRestore::initFirstWidget() { QWidget *first = new QWidget; + QVBoxLayout *vLayout = new QVBoxLayout; + vLayout->addStretch(); + // 中部布局包含一个独立的窗口,用于大小变化时局部相对不变 + QWidget *center = new QWidget; + center->setFixedSize(760, 540); + QHBoxLayout *centerHBoxLayout = new QHBoxLayout; + centerHBoxLayout->addStretch(); + centerHBoxLayout->addWidget(center); + centerHBoxLayout->addStretch(); + vLayout->addLayout(centerHBoxLayout); + vLayout->addStretch(); + vLayout->addSpacing(60); + first->setLayout(vLayout); // 图片 - PixmapLabel *imageRestore_firstPage = new PixmapLabel(first); + PixmapLabel *imageRestore_firstPage = new PixmapLabel(center); imageRestore_firstPage->setGeometry(421, 120, 300, 326); imageRestore_firstPage->setScaledContents(true); imageRestore_firstPage->setLightAndDarkPixmap(":/images/data_restore.png", ":/images/data_restore_dark.png"); // 数据还原大字提示 - MyLabel *labelRestore_firstPage = new MyLabel(first); + MyLabel *labelRestore_firstPage = new MyLabel(center); labelRestore_firstPage->setDeplayText(tr("Data Restore")); labelRestore_firstPage->setFixedWidth(500); labelRestore_firstPage->setFixedHeight(48); @@ -72,7 +89,7 @@ void DataRestore::initFirstWidget() labelRestore_firstPage->adjustSize(); // 数据还原说明 - MyLabel *labelNote_firstPage = new MyLabel(first); + MyLabel *labelNote_firstPage = new MyLabel(center); labelNote_firstPage->setFixedWidth(700); labelNote_firstPage->setFixedHeight(24); labelNote_firstPage->move(41, 180); @@ -85,35 +102,35 @@ void DataRestore::initFirstWidget() labelNote_firstPage->adjustSize(); // 快速恢复 - MyIconLabel *iconSimple_firstPage = new MyIconLabel(first); + MyIconLabel *iconSimple_firstPage = new MyIconLabel(center); iconSimple_firstPage->setGeometry(41, 244, 210, 36); iconSimple_firstPage->setThemeIcon("object-rotate-left-symbolic", ":/symbos/object-rotate-left-symbolic"); iconSimple_firstPage->setDesplayText(tr("Fast Recovery")); iconSimple_firstPage->setEnabled(false); // 安全可靠 - MyIconLabel *iconSecurity_firstPage = new MyIconLabel(first); + MyIconLabel *iconSecurity_firstPage = new MyIconLabel(center); iconSecurity_firstPage->setGeometry(231, 244, 180, 36); iconSecurity_firstPage->setThemeIcon("ukui-bf-security-symbolic", ":/symbos/ukui-bf-security-symbolic"); iconSecurity_firstPage->setDesplayText(tr("Security")); iconSecurity_firstPage->setEnabled(false); // 防止数据丢失 - MyIconLabel *iconMultiBackup_firstPage = new MyIconLabel(first); + MyIconLabel *iconMultiBackup_firstPage = new MyIconLabel(center); iconMultiBackup_firstPage->setGeometry(41, 296, 210, 36); iconMultiBackup_firstPage->setThemeIcon("ukui-bf-dataloss-symbolic", ":/symbos/ukui-bf-dataloss-symbolic"); iconMultiBackup_firstPage->setDesplayText(tr("Protect Data")); iconMultiBackup_firstPage->setEnabled(false); // 自主操作 - MyIconLabel *iconSmallSize_firstPage = new MyIconLabel(first); + MyIconLabel *iconSmallSize_firstPage = new MyIconLabel(center); iconSmallSize_firstPage->setGeometry(231, 296, 180, 36); iconSmallSize_firstPage->setThemeIcon("ukui-self-help-symbolic", ":/symbos/ukui-self-help-symbolic"); iconSmallSize_firstPage->setDesplayText(tr("Independent")); iconSmallSize_firstPage->setEnabled(false); // 开始还原按钮 - MyPushButton *beginRestore = new MyPushButton(first); + MyPushButton *beginRestore = new MyPushButton(center); beginRestore->setGeometry(41, 372, 180, 52); beginRestore->setText(tr("Start Restore")); beginRestore->setEnabled(true); @@ -400,6 +417,7 @@ void DataRestore::initSecondWidget() recheck->setVisible(false); this->on_checkEnv_start(); + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); }); // 检测结果 @@ -451,6 +469,38 @@ void DataRestore::initSecondWidget() } preStep->setVisible(true); + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); + }); + + // 调整中部控件大小 + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=](){ + // 控件bigTitle的宽度 + int len_title = 0; + if (bigTitle->isVisible()) { + QFontMetrics fontMetrics(bigTitle->font()); + len_title = fontMetrics.width(bigTitle->getOriginalText()); + len_title += LEN_TITLE_PRE; + } + // 控件labelCheck1的宽度 + int len_labelCheck1 = 0; + if (labelCheck1->isVisible()) { + QFontMetrics fontMetrics(labelCheck1->font()); + len_labelCheck1 = fontMetrics.width(labelCheck1->getOriginalText()); + len_labelCheck1 += LEN_DOT_PRE; + } + // 控件labelCheck2的宽度 + int len_labelCheck2 = 0; + if (labelCheck2->isVisible()) { + QFontMetrics fontMetrics(labelCheck2->font()); + len_labelCheck2 = fontMetrics.width(labelCheck2->getOriginalText()); + len_labelCheck2 += LEN_DOT_PRE; + } + int len_max = len_title > len_labelCheck1 ? len_title : len_labelCheck1; + len_max = len_max > len_labelCheck2 ? len_max : len_labelCheck2; + if (len_max >= this->width()) + len_max = this->width(); + + centerFont->setFixedWidth(len_max); }); // 重新检查 @@ -968,6 +1018,38 @@ void DataRestore::initLastWidget() reboot->setVisible(false); hlayoutCenterFont1->setAlignment(Qt::AlignLeft); } + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); + }); + + // 调整中部控件大小 + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=](){ + // 控件bigTitle的宽度 + int len_title = 0; + if (bigTitle->isVisible()) { + QFontMetrics fontMetrics(bigTitle->font()); + len_title = fontMetrics.width(bigTitle->getOriginalText()); + len_title += LEN_TITLE_PRE; + } + // 控件labelError1的宽度 + int len_labelError1 = 0; + if (labelError1->isVisible()) { + QFontMetrics fontMetrics(labelError1->font()); + len_labelError1 = fontMetrics.width(labelError1->getOriginalText()); + len_labelError1 += LEN_DOT_PRE; + } + // 控件labelError2的宽度 + int len_labelError2 = 0; + if (labelError2->isVisible()) { + QFontMetrics fontMetrics(labelError2->font()); + len_labelError2 = fontMetrics.width(labelError2->getOriginalText()); + len_labelError2 += LEN_DOT_PRE; + } + int len_max = len_title > len_labelError1 ? len_title : len_labelError1; + len_max = len_max > len_labelError2 ? len_max : len_labelError2; + if (len_max >= this->width()) + len_max = this->width(); + + centerFont->setFixedWidth(len_max); }); // 再试一次 diff --git a/kybackup/module/ghostimage.cpp b/kybackup/module/ghostimage.cpp index e2a78b0..0ce624d 100755 --- a/kybackup/module/ghostimage.cpp +++ b/kybackup/module/ghostimage.cpp @@ -26,6 +26,10 @@ #include "kborderbutton.h" using namespace kdk; +// bigTitle控件前面的宽度:24+spacing +#define LEN_TITLE_PRE 50 +// labelCheck1、labelCheck2控件前面的宽度:10+6+5 +#define LEN_DOT_PRE 50 GhostImage::GhostImage(QWidget *parent) : QStackedWidget(parent), @@ -59,15 +63,28 @@ GhostImage::~GhostImage() void GhostImage::initFirstWidget() { QWidget *first = new QWidget; + QVBoxLayout *vLayout = new QVBoxLayout; + vLayout->addStretch(); + // 中部布局包含一个独立的窗口,用于大小变化时局部相对不变 + QWidget *center = new QWidget; + center->setFixedSize(760, 540); + QHBoxLayout *centerHBoxLayout = new QHBoxLayout; + centerHBoxLayout->addStretch(); + centerHBoxLayout->addWidget(center); + centerHBoxLayout->addStretch(); + vLayout->addLayout(centerHBoxLayout); + vLayout->addStretch(); + vLayout->addSpacing(60); + first->setLayout(vLayout); // 图片 - PixmapLabel *imageGhost_firstPage = new PixmapLabel(first); + PixmapLabel *imageGhost_firstPage = new PixmapLabel(center); imageGhost_firstPage->setGeometry(421, 120, 300, 326); imageGhost_firstPage->setScaledContents(true); imageGhost_firstPage->setLightAndDarkPixmap(":/images/ghost_image.png", ":/images/ghost_image_dark.png"); // Ghost Image大字提示 - MyLabel *labelGhost_firstPage = new MyLabel(first); + MyLabel *labelGhost_firstPage = new MyLabel(center); labelGhost_firstPage->setDeplayText(tr("Ghost Image")); labelGhost_firstPage->setFixedWidth(500); labelGhost_firstPage->setFixedHeight(48); @@ -84,7 +101,7 @@ void GhostImage::initFirstWidget() labelGhost_firstPage->adjustSize(); // Ghost说明 - MyLabel *labelNote_firstPage = new MyLabel(first); + MyLabel *labelNote_firstPage = new MyLabel(center); labelNote_firstPage->setFixedWidth(700); labelNote_firstPage->setFixedHeight(24); labelNote_firstPage->move(41, 180); @@ -97,35 +114,35 @@ void GhostImage::initFirstWidget() labelNote_firstPage->adjustSize(); // 操作简单 - MyIconLabel *iconSimple_firstPage = new MyIconLabel(first); + MyIconLabel *iconSimple_firstPage = new MyIconLabel(center); iconSimple_firstPage->setGeometry(41, 244, 180, 36); iconSimple_firstPage->setThemeIcon("ukui-bf-simple-symbolic", ":/symbos/ukui-bf-simple-symbolic"); iconSimple_firstPage->setDesplayText(tr("Simple")); iconSimple_firstPage->setEnabled(false); // 快速 - MyIconLabel *iconFast_firstPage = new MyIconLabel(first); + MyIconLabel *iconFast_firstPage = new MyIconLabel(center); iconFast_firstPage->setGeometry(206, 244, 180, 36); iconFast_firstPage->setThemeIcon("ukui-bf-fast-symbolic", ":/symbos/ukui-bf-fast-symbolic"); iconFast_firstPage->setDesplayText(tr("Fast")); iconFast_firstPage->setEnabled(false); // 安全 - MyIconLabel *iconSecurity_firstPage = new MyIconLabel(first); + MyIconLabel *iconSecurity_firstPage = new MyIconLabel(center); iconSecurity_firstPage->setGeometry(41, 296, 180, 36); iconSecurity_firstPage->setThemeIcon("ukui-bf-security-symbolic", ":/symbos/ukui-bf-security-symbolic"); iconSecurity_firstPage->setDesplayText(tr("Security")); iconSecurity_firstPage->setEnabled(false); // 节省时间 - MyIconLabel *iconSimple_firstPage1 = new MyIconLabel(first); + MyIconLabel *iconSimple_firstPage1 = new MyIconLabel(center); iconSimple_firstPage1->setGeometry(206, 296, 180, 36); iconSimple_firstPage1->setThemeIcon("document-open-recent-symbolic", ":/symbos/document-open-recent-symbolic"); iconSimple_firstPage1->setDesplayText(tr("Timesaving")); iconSimple_firstPage1->setEnabled(false); // 制作镜像按钮 - MyPushButton *beginBackup = new MyPushButton(first); + MyPushButton *beginBackup = new MyPushButton(center); beginBackup->setGeometry(41, 372, 180, 52); beginBackup->setText(tr("Start Ghost")); beginBackup->setEnabled(true); @@ -462,6 +479,7 @@ void GhostImage::initThirdWidget() recheck->setVisible(false); this->on_checkEnv_start(); + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); }); // 检测结果 @@ -513,6 +531,38 @@ void GhostImage::initThirdWidget() } preStep->setVisible(true); + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); + }); + + // 调整中部控件大小 + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=](){ + // 控件bigTitle的宽度 + int len_title = 0; + if (bigTitle->isVisible()) { + QFontMetrics fontMetrics(bigTitle->font()); + len_title = fontMetrics.width(bigTitle->getOriginalText()); + len_title += LEN_TITLE_PRE; + } + // 控件labelError1的宽度 + int len_labelError1 = 0; + if (labelCheck1->isVisible()) { + QFontMetrics fontMetrics(labelCheck1->font()); + len_labelError1 = fontMetrics.width(labelCheck1->getOriginalText()); + len_labelError1 += LEN_DOT_PRE; + } + // 控件labelError2的宽度 + int len_labelError2 = 0; + if (labelCheck2->isVisible()) { + QFontMetrics fontMetrics(labelCheck2->font()); + len_labelError2 = fontMetrics.width(labelCheck2->getOriginalText()); + len_labelError2 += LEN_DOT_PRE; + } + int len_max = len_title > len_labelError1 ? len_title : len_labelError1; + len_max = len_max > len_labelError2 ? len_max : len_labelError2; + if (len_max >= this->width()) + len_max = this->width(); + + centerFont->setFixedWidth(len_max); }); // 重新检查 @@ -1169,6 +1219,38 @@ void GhostImage::initLastWidget() retry->setVisible(true); homePage->setVisible(true); } + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); + }); + + // 调整中部控件大小 + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=](){ + // 控件bigTitle的宽度 + int len_title = 0; + if (bigTitle->isVisible()) { + QFontMetrics fontMetrics(bigTitle->font()); + len_title = fontMetrics.width(bigTitle->getOriginalText()); + len_title += LEN_TITLE_PRE; + } + // 控件labelError1的宽度 + int len_labelError1 = 0; + if (labelError1->isVisible()) { + QFontMetrics fontMetrics(labelError1->font()); + len_labelError1 = fontMetrics.width(labelError1->getOriginalText()); + len_labelError1 += LEN_DOT_PRE; + } + // 控件labelError2的宽度 + int len_labelError2 = 0; + if (labelError2->isVisible()) { + QFontMetrics fontMetrics(labelError2->font()); + len_labelError2 = fontMetrics.width(labelError2->getOriginalText()); + len_labelError2 += LEN_DOT_PRE; + } + int len_max = len_title > len_labelError1 ? len_title : len_labelError1; + len_max = len_max > len_labelError2 ? len_max : len_labelError2; + if (len_max >= this->width()) + len_max = this->width(); + + centerFont->setFixedWidth(len_max); }); // 再试一次 diff --git a/kybackup/module/systembackup.cpp b/kybackup/module/systembackup.cpp index e9f3e17..0f7718b 100755 --- a/kybackup/module/systembackup.cpp +++ b/kybackup/module/systembackup.cpp @@ -28,6 +28,10 @@ #include "kborderbutton.h" using namespace kdk; +// bigTitle控件前面的宽度:24+spacing +#define LEN_TITLE_PRE 50 +// labelCheck1、labelCheck2控件前面的宽度:10+6+5 +#define LEN_DOT_PRE 50 SystemBackup::SystemBackup(QWidget *parent /*= nullptr*/) : QStackedWidget(parent), @@ -61,15 +65,25 @@ SystemBackup::~SystemBackup() void SystemBackup::initFirstWidget() { QWidget *first = new QWidget; + QVBoxLayout *vLayout = new QVBoxLayout; + vLayout->addStretch(); + // 中部布局包含一个独立的窗口,用于大小变化时局部相对不变 + QWidget *center = new QWidget; + center->setFixedSize(760, 540); + QHBoxLayout *centerHBoxLayout = new QHBoxLayout; + centerHBoxLayout->addStretch(); + centerHBoxLayout->addWidget(center); + centerHBoxLayout->addStretch(); + vLayout->addLayout(centerHBoxLayout); // 图片 - PixmapLabel *imageBackup_firstPage = new PixmapLabel(first); + PixmapLabel *imageBackup_firstPage = new PixmapLabel(center); imageBackup_firstPage->setGeometry(421, 120, 300, 326); imageBackup_firstPage->setScaledContents(true); imageBackup_firstPage->setLightAndDarkPixmap(":/images/system_backup.png", ":/images/system_backup_dark.png"); // 系统备份大字提示 - MyLabel *labelBackup_firstPage = new MyLabel(first); + MyLabel *labelBackup_firstPage = new MyLabel(center); labelBackup_firstPage->setDeplayText(tr("System Backup")); labelBackup_firstPage->setFixedWidth(500); labelBackup_firstPage->setFixedHeight(48); @@ -86,7 +100,7 @@ void SystemBackup::initFirstWidget() labelBackup_firstPage->adjustSize(); // 系统备份说明 - MyLabel *labelNote_firstPage = new MyLabel(first); + MyLabel *labelNote_firstPage = new MyLabel(center); labelNote_firstPage->setFixedWidth(700); labelNote_firstPage->setFixedHeight(24); labelNote_firstPage->move(41, 180); @@ -98,35 +112,35 @@ void SystemBackup::initFirstWidget() labelNote_firstPage->adjustSize(); // 多点还原 - MyIconLabel *iconMultiBackup_firstPage = new MyIconLabel(first); + MyIconLabel *iconMultiBackup_firstPage = new MyIconLabel(center); iconMultiBackup_firstPage->setGeometry(41, 244, 180, 36); iconMultiBackup_firstPage->setThemeIcon("ukui-multipoint-symbolic", ":/symbos/ukui-multipoint-symbolic"); iconMultiBackup_firstPage->setDesplayText(tr("Multi-Spot")); iconMultiBackup_firstPage->setEnabled(false); // 体积小 - MyIconLabel *iconSmallSize_firstPage = new MyIconLabel(first); + MyIconLabel *iconSmallSize_firstPage = new MyIconLabel(center); iconSmallSize_firstPage->setGeometry(201, 244, 180, 36); iconSmallSize_firstPage->setThemeIcon("ukui-volume-symbolic", ":/symbos/ukui-volume-symbolic"); iconSmallSize_firstPage->setDesplayText(tr("Small Size")); iconSmallSize_firstPage->setEnabled(false); // 安全 - MyIconLabel *iconSecurity_firstPage = new MyIconLabel(first); + MyIconLabel *iconSecurity_firstPage = new MyIconLabel(center); iconSecurity_firstPage->setGeometry(41, 296, 180, 36); iconSecurity_firstPage->setThemeIcon("ukui-bf-security-symbolic", ":/symbos/ukui-bf-security-symbolic"); iconSecurity_firstPage->setDesplayText(tr("Security")); iconSecurity_firstPage->setEnabled(false); // 操作简单 - MyIconLabel *iconSimple_firstPage = new MyIconLabel(first); + MyIconLabel *iconSimple_firstPage = new MyIconLabel(center); iconSimple_firstPage->setGeometry(201, 296, 180, 36); iconSimple_firstPage->setThemeIcon("ukui-bf-simple-symbolic", ":/symbos/ukui-bf-simple-symbolic"); iconSimple_firstPage->setDesplayText(tr("Simple")); iconSimple_firstPage->setEnabled(false); // 开始备份按钮 - MyPushButton *beginBackup = new MyPushButton(first); + MyPushButton *beginBackup = new MyPushButton(center); beginBackup->setGeometry(41, 372, 180, 52); beginBackup->setText(tr("Start Backup")); beginBackup->setEnabled(true); @@ -156,11 +170,10 @@ void SystemBackup::initFirstWidget() bottomHBoxLayout->addSpacing(20); bottomHBoxLayout->setAlignment(Qt::AlignRight); - QVBoxLayout *bottomVBoxLayout = new QVBoxLayout; - bottomVBoxLayout->addStretch(); - bottomVBoxLayout->addLayout(bottomHBoxLayout); - bottomVBoxLayout->addSpacing(20); - first->setLayout(bottomVBoxLayout); + vLayout->addStretch(); + vLayout->addLayout(bottomHBoxLayout); + vLayout->addSpacing(20); + first->setLayout(vLayout); connect(backupPointManage, &MyPushButton::clicked, this, [=]() { ManageBackupPointList backupManager(first, ManageBackupPointList::SYSTEM); @@ -595,6 +608,7 @@ void SystemBackup::initThirdWidget() recheck->setVisible(false); this->on_checkEnv_start(); + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); }); // 检测结果 @@ -646,6 +660,38 @@ void SystemBackup::initThirdWidget() } preStep->setVisible(true); + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); + }); + + // 调整中部控件大小 + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=](){ + // 控件bigTitle的宽度 + int len_title = 0; + if (bigTitle->isVisible()) { + QFontMetrics fontMetrics(bigTitle->font()); + len_title = fontMetrics.width(bigTitle->getOriginalText()); + len_title += LEN_TITLE_PRE; + } + // 控件labelCheck1的宽度 + int len_labelCheck1 = 0; + if (labelCheck1->isVisible()) { + QFontMetrics fontMetrics(labelCheck1->font()); + len_labelCheck1 = fontMetrics.width(labelCheck1->getOriginalText()); + len_labelCheck1 += LEN_DOT_PRE; + } + // 控件labelCheck2的宽度 + int len_labelCheck2 = 0; + if (labelCheck2->isVisible()) { + QFontMetrics fontMetrics(labelCheck2->font()); + len_labelCheck2 = fontMetrics.width(labelCheck2->getOriginalText()); + len_labelCheck2 += LEN_DOT_PRE; + } + int len_max = len_title > len_labelCheck1 ? len_title : len_labelCheck1; + len_max = len_max > len_labelCheck2 ? len_max : len_labelCheck2; + if (len_max >= this->width()) + len_max = this->width(); + + centerFont->setFixedWidth(len_max); }); addWidget(third); @@ -815,9 +861,10 @@ void SystemBackup::initForthWidget() QHBoxLayout *hlayoutCenterLine1 = new QHBoxLayout; // 备份名称 MyLabel *labelBackupName = new MyLabel(forth); - labelBackupName->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - labelBackupName->setAlignment(Qt::AlignRight | Qt::AlignHCenter); labelBackupName->setDeplayText(tr("Backup Name")); + QFontMetrics fontMetrics(labelBackupName->font()); + int fontSize = fontMetrics.width(labelBackupName->getOriginalText()); + labelBackupName->setFixedWidth(fontSize); MyLineEdit *editBackupName = new MyLineEdit(forth); editBackupName->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); editBackupName->setMinimumWidth(350); @@ -833,7 +880,6 @@ void SystemBackup::initForthWidget() hlayoutCenterLine1->addStretch(); hlayoutCenterLine1->addWidget(labelBackupName); hlayoutCenterLine1->addWidget(editBackupName); - hlayoutCenterLine1->addSpacing(40); hlayoutCenterLine1->addStretch(); hlayoutCenterLine1->setAlignment(Qt::AlignCenter); vlayout->addLayout(hlayoutCenterLine1); @@ -846,6 +892,15 @@ void SystemBackup::initForthWidget() labelError->setVisible(false); labelError->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=]{ + QFontMetrics fontMetrics(labelBackupName->font()); + int fontSize = fontMetrics.width(labelBackupName->getOriginalText()); + labelBackupName->setFixedWidth(fontSize); + + if (labelError->isVisible()) + labelError->move(editBackupName->geometry().left(), editBackupName->geometry().bottom() + 10); + }); + connect(validator, &InputValidator::checked, this, [=](bool valid, QString in, int pos, QChar c) { if (in.isEmpty()) return; @@ -909,9 +964,9 @@ void SystemBackup::initForthWidget() nextStep->setProperty("isImportant", true); connect(nextStep, &MyPushButton::clicked, this, [=](bool checked) { Q_UNUSED(checked) - if (labelError->isVisible()) { + /*if (labelError->isVisible()) { editBackupName->setFocus(); - } else { + } else*/ { this->m_backupName = editBackupName->text(); if (this->m_backupName.isEmpty()) { this->m_backupName = editBackupName->placeholderText(); @@ -1422,7 +1477,6 @@ void SystemBackup::initLastWidget() bigTitle->setIsOriginal(true); bigTitle->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); hlayoutCenterFont1->addWidget(bigTitle); - // hlayoutCenterFont1->setAlignment(Qt::AlignLeft); vlayoutCenterFont->addLayout(hlayoutCenterFont1); // 第二行 @@ -1499,9 +1553,6 @@ void SystemBackup::initLastWidget() resultLogo->setVisible(true); // 备份成功 bigTitle->setDeplayText(tr("The backup is successful")); - QFontMetrics fontMetrics(bigTitle->font()); - int fontSize = fontMetrics.width(bigTitle->getOriginalText()); - bigTitle->setFixedWidth(fontSize); hlayoutCenterFont1->setAlignment(Qt::AlignCenter); dot1->setVisible(false); @@ -1528,6 +1579,39 @@ void SystemBackup::initLastWidget() homePage->setVisible(true); } + + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); + }); + + // 调整中部控件大小 + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=](){ + // 控件bigTitle的宽度 + int len_title = 0; + if (bigTitle->isVisible()) { + QFontMetrics fontMetrics(bigTitle->font()); + len_title = fontMetrics.width(bigTitle->getOriginalText()); + len_title += LEN_TITLE_PRE; + } + // 控件labelError1的宽度 + int len_labelError1 = 0; + if (labelError1->isVisible()) { + QFontMetrics fontMetrics(labelError1->font()); + len_labelError1 = fontMetrics.width(labelError1->getOriginalText()); + len_labelError1 += LEN_DOT_PRE; + } + // 控件labelError2的宽度 + int len_labelError2 = 0; + if (labelError2->isVisible()) { + QFontMetrics fontMetrics(labelError2->font()); + len_labelError2 = fontMetrics.width(labelError2->getOriginalText()); + len_labelError2 += LEN_DOT_PRE; + } + int len_max = len_title > len_labelError1 ? len_title : len_labelError1; + len_max = len_max > len_labelError2 ? len_max : len_labelError2; + if (len_max >= this->width()) + len_max = this->width(); + + centerFont->setFixedWidth(len_max); }); // 再试一次 diff --git a/kybackup/module/systemrestore.cpp b/kybackup/module/systemrestore.cpp index 4c2dd84..9c7891b 100755 --- a/kybackup/module/systemrestore.cpp +++ b/kybackup/module/systemrestore.cpp @@ -25,6 +25,10 @@ #include "kborderbutton.h" using namespace kdk; +// bigTitle控件前面的宽度:24+spacing +#define LEN_TITLE_PRE 50 +// labelCheck1、labelCheck2控件前面的宽度:10+6+5 +#define LEN_DOT_PRE 50 SystemRestore::SystemRestore(QWidget *parent) : QStackedWidget(parent) @@ -53,15 +57,25 @@ SystemRestore::~SystemRestore() void SystemRestore::initFirstWidget() { QWidget *first = new QWidget; + QVBoxLayout *vLayout = new QVBoxLayout; + vLayout->addStretch(); + // 中部布局包含一个独立的窗口,用于大小变化时局部相对不变 + QWidget *center = new QWidget; + center->setFixedSize(760, 540); + QHBoxLayout *centerHBoxLayout = new QHBoxLayout; + centerHBoxLayout->addStretch(); + centerHBoxLayout->addWidget(center); + centerHBoxLayout->addStretch(); + vLayout->addLayout(centerHBoxLayout); // 图片 - PixmapLabel *imageRestore_firstPage = new PixmapLabel(first); + PixmapLabel *imageRestore_firstPage = new PixmapLabel(center); imageRestore_firstPage->setGeometry(421, 120, 300, 326); imageRestore_firstPage->setScaledContents(true); imageRestore_firstPage->setLightAndDarkPixmap(":/images/system_restore.png", ":/images/system_restore_dark.png"); // 系统还原大字提示 - MyLabel *labelRestore_firstPage = new MyLabel(first); + MyLabel *labelRestore_firstPage = new MyLabel(center); labelRestore_firstPage->setDeplayText(tr("System Restore")); labelRestore_firstPage->setFixedWidth(500); labelRestore_firstPage->setFixedHeight(48); @@ -75,7 +89,7 @@ void SystemRestore::initFirstWidget() labelRestore_firstPage->adjustSize(); // 系统还原说明 - MyLabel *labelNote_firstPage = new MyLabel(first); + MyLabel *labelNote_firstPage = new MyLabel(center); labelNote_firstPage->setFixedWidth(700); labelNote_firstPage->setFixedHeight(24); labelNote_firstPage->move(41, 180); @@ -88,35 +102,35 @@ void SystemRestore::initFirstWidget() labelNote_firstPage->adjustSize(); // 操作简单 - MyIconLabel *iconSimple_firstPage = new MyIconLabel(first); + MyIconLabel *iconSimple_firstPage = new MyIconLabel(center); iconSimple_firstPage->setGeometry(41, 244, 210, 36); iconSimple_firstPage->setThemeIcon("ukui-bf-simple-symbolic", ":/symbos/ukui-bf-simple-symbolic"); iconSimple_firstPage->setDesplayText(tr("Simple")); iconSimple_firstPage->setEnabled(false); // 安全可靠 - MyIconLabel *iconSecurity_firstPage = new MyIconLabel(first); + MyIconLabel *iconSecurity_firstPage = new MyIconLabel(center); iconSecurity_firstPage->setGeometry(231, 244, 180, 36); iconSecurity_firstPage->setThemeIcon("ukui-bf-security-symbolic", ":/symbos/ukui-bf-security-symbolic"); iconSecurity_firstPage->setDesplayText(tr("Security")); iconSecurity_firstPage->setEnabled(false); // 修复系统损坏 - MyIconLabel *iconMultiBackup_firstPage = new MyIconLabel(first); + MyIconLabel *iconMultiBackup_firstPage = new MyIconLabel(center); iconMultiBackup_firstPage->setGeometry(41, 296, 210, 36); iconMultiBackup_firstPage->setThemeIcon("ukui-bf-damage-symbolic", ":/symbos/ukui-bf-damage-symbolic"); iconMultiBackup_firstPage->setDesplayText(tr("Repair")); iconMultiBackup_firstPage->setEnabled(false); // 自主操作 - MyIconLabel *iconSmallSize_firstPage = new MyIconLabel(first); + MyIconLabel *iconSmallSize_firstPage = new MyIconLabel(center); iconSmallSize_firstPage->setGeometry(231, 296, 180, 36); iconSmallSize_firstPage->setThemeIcon("ukui-self-help-symbolic", ":/symbos/ukui-self-help-symbolic"); iconSmallSize_firstPage->setDesplayText(tr("Independent")); iconSmallSize_firstPage->setEnabled(false); // 开始还原按钮 - MyPushButton *beginRestore = new MyPushButton(first); + MyPushButton *beginRestore = new MyPushButton(center); beginRestore->setGeometry(41, 372, 180, 52); beginRestore->setText(tr("Start Restore")); beginRestore->setEnabled(true); @@ -141,11 +155,10 @@ void SystemRestore::initFirstWidget() bottomHBoxLayout->addSpacing(40); bottomHBoxLayout->setAlignment(Qt::AlignRight); - QVBoxLayout *bottomVBoxLayout = new QVBoxLayout; - bottomVBoxLayout->addStretch(); - bottomVBoxLayout->addLayout(bottomHBoxLayout); - bottomVBoxLayout->addSpacing(20); - first->setLayout(bottomVBoxLayout); + vLayout->addStretch(); + vLayout->addLayout(bottomHBoxLayout); + vLayout->addSpacing(20); + first->setLayout(vLayout); connect(checkFactoryRestore, &MyCheckBox::stateChanged, this, [=](int state) { this->m_isFactoryRestore = Qt::Unchecked == state ? false : true; @@ -421,6 +434,7 @@ void SystemRestore::initSecondWidget() recheck->setVisible(false); this->on_checkEnv_start(); + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); }); // 检测结果 @@ -472,6 +486,38 @@ void SystemRestore::initSecondWidget() } preStep->setVisible(true); + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); + }); + + // 调整中部控件大小 + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=](){ + // 控件bigTitle的宽度 + int len_title = 0; + if (bigTitle->isVisible()) { + QFontMetrics fontMetrics(bigTitle->font()); + len_title = fontMetrics.width(bigTitle->getOriginalText()); + len_title += LEN_TITLE_PRE; + } + // 控件labelError1的宽度 + int len_labelError1 = 0; + if (labelCheck1->isVisible()) { + QFontMetrics fontMetrics(labelCheck1->font()); + len_labelError1 = fontMetrics.width(labelCheck1->getOriginalText()); + len_labelError1 += LEN_DOT_PRE; + } + // 控件labelError2的宽度 + int len_labelError2 = 0; + if (labelCheck2->isVisible()) { + QFontMetrics fontMetrics(labelCheck2->font()); + len_labelError2 = fontMetrics.width(labelCheck2->getOriginalText()); + len_labelError2 += LEN_DOT_PRE; + } + int len_max = len_title > len_labelError1 ? len_title : len_labelError1; + len_max = len_max > len_labelError2 ? len_max : len_labelError2; + if (len_max >= this->width()) + len_max = this->width(); + + centerFont->setFixedWidth(len_max); }); // 重新检查 @@ -977,6 +1023,38 @@ void SystemRestore::initLastWidget() retry->setVisible(true); homePage->setVisible(true); } + emit GlobelBackupInfo::inst().getGlobalSignals()->widthChanged(); + }); + + // 调整中部控件大小 + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::widthChanged, this, [=](){ + // 控件bigTitle的宽度 + int len_title = 0; + if (bigTitle->isVisible()) { + QFontMetrics fontMetrics(bigTitle->font()); + len_title = fontMetrics.width(bigTitle->getOriginalText()); + len_title += LEN_TITLE_PRE; + } + // 控件labelError1的宽度 + int len_labelError1 = 0; + if (labelError1->isVisible()) { + QFontMetrics fontMetrics(labelError1->font()); + len_labelError1 = fontMetrics.width(labelError1->getOriginalText()); + len_labelError1 += LEN_DOT_PRE; + } + // 控件labelError2的宽度 + int len_labelError2 = 0; + if (labelError2->isVisible()) { + QFontMetrics fontMetrics(labelError2->font()); + len_labelError2 = fontMetrics.width(labelError2->getOriginalText()); + len_labelError2 += LEN_DOT_PRE; + } + int len_max = len_title > len_labelError1 ? len_title : len_labelError1; + len_max = len_max > len_labelError2 ? len_max : len_labelError2; + if (len_max >= this->width()) + len_max = this->width(); + + centerFont->setFixedWidth(len_max); }); // 再试一次