调完开机登录和密码管理界面
This commit is contained in:
+19
-48
@@ -6,7 +6,6 @@
|
||||
#include <QLineEdit>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QTimer>
|
||||
#include "global.h"
|
||||
|
||||
BootPasswordPage::BootPasswordPage(AppContext* ctx, QWidget* parent)
|
||||
@@ -21,7 +20,7 @@ BootPasswordPage::BootPasswordPage(AppContext* ctx, QWidget* parent)
|
||||
col->setProperty("card", true); // 登录主体框体背景(面板色 + 圆角边框)
|
||||
QVBoxLayout* lay = new QVBoxLayout(col);
|
||||
lay->setContentsMargins(40, 40, 40, 40); // 框体内边距
|
||||
lay->setSpacing(50);
|
||||
lay->setSpacing(30);
|
||||
lay->setAlignment(Qt::AlignHCenter);
|
||||
|
||||
|
||||
@@ -40,15 +39,15 @@ BootPasswordPage::BootPasswordPage(AppContext* ctx, QWidget* parent)
|
||||
m_input->setStyleSheet("font-size:80px");
|
||||
m_input->setProperty("clickable", true);
|
||||
lay->addWidget(m_input, 0, Qt::AlignHCenter);
|
||||
lay->addSpacing(40);
|
||||
//lay->addSpacing(20);
|
||||
m_input->installEventFilter(this);
|
||||
m_input->setFocusPolicy(Qt::StrongFocus);
|
||||
|
||||
// 错误提示(默认隐藏)
|
||||
m_error = label("密码输入有误,请重新输入", 80, C::DANGER, true, col);
|
||||
// 错误提示(预留固定高度,出现/消失不影响下方按钮位置)
|
||||
m_error = new QLabel(col);
|
||||
m_error->setAlignment(Qt::AlignCenter);
|
||||
m_error->setStyleSheet("font-size:80px");
|
||||
m_error->hide();
|
||||
//m_error->setFixedHeight(30);
|
||||
m_error->setStyleSheet("color:#E5484D;font-size:40px;font-weight:700;");
|
||||
lay->addWidget(m_error);
|
||||
|
||||
// 确认 / 取消
|
||||
@@ -61,33 +60,22 @@ BootPasswordPage::BootPasswordPage(AppContext* ctx, QWidget* parent)
|
||||
connect(ok, &QPushButton::clicked, this, &BootPasswordPage::onConfirm);
|
||||
QPushButton* cancel = button("取消", "", col);
|
||||
cancel->setFixedSize(160, 140);
|
||||
// 取消语义:选中时红底白字(内联 :focus,确保覆盖全局蓝色选中态)
|
||||
cancel->setStyleSheet("font-size:60px;QPushButton:focus{background-color:#E5484D;color:#FFFFFF;border:2px solid #FFA6A9;}");
|
||||
cancel->setStyleSheet(cancelButtonStyle(60)); // 选中时红底白字
|
||||
connect(cancel, &QPushButton::clicked, this, &BootPasswordPage::onCancel);
|
||||
btnRow->addWidget(ok);
|
||||
btnRow->addWidget(cancel);
|
||||
btnRow->addStretch(1);
|
||||
lay->addLayout(btnRow);
|
||||
|
||||
// 忘记密码 / 修改密码(平时红字透明底,按下红底白字)
|
||||
// 密码管理入口(平时红字透明底,按下红底白字)
|
||||
const QString linkBtnStyle =
|
||||
"QPushButton{color:#E5484D;background:transparent;border:1px solid transparent;border-radius:6px;font-size:30px;}"
|
||||
"QPushButton{color:#E5484D;background:transparent;border:1px solid transparent;border-radius:6px;font-size:40px;}"
|
||||
"QPushButton:hover,QPushButton:pressed,QPushButton:focus{background-color:#E5484D;color:#FFFFFF;border:1px solid #FFA6A9;}";
|
||||
QHBoxLayout* forgetRow = new QHBoxLayout();
|
||||
forgetRow->setSpacing(80);
|
||||
forgetRow->addStretch(1);
|
||||
QPushButton* forget = button("忘记密码", "", col);
|
||||
forget->setFixedSize(130, 60);
|
||||
forget->setStyleSheet(linkBtnStyle);
|
||||
connect(forget, &QPushButton::clicked, this, &BootPasswordPage::onForget);
|
||||
QPushButton* modify = button("修改密码", "", col);
|
||||
modify->setFixedSize(130, 60);
|
||||
modify->setStyleSheet(linkBtnStyle);
|
||||
connect(modify, &QPushButton::clicked, this, &BootPasswordPage::onForget);
|
||||
forgetRow->addWidget(forget);
|
||||
forgetRow->addWidget(modify);
|
||||
forgetRow->addStretch(1);
|
||||
lay->addLayout(forgetRow);
|
||||
QPushButton* mgmt = button("密码管理", "", col);
|
||||
mgmt->setFixedSize(170, 60);
|
||||
mgmt->setStyleSheet(linkBtnStyle);
|
||||
connect(mgmt, &QPushButton::clicked, this, &BootPasswordPage::onMgmt);
|
||||
lay->addWidget(mgmt, 0, Qt::AlignHCenter);
|
||||
|
||||
root->addWidget(col, 0, Qt::AlignHCenter);
|
||||
root->addStretch(1);
|
||||
@@ -116,43 +104,24 @@ bool BootPasswordPage::eventFilter(QObject* obj, QEvent* ev)
|
||||
|
||||
void BootPasswordPage::onInputClicked()
|
||||
{
|
||||
if (m_locked)
|
||||
return;
|
||||
NumPadDialog dlg(this);
|
||||
dlg.setMaxLen(4);
|
||||
dlg.setValue(m_value);
|
||||
if (dlg.exec() == QDialog::Accepted) {
|
||||
m_value = dlg.value();
|
||||
m_error->hide();
|
||||
m_error->setText("");
|
||||
refreshInput();
|
||||
}
|
||||
}
|
||||
|
||||
void BootPasswordPage::onConfirm()
|
||||
{
|
||||
if (m_locked)
|
||||
return;
|
||||
|
||||
if (m_value == ctx()->password()) {
|
||||
m_wrongCount = 0;
|
||||
clearInput();
|
||||
emit navigate(PageSelfCheck);
|
||||
} else {
|
||||
m_wrongCount++;
|
||||
clearInput();
|
||||
if (m_wrongCount >= 5) {
|
||||
// 【设计建议】连续 5 次错误锁定 30s
|
||||
m_locked = true;
|
||||
m_error->setText("连续输入错误,已锁定 30 秒");
|
||||
m_error->show();
|
||||
QTimer::singleShot(30000, this, [this]() {
|
||||
m_locked = false;
|
||||
m_wrongCount = 0;
|
||||
m_error->hide();
|
||||
});
|
||||
} else {
|
||||
emit navigate(PageWarning);
|
||||
}
|
||||
m_error->setText("密码错误!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,15 +130,17 @@ void BootPasswordPage::onCancel()
|
||||
clearInput();
|
||||
}
|
||||
|
||||
void BootPasswordPage::onForget()
|
||||
void BootPasswordPage::onMgmt()
|
||||
{
|
||||
clearInput();
|
||||
// 密码管理:进入管理员登录界面
|
||||
emit navigate(PageMgmtLogin);
|
||||
}
|
||||
|
||||
void BootPasswordPage::clearInput()
|
||||
{
|
||||
m_value.clear();
|
||||
m_error->setText("");
|
||||
refreshInput();
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ private slots:
|
||||
void onInputClicked();
|
||||
void onConfirm();
|
||||
void onCancel();
|
||||
void onForget();
|
||||
void onMgmt();
|
||||
|
||||
private:
|
||||
void refreshInput();
|
||||
@@ -31,8 +31,6 @@ private:
|
||||
QLineEdit* m_input = nullptr;
|
||||
QLabel* m_error = nullptr;
|
||||
QString m_value;
|
||||
int m_wrongCount = 0;
|
||||
bool m_locked = false;
|
||||
};
|
||||
|
||||
#endif // BOOTPASSWORDPAGE_H
|
||||
|
||||
@@ -15,10 +15,10 @@ PasswordMgmtPage::PasswordMgmtPage(AppContext* ctx, QWidget* parent)
|
||||
QWidget* col = new QWidget(this);
|
||||
col->setFixedWidth(700);
|
||||
QVBoxLayout* lay = new QVBoxLayout(col);
|
||||
lay->setSpacing(24);
|
||||
lay->setSpacing(50);
|
||||
lay->setAlignment(Qt::AlignHCenter);
|
||||
|
||||
QLabel* title = label("密码管理界面", 28, C::TEXT, true, col);
|
||||
QLabel* title = label("密码管理界面", 60, C::TEXT, true, col);
|
||||
title->setAlignment(Qt::AlignCenter);
|
||||
lay->addWidget(title);
|
||||
|
||||
@@ -31,8 +31,8 @@ PasswordMgmtPage::PasswordMgmtPage(AppContext* ctx, QWidget* parent)
|
||||
m_reset = new QCheckBox("重置密码功能", option);
|
||||
m_reset->setChecked(true);
|
||||
m_reset->setStyleSheet(QString(
|
||||
"QCheckBox{color:%1;font-size:26px;spacing:12px;}"
|
||||
"QCheckBox::indicator{width:32px;height:32px;border:2px solid %2;border-radius:6px;background-color:%3;}"
|
||||
"QCheckBox{color:%1;font-size:40px;spacing:16px;}"
|
||||
"QCheckBox::indicator{width:40px;height:40px;border:2px solid %2;border-radius:6px;background-color:%3;}"
|
||||
"QCheckBox::indicator:checked{background-color:%4;border-color:%4;image:none;}")
|
||||
.arg(C::TEXT, C::BORDER, C::BG, C::PRIMARY));
|
||||
optLay->addWidget(m_reset);
|
||||
@@ -40,12 +40,15 @@ PasswordMgmtPage::PasswordMgmtPage(AppContext* ctx, QWidget* parent)
|
||||
|
||||
// 确认 / 退出
|
||||
QHBoxLayout* btnRow = new QHBoxLayout();
|
||||
btnRow->setSpacing(80);
|
||||
btnRow->addStretch(1);
|
||||
QPushButton* ok = button("确认", "", col);
|
||||
ok->setFixedSize(180, 72);
|
||||
ok->setFixedSize(160, 140);
|
||||
ok->setStyleSheet("font-size:60px;");
|
||||
connect(ok, &QPushButton::clicked, this, [this]() { emit navigate(PageReset); });
|
||||
QPushButton* exit = button("退出", "", col);
|
||||
exit->setFixedSize(180, 72);
|
||||
exit->setFixedSize(160, 140);
|
||||
exit->setStyleSheet(cancelButtonStyle(60)); // 选中时红底白字
|
||||
connect(exit, &QPushButton::clicked, this, [this]() { emit navigate(PageBoot); });
|
||||
btnRow->addWidget(ok);
|
||||
btnRow->addWidget(exit);
|
||||
|
||||
+19
-13
@@ -6,7 +6,6 @@
|
||||
#include <QLineEdit>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QTimer>
|
||||
#include "global.h"
|
||||
|
||||
PasswordMgmtLoginPage::PasswordMgmtLoginPage(AppContext* ctx, QWidget* parent)
|
||||
@@ -18,14 +17,14 @@ PasswordMgmtLoginPage::PasswordMgmtLoginPage(AppContext* ctx, QWidget* parent)
|
||||
QWidget* col = new QWidget(this);
|
||||
col->setFixedWidth(700);
|
||||
QVBoxLayout* lay = new QVBoxLayout(col);
|
||||
lay->setSpacing(24);
|
||||
lay->setSpacing(50);
|
||||
lay->setAlignment(Qt::AlignHCenter);
|
||||
|
||||
QLabel* title = label("密码管理登录界面", 28, C::TEXT, true, col);
|
||||
QLabel* title = label("密码管理登录界面", 60, C::TEXT, true, col);
|
||||
title->setAlignment(Qt::AlignCenter);
|
||||
lay->addWidget(title);
|
||||
|
||||
QLabel* sub = label("请输入管理员密码", 18, C::TEXT_SUB, false, col);
|
||||
QLabel* sub = label("请输入管理员密码", 40, C::TEXT_SUB, false, col);
|
||||
sub->setAlignment(Qt::AlignCenter);
|
||||
lay->addWidget(sub);
|
||||
|
||||
@@ -33,23 +32,29 @@ PasswordMgmtLoginPage::PasswordMgmtLoginPage(AppContext* ctx, QWidget* parent)
|
||||
m_input->setReadOnly(true);
|
||||
m_input->setEchoMode(QLineEdit::Password);
|
||||
m_input->setAlignment(Qt::AlignCenter);
|
||||
m_input->setFixedSize(400, 88);
|
||||
m_input->setFixedSize(400, 90);
|
||||
m_input->setStyleSheet("font-size:60px;");
|
||||
m_input->setFocusPolicy(Qt::StrongFocus);
|
||||
m_input->installEventFilter(this);
|
||||
lay->addWidget(m_input, 0, Qt::AlignHCenter);
|
||||
|
||||
m_error = label("管理员密码错误", 18, C::DANGER, true, col);
|
||||
// 错误提示(预留固定高度,出现/消失不影响下方按钮位置)
|
||||
m_error = new QLabel(col);
|
||||
m_error->setAlignment(Qt::AlignCenter);
|
||||
m_error->hide();
|
||||
m_error->setFixedHeight(56);
|
||||
m_error->setStyleSheet("color:#E5484D;font-size:40px;font-weight:700;");
|
||||
lay->addWidget(m_error);
|
||||
|
||||
QHBoxLayout* btnRow = new QHBoxLayout();
|
||||
btnRow->setSpacing(80);
|
||||
btnRow->addStretch(1);
|
||||
QPushButton* ok = button("确认", "", col);
|
||||
ok->setFixedSize(180, 72);
|
||||
ok->setFixedSize(160, 140);
|
||||
ok->setStyleSheet("font-size:60px;");
|
||||
connect(ok, &QPushButton::clicked, this, &PasswordMgmtLoginPage::onConfirm);
|
||||
QPushButton* cancel = button("取消", "", col);
|
||||
cancel->setFixedSize(180, 72);
|
||||
cancel->setFixedSize(160, 140);
|
||||
cancel->setStyleSheet(cancelButtonStyle(60)); // 选中时红底白字
|
||||
connect(cancel, &QPushButton::clicked, this, &PasswordMgmtLoginPage::onCancel);
|
||||
btnRow->addWidget(ok);
|
||||
btnRow->addWidget(cancel);
|
||||
@@ -86,7 +91,7 @@ void PasswordMgmtLoginPage::onInputClicked()
|
||||
if (dlg.exec() == QDialog::Accepted) {
|
||||
m_value = dlg.value();
|
||||
m_input->setText(m_value);
|
||||
m_error->hide();
|
||||
m_error->setText("");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,8 +101,9 @@ void PasswordMgmtLoginPage::onConfirm()
|
||||
clearInput();
|
||||
emit navigate(PageMgmt);
|
||||
} else {
|
||||
m_error->show();
|
||||
QTimer::singleShot(3000, this, [this]() { m_error->hide(); });
|
||||
m_value.clear(); // 输错后清空输入框
|
||||
m_input->setText(m_value);
|
||||
m_error->setText("管理员密码错误");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,5 +117,5 @@ void PasswordMgmtLoginPage::clearInput()
|
||||
{
|
||||
m_value.clear();
|
||||
m_input->setText(m_value);
|
||||
m_error->hide();
|
||||
m_error->setText("");
|
||||
}
|
||||
|
||||
+29
-16
@@ -19,10 +19,10 @@ PasswordResetPage::PasswordResetPage(AppContext* ctx, QWidget* parent)
|
||||
QWidget* col = new QWidget(this);
|
||||
col->setFixedWidth(700);
|
||||
QVBoxLayout* lay = new QVBoxLayout(col);
|
||||
lay->setSpacing(24);
|
||||
lay->setSpacing(50);
|
||||
lay->setAlignment(Qt::AlignHCenter);
|
||||
|
||||
QLabel* title = label("重置密码界面", 28, C::TEXT, true, col);
|
||||
QLabel* title = label("重置密码界面", 60, C::TEXT, true, col);
|
||||
title->setAlignment(Qt::AlignCenter);
|
||||
lay->addWidget(title);
|
||||
|
||||
@@ -30,26 +30,31 @@ PasswordResetPage::PasswordResetPage(AppContext* ctx, QWidget* parent)
|
||||
m_input->setReadOnly(true);
|
||||
m_input->setEchoMode(QLineEdit::Password);
|
||||
m_input->setAlignment(Qt::AlignCenter);
|
||||
m_input->setFixedSize(400, 88);
|
||||
m_input->setFixedSize(400, 90);
|
||||
m_input->setStyleSheet("font-size:60px;");
|
||||
m_input->setFocusPolicy(Qt::StrongFocus);
|
||||
m_input->installEventFilter(this);
|
||||
lay->addWidget(m_input, 0, Qt::AlignHCenter);
|
||||
|
||||
m_hint = label("请输入 4 位有效密码", 18, C::TEXT_SUB, false, col);
|
||||
m_hint = label("请输入 4 位有效密码", 50, C::TEXT_SUB, false, col);
|
||||
m_hint->setAlignment(Qt::AlignCenter);
|
||||
lay->addWidget(m_hint);
|
||||
|
||||
QHBoxLayout* btnRow = new QHBoxLayout();
|
||||
btnRow->setSpacing(80);
|
||||
btnRow->addStretch(1);
|
||||
QPushButton* ok = button("确认", "", col);
|
||||
ok->setFixedSize(160, 72);
|
||||
ok->setFixedSize(160, 140);
|
||||
ok->setStyleSheet("font-size:60px;");
|
||||
connect(ok, &QPushButton::clicked, this, &PasswordResetPage::onConfirm);
|
||||
QPushButton* cancel = button("取消", "", col);
|
||||
cancel->setFixedSize(160, 72);
|
||||
connect(cancel, &QPushButton::clicked, this, &PasswordResetPage::onCancel);
|
||||
cancel->setFixedSize(160, 140);
|
||||
cancel->setStyleSheet(cancelButtonStyle(60)); // 选中时红底白字
|
||||
connect(cancel, &QPushButton::clicked, this, &PasswordResetPage::onBack);
|
||||
QPushButton* exit = button("退出", "", col);
|
||||
exit->setFixedSize(160, 72);
|
||||
connect(exit, &QPushButton::clicked, this, &PasswordResetPage::onCancel);
|
||||
exit->setFixedSize(160, 140);
|
||||
exit->setStyleSheet(cancelButtonStyle(60)); // 选中时红底白字
|
||||
connect(exit, &QPushButton::clicked, this, &PasswordResetPage::onExit);
|
||||
btnRow->addWidget(ok);
|
||||
btnRow->addWidget(cancel);
|
||||
btnRow->addWidget(exit);
|
||||
@@ -87,7 +92,7 @@ void PasswordResetPage::onInputClicked()
|
||||
m_value = dlg.value();
|
||||
m_input->setText(m_value);
|
||||
m_hint->setText("请输入 4 位有效密码");
|
||||
m_hint->setStyleSheet(QString("color:%1;font-size:20px;").arg(C::TEXT_SUB));
|
||||
m_hint->setStyleSheet(QString("color:%1;font-size:60px;").arg(C::TEXT_SUB));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,20 +101,28 @@ void PasswordResetPage::onConfirm()
|
||||
// 校验:4 位数字
|
||||
static const QRegularExpression re("^\\d{4}$");
|
||||
if (!re.match(m_value).hasMatch()) {
|
||||
m_value.clear(); // 校验失败后清空输入框
|
||||
m_input->setText(m_value);
|
||||
m_hint->setText("密码须为 4 位数字");
|
||||
m_hint->setStyleSheet(QString("color:%1;font-size:20px;font-weight:700;").arg(C::DANGER));
|
||||
m_hint->setStyleSheet(QString("color:%1;font-size:60px;font-weight:700;").arg(C::DANGER));
|
||||
return;
|
||||
}
|
||||
ctx()->setPassword(m_value);
|
||||
clearInput();
|
||||
ConfirmDialog::toast(this, "修改成功");
|
||||
emit navigate(PageBoot);
|
||||
ConfirmDialog::toast(this, "修改成功"); // 2s 后自动消失
|
||||
emit navigate(PageBoot); // 修改完成,返回开机密码界面
|
||||
}
|
||||
|
||||
void PasswordResetPage::onCancel()
|
||||
void PasswordResetPage::onBack()
|
||||
{
|
||||
clearInput();
|
||||
emit navigate(PageBoot);
|
||||
emit navigate(PageMgmt); // 取消:返回上一界面(密码管理界面)
|
||||
}
|
||||
|
||||
void PasswordResetPage::onExit()
|
||||
{
|
||||
clearInput();
|
||||
emit navigate(PageBoot); // 退出:返回开机密码界面
|
||||
}
|
||||
|
||||
void PasswordResetPage::clearInput()
|
||||
@@ -117,5 +130,5 @@ void PasswordResetPage::clearInput()
|
||||
m_value.clear();
|
||||
m_input->setText(m_value);
|
||||
m_hint->setText("请输入 4 位有效密码");
|
||||
m_hint->setStyleSheet(QString("color:%1;font-size:20px;").arg(C::TEXT_SUB));
|
||||
m_hint->setStyleSheet(QString("color:%1;font-size:60px;").arg(C::TEXT_SUB));
|
||||
}
|
||||
|
||||
@@ -21,7 +21,8 @@ protected:
|
||||
private slots:
|
||||
void onInputClicked();
|
||||
void onConfirm();
|
||||
void onCancel();
|
||||
void onBack(); // 取消:返回上一界面(密码管理界面)
|
||||
void onExit(); // 退出:返回开机密码界面
|
||||
|
||||
private:
|
||||
QLineEdit* m_input = nullptr;
|
||||
|
||||
Reference in New Issue
Block a user