可实现应用程序用户管理,实现用户登录、注册、密码修改
pyside6-uic login.ui -o ui_login.py
- from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QLabel, \
- QMessageBox, QDialog
- from PySide6.QtCore import Qt, QSize, QFile
- from PySide6.QtGui import QPixmap, QPalette, QBrush, QShortcut, QKeySequence
-
- import sqlite3
-
- from src.ui.ui_login import Ui_login_widget
-
-
- def create_user_table():
- conn = sqlite3.connect('user_database.db')
- cursor = conn.cursor()
- cursor.execute("""
- CREATE TABLE IF NOT EXISTS user (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- username TEXT NOT NULL UNIQUE,
- password TEXT NOT NULL
- );
- """)
- conn.commit()
- conn.close()
-
-
- create_user_table()
-
-
- class LoginWidget(QWidget, Ui_login_widget):
- def __init__(self):
- super().__init__()
- self.setupUi(self) # Ui_login_widget中的方法,用于设置UI
- # 设置窗口标志:隐藏最小化和最大化
- self.setWindowFlags(Qt.Window | Qt.WindowCloseButtonHint)
- self.setWindowTitle("登录")
-
- # 连接信号和槽
- self.btn_login.clicked.connect(self.login)
- self.btn_quit.clicked.connect(self.quit)
-
- # 设置快捷键
- self.shortcut_register = QShortcut(QKeySequence("Ctrl+Alt+R"), self)
- self.shortcut_register.activated.connect(self.register)
-
- self.shortcut_changePassword = QShortcut(QKeySequence("Ctrl+Alt+P"), self)
- self.shortcut_changePassword.activated.connect(self.changePassword)
-
- # 设置登录窗体背景颜色和字体
- self.set_default_styleSheet()
-
- # 设置登录窗体背景图片
- # self.set_background()
-
- def set_background(self):
- # 加载背景图片
- pixmap = QPixmap("resources/images/images/login_example.jpg")
- # 调整图片尺寸以适应窗体大小
- scaled_pixmap = pixmap.scaled(self.size(), Qt.KeepAspectRatioByExpanding)
- palette = QPalette()
- palette.setBrush(QPalette.Window, QBrush(scaled_pixmap))
- self.setPalette(palette)
-
- def set_default_styleSheet(self):
- # 设置登录窗体背景颜色和字体
- self.setStyleSheet("""
- background-color: rgb(40, 44, 52);
- color: rgb(255, 255, 255);
- """)
-
- # 设置登录窗体默认logo,如需更换需要重新编译resources/resources.qrc文件
- self.lb_app_logo.setStyleSheet("""
- background-image: url(:/images/images/images/login_example.png);
- background-position: center;
- background-repeat: no-repeat;
- """)
-
- def login(self):
- username = self.cBox_username.currentText()
- password = self.le_password.text()
-
- if len(password) == 0:
- QMessageBox.warning(self, "登录失败", "用户名和密码不能为空!")
- return
-
- conn = sqlite3.connect('user_database.db')
- cursor = conn.cursor()
- cursor.execute("SELECT password FROM user WHERE username = ?", (username,))
- result = cursor.fetchone()
-
- if result and result[0] == password:
- QMessageBox.information(self, "登录成功", "您已成功登录!")
- else:
- QMessageBox.warning(self, "登录失败", "密码错误!")
-
- conn.close()
-
- def register(self):
- self.register_widget = RegisterWidget()
- self.register_widget.show()
-
- def changePassword(self):
- username = '普通用户'
- self.change_password_widget = ChangePasswordWidget(username)
- self.change_password_widget.show()
-
- def quit(self):
- self.close()
-
-
- class RegisterWidget(QDialog):
- def __init__(self):
- super().__init__()
- self.setWindowTitle("注册")
-
- # 设置窗口标志:隐藏最小化和最大化
- self.setWindowFlags(Qt.Window | Qt.WindowCloseButtonHint)
-
- # 设置窗体为模态
- self.setModal(True)
-
- self.setup_ui()
-
- def setup_ui(self):
- self.layout = QVBoxLayout(self)
-
- self.username = QLineEdit(self)
- self.username.setPlaceholderText("用户名")
- self.layout.addWidget(self.username)
-
- self.password = QLineEdit(self)
- self.password.setPlaceholderText("密码")
- self.layout.addWidget(self.password)
-
- self.register_button = QPushButton("注册", self)
- self.register_button.clicked.connect(self.register)
- self.layout.addWidget(self.register_button)
-
- def register(self):
- username = self.username.text()
- password = self.password.text()
-
- if not username or not password:
- QMessageBox.warning(self, "注册失败", "用户名和密码不能为空!")
- return
-
- try:
- conn = sqlite3.connect('user_database.db')
- cursor = conn.cursor()
- cursor.execute("INSERT INTO user (username, password) VALUES (?, ?)", (username, password))
- conn.commit()
- QMessageBox.information(self, "注册成功", "您已成功注册!请返回登录。")
- self.close()
- except sqlite3.IntegrityError:
- QMessageBox.warning(self, "注册失败", "用户名已存在!")
- finally:
- conn.close()
-
-
- class ChangePasswordWidget(QDialog):
- def __init__(self, username):
- super().__init__()
- self.username = username # 用户名应该在实例化时提供
- self.setWindowTitle("修改密码")
-
- # 设置窗口标志:隐藏最小化和最大化
- self.setWindowFlags(Qt.Window | Qt.WindowCloseButtonHint)
-
- # 设置窗体为模态
- self.setModal(True)
- self.setup_ui()
-
- def setup_ui(self):
- self.layout = QVBoxLayout(self)
-
- # 旧密码输入框
- self.old_password = QLineEdit(self)
- self.old_password.setPlaceholderText("旧密码")
- self.old_password.setEchoMode(QLineEdit.Password)
- self.layout.addWidget(self.old_password)
-
- # 新密码输入框
- self.new_password = QLineEdit(self)
- self.new_password.setPlaceholderText("新密码")
- self.new_password.setEchoMode(QLineEdit.Password)
- self.layout.addWidget(self.new_password)
-
- # 确认新密码输入框
- self.confirm_new_password = QLineEdit(self)
- self.confirm_new_password.setPlaceholderText("确认新密码")
- self.confirm_new_password.setEchoMode(QLineEdit.Password)
- self.layout.addWidget(self.confirm_new_password)
-
- # 修改密码按钮
- self.change_password_button = QPushButton("修改密码", self)
- self.change_password_button.clicked.connect(self.change_password)
- self.layout.addWidget(self.change_password_button)
-
- def change_password(self):
- old_password = self.old_password.text()
- new_password = self.new_password.text()
- confirm_new_password = self.confirm_new_password.text()
-
- if new_password != confirm_new_password:
- QMessageBox.warning(self, "修改失败", "新密码和确认密码不匹配!")
- return
-
- conn = sqlite3.connect('user_database.db')
- cursor = conn.cursor()
-
- # 验证旧密码
- cursor.execute("SELECT password FROM user WHERE username = ?", (self.username,))
- result = cursor.fetchone()
- if not result or result[0] != old_password:
- QMessageBox.warning(self, "修改失败", "旧密码错误!")
- conn.close()
- return
-
- # 更新数据库中的密码
- cursor.execute("UPDATE user SET password = ? WHERE username = ?", (new_password, self.username))
- conn.commit()
- QMessageBox.information(self, "修改成功", "密码修改成功!")
- conn.close()
- self.close()
-
- if __name__ == "__main__":
- app = QApplication([])
- login_widget = LoginWidget()
- login_widget.show()
- app.exec()