• 【项目实践】Pyside6+Qtdesigner:登录窗体设计


    代码功能:

            可实现应用程序用户管理,实现用户登录、注册、密码修改

    代码文档结构:

    • user_database.db:数据库文件,用于存储用户数据,第一运行代码时自动生成
    • login.ui:UI文件,由QT设计
    • ui_login.py(由login.ui编译过来)
    • 在终端Windows PowerShell运行如下代码即可生成
    pyside6-uic login.ui -o ui_login.py
    • test_login.py(如下代码:)
    1. from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QLabel, \
    2. QMessageBox, QDialog
    3. from PySide6.QtCore import Qt, QSize, QFile
    4. from PySide6.QtGui import QPixmap, QPalette, QBrush, QShortcut, QKeySequence
    5. import sqlite3
    6. from src.ui.ui_login import Ui_login_widget
    7. def create_user_table():
    8. conn = sqlite3.connect('user_database.db')
    9. cursor = conn.cursor()
    10. cursor.execute("""
    11. CREATE TABLE IF NOT EXISTS user (
    12. id INTEGER PRIMARY KEY AUTOINCREMENT,
    13. username TEXT NOT NULL UNIQUE,
    14. password TEXT NOT NULL
    15. );
    16. """)
    17. conn.commit()
    18. conn.close()
    19. create_user_table()
    20. class LoginWidget(QWidget, Ui_login_widget):
    21. def __init__(self):
    22. super().__init__()
    23. self.setupUi(self) # Ui_login_widget中的方法,用于设置UI
    24. # 设置窗口标志:隐藏最小化和最大化
    25. self.setWindowFlags(Qt.Window | Qt.WindowCloseButtonHint)
    26. self.setWindowTitle("登录")
    27. # 连接信号和槽
    28. self.btn_login.clicked.connect(self.login)
    29. self.btn_quit.clicked.connect(self.quit)
    30. # 设置快捷键
    31. self.shortcut_register = QShortcut(QKeySequence("Ctrl+Alt+R"), self)
    32. self.shortcut_register.activated.connect(self.register)
    33. self.shortcut_changePassword = QShortcut(QKeySequence("Ctrl+Alt+P"), self)
    34. self.shortcut_changePassword.activated.connect(self.changePassword)
    35. # 设置登录窗体背景颜色和字体
    36. self.set_default_styleSheet()
    37. # 设置登录窗体背景图片
    38. # self.set_background()
    39. def set_background(self):
    40. # 加载背景图片
    41. pixmap = QPixmap("resources/images/images/login_example.jpg")
    42. # 调整图片尺寸以适应窗体大小
    43. scaled_pixmap = pixmap.scaled(self.size(), Qt.KeepAspectRatioByExpanding)
    44. palette = QPalette()
    45. palette.setBrush(QPalette.Window, QBrush(scaled_pixmap))
    46. self.setPalette(palette)
    47. def set_default_styleSheet(self):
    48. # 设置登录窗体背景颜色和字体
    49. self.setStyleSheet("""
    50. background-color: rgb(40, 44, 52);
    51. color: rgb(255, 255, 255);
    52. """)
    53. # 设置登录窗体默认logo,如需更换需要重新编译resources/resources.qrc文件
    54. self.lb_app_logo.setStyleSheet("""
    55. background-image: url(:/images/images/images/login_example.png);
    56. background-position: center;
    57. background-repeat: no-repeat;
    58. """)
    59. def login(self):
    60. username = self.cBox_username.currentText()
    61. password = self.le_password.text()
    62. if len(password) == 0:
    63. QMessageBox.warning(self, "登录失败", "用户名和密码不能为空!")
    64. return
    65. conn = sqlite3.connect('user_database.db')
    66. cursor = conn.cursor()
    67. cursor.execute("SELECT password FROM user WHERE username = ?", (username,))
    68. result = cursor.fetchone()
    69. if result and result[0] == password:
    70. QMessageBox.information(self, "登录成功", "您已成功登录!")
    71. else:
    72. QMessageBox.warning(self, "登录失败", "密码错误!")
    73. conn.close()
    74. def register(self):
    75. self.register_widget = RegisterWidget()
    76. self.register_widget.show()
    77. def changePassword(self):
    78. username = '普通用户'
    79. self.change_password_widget = ChangePasswordWidget(username)
    80. self.change_password_widget.show()
    81. def quit(self):
    82. self.close()
    83. class RegisterWidget(QDialog):
    84. def __init__(self):
    85. super().__init__()
    86. self.setWindowTitle("注册")
    87. # 设置窗口标志:隐藏最小化和最大化
    88. self.setWindowFlags(Qt.Window | Qt.WindowCloseButtonHint)
    89. # 设置窗体为模态
    90. self.setModal(True)
    91. self.setup_ui()
    92. def setup_ui(self):
    93. self.layout = QVBoxLayout(self)
    94. self.username = QLineEdit(self)
    95. self.username.setPlaceholderText("用户名")
    96. self.layout.addWidget(self.username)
    97. self.password = QLineEdit(self)
    98. self.password.setPlaceholderText("密码")
    99. self.layout.addWidget(self.password)
    100. self.register_button = QPushButton("注册", self)
    101. self.register_button.clicked.connect(self.register)
    102. self.layout.addWidget(self.register_button)
    103. def register(self):
    104. username = self.username.text()
    105. password = self.password.text()
    106. if not username or not password:
    107. QMessageBox.warning(self, "注册失败", "用户名和密码不能为空!")
    108. return
    109. try:
    110. conn = sqlite3.connect('user_database.db')
    111. cursor = conn.cursor()
    112. cursor.execute("INSERT INTO user (username, password) VALUES (?, ?)", (username, password))
    113. conn.commit()
    114. QMessageBox.information(self, "注册成功", "您已成功注册!请返回登录。")
    115. self.close()
    116. except sqlite3.IntegrityError:
    117. QMessageBox.warning(self, "注册失败", "用户名已存在!")
    118. finally:
    119. conn.close()
    120. class ChangePasswordWidget(QDialog):
    121. def __init__(self, username):
    122. super().__init__()
    123. self.username = username # 用户名应该在实例化时提供
    124. self.setWindowTitle("修改密码")
    125. # 设置窗口标志:隐藏最小化和最大化
    126. self.setWindowFlags(Qt.Window | Qt.WindowCloseButtonHint)
    127. # 设置窗体为模态
    128. self.setModal(True)
    129. self.setup_ui()
    130. def setup_ui(self):
    131. self.layout = QVBoxLayout(self)
    132. # 旧密码输入框
    133. self.old_password = QLineEdit(self)
    134. self.old_password.setPlaceholderText("旧密码")
    135. self.old_password.setEchoMode(QLineEdit.Password)
    136. self.layout.addWidget(self.old_password)
    137. # 新密码输入框
    138. self.new_password = QLineEdit(self)
    139. self.new_password.setPlaceholderText("新密码")
    140. self.new_password.setEchoMode(QLineEdit.Password)
    141. self.layout.addWidget(self.new_password)
    142. # 确认新密码输入框
    143. self.confirm_new_password = QLineEdit(self)
    144. self.confirm_new_password.setPlaceholderText("确认新密码")
    145. self.confirm_new_password.setEchoMode(QLineEdit.Password)
    146. self.layout.addWidget(self.confirm_new_password)
    147. # 修改密码按钮
    148. self.change_password_button = QPushButton("修改密码", self)
    149. self.change_password_button.clicked.connect(self.change_password)
    150. self.layout.addWidget(self.change_password_button)
    151. def change_password(self):
    152. old_password = self.old_password.text()
    153. new_password = self.new_password.text()
    154. confirm_new_password = self.confirm_new_password.text()
    155. if new_password != confirm_new_password:
    156. QMessageBox.warning(self, "修改失败", "新密码和确认密码不匹配!")
    157. return
    158. conn = sqlite3.connect('user_database.db')
    159. cursor = conn.cursor()
    160. # 验证旧密码
    161. cursor.execute("SELECT password FROM user WHERE username = ?", (self.username,))
    162. result = cursor.fetchone()
    163. if not result or result[0] != old_password:
    164. QMessageBox.warning(self, "修改失败", "旧密码错误!")
    165. conn.close()
    166. return
    167. # 更新数据库中的密码
    168. cursor.execute("UPDATE user SET password = ? WHERE username = ?", (new_password, self.username))
    169. conn.commit()
    170. QMessageBox.information(self, "修改成功", "密码修改成功!")
    171. conn.close()
    172. self.close()
    173. if __name__ == "__main__":
    174. app = QApplication([])
    175. login_widget = LoginWidget()
    176. login_widget.show()
    177. app.exec()

  • 相关阅读:
    Ansible之变量
    Java:继承和多态
    pytest文档83 - 把收集的 yaml 文件转 Item 用例并运行
    python使用matplotlib可视化线图(line plot)、将图像保存为svg格式(将图像保存为png、jpg、jpeg等其他格式的语法类似)
    【实践篇】Redis最强Java客户端(三)之Redisson 7种分布式锁使用指南
    Vue实战篇三十五:实现滑动拼图验证登录
    《WEB前端框架开发技术》HTML5响应式旅游景区网站设计与实现——榆林子州HTML+CSS+JavaScript
    vue实现随机验证码(数字类型、字母类型)业务【适用于登录页、网页安全码】
    Python无废话-办公自动化Excel写入操作
    unity pivot and center
  • 原文地址:https://blog.csdn.net/climber1121/article/details/136678012