Files
fluent_widgets_pyside6/test_login1.py

402 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import sys
from PySide6.QtWidgets import (
QApplication,
QMainWindow,
QWidget,
QVBoxLayout,
QHBoxLayout,
QLabel,
QLineEdit,
QPushButton,
QMessageBox,
QFrame,
)
from PySide6.QtCore import Qt, QTimer
from PySide6.QtGui import QFont, QCursor
class LoginWindow(QMainWindow):
"""登录窗口类,优化宽高比例和布局美观度"""
def __init__(self, use_dark_theme=False):
super().__init__()
# 浅色主题样式表
self.light_style = """
QMainWindow, QWidget {
background-color: #f0f2f5;
}
QLabel#titleLabel {
font-weight: bold;
color: #1a73e8;
}
QLabel#subtitleLabel {
font-size: 16px;
color: #5f6368;
}
QLabel#normalLabel {
font-size: 14px;
color: #5f6368;
}
QLabel#linkLabel {
font-size: 14px;
color: #1a73e8;
text-decoration: underline;
background: transparent;
border: none;
}
QLabel#hintLabel {
font-size: 16px;
color: white;
background-color: #4caf50;
border-radius: 8px;
padding: 3px 16px;
min-height: 29px;
min-width: 106px;
max-width: 300px;
border: none;
text-align: center;
}
QLineEdit {
padding: 10px;
border: 1px solid #dadce0;
border-radius: 6px;
font-size: 14px;
background-color: white;
color: #202124;
}
QLineEdit:focus {
border: 2px solid #1a73e8;
outline: none;
}
QPushButton {
background-color: #1a73e8;
color: white;
padding: 10px;
border-radius: 6px;
font-size: 16px;
font-weight: 500;
}
QPushButton:hover {
background-color: #1765cc;
}
QPushButton:pressed {
background-color: #165dba;
}
QFrame#loginFrame {
background-color: white;
border-radius: 10px;
padding: 30px;
border: 1px solid #e0e0e0;
max-height: 350px;
max-width: 400px; /* 限制登录框最大宽度 */
}
"""
# 深色主题样式表
self.dark_style = """
QMainWindow, QWidget {
background-color: #1a1a1a;
}
QLabel#titleLabel {
font-weight: bold;
color: #8ab4f8;
}
QLabel#subtitleLabel {
font-size: 16px;
color: #d0d0d0;
}
QLabel#normalLabel {
font-size: 14px;
color: #d0d0d0;
}
QLabel#linkLabel {
font-size: 14px;
color: #8ab4f8;
text-decoration: underline;
background: transparent;
border: none;
}
QLabel#hintLabel {
font-size: 16px;
color: white;
background-color: #4caf50;
border-radius: 8px;
padding: 3px 16px;
min-height: 29px;
min-width: 106px;
max-width: 300px;
border: none;
text-align: center;
}
QLineEdit {
padding: 10px;
border: 1px solid #444444;
border-radius: 6px;
font-size: 14px;
background-color: #333333;
color: #e0e0e0;
}
QLineEdit:focus {
border: 2px solid #8ab4f8;
outline: none;
}
QPushButton {
background-color: #1a73e8;
color: white;
padding: 10px;
border-radius: 6px;
font-size: 16px;
font-weight: 500;
}
QPushButton:hover {
background-color: #2962ff;
}
QPushButton:pressed {
background-color: #1565c0;
}
QFrame#loginFrame {
background-color: #2d2d2d;
border-radius: 10px;
padding: 30px;
border: 1px solid #444444;
max-height: 350px;
max-width: 400px; /* 限制登录框最大宽度 */
}
"""
# 初始化主题
if use_dark_theme:
self.setStyleSheet(self.dark_style)
else:
self.setStyleSheet(self.light_style)
self.init_ui()
def init_ui(self):
# 宽高比例调整为3:2宽度减少更紧凑美观
self.setWindowTitle("密胺餐盘自动化生产控制系统")
self.resize(900, 600) # 3:2比例900/600=1.5
self.setMinimumSize(750, 500) # 最小尺寸保持3:2比例
# 创建中心部件和主布局
central_widget = QWidget()
self.setCentralWidget(central_widget)
main_layout = QVBoxLayout(central_widget)
main_layout.setContentsMargins(50, 10, 50, 50)
main_layout.setSpacing(15)
# 提示信息容器
hint_container = QWidget()
hint_container.setFixedHeight(50)
hint_layout = QHBoxLayout(hint_container)
hint_layout.setContentsMargins(0, 0, 0, 0)
hint_layout.setAlignment(Qt.AlignCenter)
self.hint_label = QLabel("密码: 123")
self.hint_label.setObjectName("hintLabel")
self.hint_label.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.hint_label.setVisible(False)
hint_layout.addWidget(self.hint_label)
main_layout.addWidget(hint_container)
# 系统标题(随窗口动态缩放)
self.title_label = QLabel("密胺餐盘自动化生产控制系统")
self.title_label.setObjectName("titleLabel")
self.title_label.setAlignment(Qt.AlignCenter)
main_layout.addWidget(self.title_label)
# 系统描述
subtitle_label = QLabel("高效、安全的自动化控制系统")
subtitle_label.setObjectName("subtitleLabel")
subtitle_label.setAlignment(Qt.AlignCenter)
subtitle_label.setFixedHeight(25)
main_layout.addWidget(subtitle_label)
main_layout.addSpacing(20)
# 登录框(宽度减少,更紧凑)
login_frame = QFrame()
login_frame.setObjectName("loginFrame")
login_layout = QVBoxLayout(login_frame)
login_layout.setSpacing(20)
login_layout.setContentsMargins(20, 20, 20, 20)
# 账号输入
self.username_input = QLineEdit()
self.username_input.setPlaceholderText("请输入账号")
self.username_input.setText("manager")
self.username_input.setMinimumWidth(250)
self.username_input.setMaximumWidth(350) # 限制输入框最大宽度
# 密码输入
self.password_input = QLineEdit()
self.password_input.setPlaceholderText("请输入密码")
self.password_input.setEchoMode(QLineEdit.Password)
self.password_input.setMinimumWidth(250)
self.password_input.setMaximumWidth(350)
# 登录按钮和忘记密码布局
btn_layout = QVBoxLayout()
self.login_btn = QPushButton("登录")
self.login_btn.clicked.connect(self.validate_login)
self.login_btn.setMinimumWidth(250)
self.login_btn.setMaximumWidth(350)
forgot_layout = QHBoxLayout()
forgot_layout.setAlignment(Qt.AlignLeft)
self.forgot_password = QLabel("忘记密码")
self.forgot_password.setObjectName("linkLabel")
self.forgot_password.setTextInteractionFlags(Qt.TextSelectableByMouse)
self.forgot_password.setCursor(QCursor(Qt.PointingHandCursor))
self.forgot_password.mousePressEvent = self.show_password_hint
forgot_layout.addWidget(self.forgot_password)
forgot_layout.addStretch()
btn_layout.addWidget(self.login_btn)
btn_layout.addLayout(forgot_layout)
login_layout.addWidget(self.username_input)
login_layout.addWidget(self.password_input)
login_layout.addLayout(btn_layout)
# 水平布局(登录框宽度占比减少,左右留白增加)
center_layout = QHBoxLayout()
center_layout.addStretch(2) # 左侧空白占2份比之前增加
center_layout.addWidget(login_frame, 3) # 登录框占3份比之前减少
center_layout.addStretch(2) # 右侧空白占2份比之前增加
main_layout.addLayout(center_layout, 2)
main_layout.addStretch(1)
# 默认选中密码框
self.password_input.setFocus()
# 提示定时器
self.hint_timer = QTimer(self)
self.hint_timer.setSingleShot(True)
self.hint_timer.timeout.connect(self.hide_password_hint)
# 初始化标题大小
self.adjust_title_size()
def adjust_title_size(self):
"""调整标题大小,适应新的宽高比例"""
window_width = self.width()
# 字体大小计算更保守(宽度减少后避免文字过大)
font_size = max(20, min(36, window_width // 66)) # 除数增大,字体增长更平缓
font = QFont()
font.setPointSize(font_size)
self.title_label.setFont(font)
def resizeEvent(self, event):
"""窗口大小改变时调整标题"""
super().resizeEvent(event)
self.adjust_title_size()
def toggle_theme(self):
"""切换主题接口"""
current_style = self.styleSheet()
if current_style == self.light_style:
self.setStyleSheet(self.dark_style)
else:
self.setStyleSheet(self.light_style)
def show_password_hint(self, event):
self.hint_label.setVisible(True)
self.hint_timer.start(3000)
def hide_password_hint(self):
self.hint_label.setVisible(False)
def validate_login(self):
username = self.username_input.text().strip()
password = self.password_input.text().strip()
if password != "123":
QMessageBox.warning(self, "登录失败", "密码错误,请重试!")
return
if username == "manager":
self.open_workshop_manager_interface()
elif username == "admin":
self.open_debugger_interface()
else:
QMessageBox.warning(self, "登录失败", "用户名不存在!")
return
def open_workshop_manager_interface(self):
current_style = self.styleSheet()
self.workshop_window = WorkshopManagerWindow(current_style)
self.workshop_window.show()
self.close()
def open_debugger_interface(self):
current_style = self.styleSheet()
self.debugger_window = DebuggerWindow(current_style)
self.debugger_window.show()
self.close()
class WorkshopManagerWindow(QMainWindow):
def __init__(self, style_sheet):
super().__init__()
self.setStyleSheet(style_sheet)
self.init_ui()
def init_ui(self):
self.setWindowTitle("车间主管控制台 - 密胺餐盘自动化生产控制系统")
self.resize(1050, 700) # 3:2比例
self.setMinimumSize(900, 600)
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout(central_widget)
title_label = QLabel("欢迎使用车间主管系统")
title_label.setObjectName("titleLabel")
title_label.setAlignment(Qt.AlignCenter)
title_label.setFont(QFont("Arial", 18, QFont.Bold))
info_label = QLabel("这里是密胺餐盘生产线的管理和监控功能界面")
info_label.setObjectName("normalLabel")
info_label.setAlignment(Qt.AlignCenter)
layout.addStretch()
layout.addWidget(title_label)
layout.addWidget(info_label)
layout.addStretch()
class DebuggerWindow(QMainWindow):
def __init__(self, style_sheet):
super().__init__()
self.setStyleSheet(style_sheet)
self.init_ui()
def init_ui(self):
self.setWindowTitle("调试人员控制台 - 密胺餐盘自动化生产控制系统")
self.resize(1050, 700) # 3:2比例
self.setMinimumSize(900, 600)
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout(central_widget)
title_label = QLabel("欢迎使用调试人员系统")
title_label.setObjectName("titleLabel")
title_label.setAlignment(Qt.AlignCenter)
title_label.setFont(QFont("Arial", 18, QFont.Bold))
info_label = QLabel("这里是密胺餐盘生产设备的调试和参数配置界面")
info_label.setObjectName("normalLabel")
info_label.setAlignment(Qt.AlignCenter)
layout.addStretch()
layout.addWidget(title_label)
layout.addWidget(info_label)
layout.addStretch()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = LoginWindow(use_dark_theme=False)
window.show()
sys.exit(app.exec())