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

代码功能:

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

代码文档结构:

  • user_database.db:数据库文件,用于存储用户数据,第一运行代码时自动生成
  • login.ui:UI文件,由QT设计
  • ui_login.py(由login.ui编译过来)
  • 在终端Windows PowerShell运行如下代码即可生成
bash 复制代码
pyside6-uic login.ui -o ui_login.py
  • test_login.py(如下代码:)
python 复制代码
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()
相关推荐
长和信泰光伏储能6 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
数据库小学妹6 小时前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评
数据库·信创·国产数据库·数据库选型·oracle迁移
浦信仿真大讲堂6 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study6 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
神龙天舞20017 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
卷无止境7 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境7 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1237 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
丙氨酸長鏈8 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
Dxy12393102168 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python