pyqt5实现的一个简单的登录和表格增删改查功能,基本实现大部分需求

最近有个项目,需要做桌面端应用,所以就系统学习了下pyqt5的知识点,发现还是挺强大的。
做了多年的python码农,最终折腾了下,做了个大概的效果出来,基本满足数据库表增删改查功能了。
在这里插入图片描述
登录的代码逻辑 main.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'adminView.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
from PyQt5.QtGui import QFont, QPixmap, QPalette, QBrush
from PyQt5.QtWidgets import QStyleOption, QStyle, QWidget, QLabel, QPushButton, QLineEdit, QTableView, QGridLayout, \
    QFileDialog, QMessageBox, QTableWidget, QFrame, QTableWidgetItem

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi


from admin_view import AdminMainWindow

from datetime import datetime


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        loadUi('login.ui', self)

        # 添加顶部logo图片
        pixmap = QPixmap("img/header.png")
        scared_pixmap = pixmap.scaled(819, 518)
        label = QLabel(self)
        label.setPixmap(scared_pixmap)

        # 密码输入框设置加密显示
        self.passwordLineEdit.setEchoMode(QLineEdit.Password)
        self.loginButton.setFont(QFont("Microsoft YaHei"))
        # self.loginButton.setStyleSheet("#loginButton{background-color:#2c7adf;color:#fff;border:none;border-radius:4px;}")
        self.loginButton.clicked.connect(self.login_check)
        self.showRegisterFrameButton.setFont(QFont("Microsoft YaHei"))
        # self.registerButton.setStyleSheet("#registerButton{background-color:#2c7adf;color:#fff;border:none;border-radius:4px;}")
        self.showRegisterFrameButton.clicked.connect(self.show_register_frame)
        self.showLoginFrameButton.clicked.connect(self.show_login_frame)
        self.registerButton.clicked.connect(self.register)
        self.registerFrame.setVisible(False)
        self.loginFrame.setVisible(True)

    def show_login_frame(self):
        """
        显示修改密码的frame
        """
        self.registerFrame.setVisible(False)
        self.loginFrame.setVisible(True)

    def show_register_frame(self):
        """
        显示修改密码的frame
        """
        self.loginFrame.setVisible(False)
        self.registerFrame.setVisible(True)

    def alarm(self, msg):
        """
         报警提示框
        """
        QMessageBox.warning(self, "提示框", msg, QMessageBox.Ok)

    def tips(self, msg):
        """
        正常提醒
        :param msg:
        :return:
        """
        QMessageBox.information(self, "提示框", msg, QMessageBox.Ok)

    def login_check(self):
        """
        登录认证
        :return:
        """
        global is_passed, role, phone

        phone = self.phoneLineEdit.text()
        password = self.passwordLineEdit.text()
        if not phone or not password:
            self.alarm('账号或者密码不能为空!')
            return
        if phone != 'admin' or password != '123456':
            QMessageBox.warning(self, "错误", "用户名或密码错误", QMessageBox.Yes)
            return
        else:
            role = '管理员'
            is_passed = 1
            self.close()
        return

    def register(self):
        """
        注册
        :return:
        """
        phone = self.regPhoneLineEdit.text()
        pwd = self.regPasswordLineEdit.text()
        pwd2 = self.regPasswordLineEdit2.text()
        if not phone or not pwd or not pwd2:
            QMessageBox.warning(self, "错误", "有内容为空,请确认!", QMessageBox.Yes)
            return
        # 校验两次密码是否一致
        if pwd != pwd2:
            QMessageBox.warning(self, "错误", "两次密码不一样!", QMessageBox.Yes)
            return
        QMessageBox.about(self, '成功', '注册成功,点击返回进行登录!')
        self.show_login_frame()


if __name__ == "__main__":
    role = ''  # 角色
    phone = ''  # 手机号
    is_passed = 0  # 判断是否登录成功,成功后为1
    with open('css.qss', encoding='utf-8') as f:
        qss = f.read()
    app = QApplication(sys.argv)
    app.setStyleSheet(qss)
    ex = MainWindow()
    window_pale = QPalette()
    window_pale.setBrush(ex.backgroundRole(), QBrush(QPixmap("img/bg.jpg")))
    ex.setPalette(window_pale)
    ex.show()
    app.exec_()

    if is_passed == 0:
        sys.exit(0)

    app2 = QApplication(sys.argv)
    if role == '管理员':
        print('管理员登录')
        w = AdminMainWindow(phone=phone)
        w.show()
    else:
        QMessageBox.warning(ex, "错误", "非正常角色登录, 请联系管理管处理!", QMessageBox.Yes)
    sys.exit(app2.exec_())

管理员角色逻辑实现 admin_view.py

from PyQt5.QtWidgets import QStyleOption, QStyle, QWidget, QLabel, QPushButton, QLineEdit, QTableView, QGridLayout, \
    QFileDialog, QMessageBox, QTableWidget, QFrame, QTableWidgetItem

import sys
from decimal import *
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi
# from qtpy.QtCore import Qt


class AdminMainWindow(QMainWindow):
    def __init__(self, parent=None, phone=None):
        super(AdminMainWindow, self).__init__(parent)

        loadUi('adminView.ui', self)
        self.setWindowTitle(f'欢迎 管理员')
        # 餐桌相关操作
        self.searchTableButton.clicked.connect(self.search_table)  # 搜索餐桌数据
        self.insertTableButton.clicked.connect(self.insert_table)  # 新增餐桌数据
        self.saveTableButton.clicked.connect(self.save_table)  # 保存餐桌数据
        self.delTableButton.clicked.connect(self.delete_table)  # 删除餐桌数据

        # 系统-退出
        self.exit.triggered.connect(self.close)
        # 配置frame的显示
        self.tabWidget.setVisible(True)

    def alarm(self, msg):
        """
         报警提示框
        """
        QMessageBox.warning(self, "提示框", msg, QMessageBox.Ok)

    def tips(self, msg):
        """
        正常提醒
        :param msg:
        :return:
        """
        QMessageBox.information(self, "提示框", msg, QMessageBox.Ok)

    def show_table(self, table_widget, headers, data):
        """
        展示table数据
        :return:
        """
        row = len(data)  # 获取行数
        if not row:
            self.alarm('暂无数据!')
            table_widget.setRowCount(0)  # 配置要显示的行数
            table_widget.setColumnCount(len(headers))  # 配置要显示的行数
            table_widget.setHorizontalHeaderLabels(headers)  # 设置表头
            return
        vol = len(data[0])  # 获取列数
        table_widget.setRowCount(row)  # 配置要显示的行数
        table_widget.setColumnCount(vol)  # 配置要显示的行数
        table_widget.setHorizontalHeaderLabels(headers)  # 设置表头
        for i in range(row):  # 循环展示数据
            for j in range(vol):
                table_widget.setItem(i, j, QTableWidgetItem(str(data[i][j])))
        self.tips('数据查询成功')

    def search_table(self):
        """
        查询餐桌
        :return:
        """
        floor = self.floorLineEdit.text()
        f, d = ['id', '楼层', '桌号', '可坐人数', '当前状态'], ((1, '1', '001', Decimal('151'), '空闲'), (5, '1', '002', Decimal('6'), '空闲'), (8, '2', '001', Decimal('5'), '空闲'), (9, '1', '004', Decimal('6'), '空闲'), (10, '1', '005', Decimal('8'), '空闲'))
        self.show_table(self.tableTableWidget, f, d)

    def insert_table(self):
        """
        新增一条餐桌数据,会在table中插入一条数据
        只有点击保存的时候才会真正存储至数据库中
        """
        row = self.tableTableWidget.rowCount()
        self.tableTableWidget.insertRow(row)
        self.tableTableWidget.setItem(row, 0, QTableWidgetItem(""))
        self.tableTableWidget.setItem(row, 1, QTableWidgetItem(""))
        self.tableTableWidget.setItem(row, 2, QTableWidgetItem(""))
        self.tableTableWidget.setItem(row, 3, QTableWidgetItem(""))
        self.tableTableWidget.setItem(row, 4, QTableWidgetItem("空闲"))

    def save_table(self):
        """
        保存餐桌
        :return:
        """
        rows = self.tableTableWidget.rowCount()  # 获取当前的行数
        colomn = self.tableTableWidget.columnCount()  # 获取当前的列数
        print(f'{rows}行, {colomn}列')
        cards = []  # 去重告警
        for i in range(rows):
            # 存储所有的card数据,判断是否有重复卡号
            _tmp = []  # 临时存储一行数据
            for c in range(colomn):
                item = self.tableTableWidget.item(i, c)
                if not item:
                    self.alarm('有单元格数据为空,保存数据失败!')
                    return
                item_text = item.text()  # 处理空字符串
                _tmp.append(item_text)
                # todo 这里做入库动作
        self.tips('数据保存成功!')
        # 刷新一下数据
        self.search_table()

    def delete_table(self):
        """
        删除餐桌
        """
        row_select = self.tableTableWidget.selectedItems()
        if len(row_select) == 0:
            return
        id = row_select[0].text()
        row = row_select[0].row()
        self.tableTableWidget.removeRow(row)
        # 以下可以加入保存数据到数据的操作
        if id:
            print("id: {}".format(id))
            # todo 数据库删除数据
        self.tips('删除成功!')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = AdminMainWindow(phone='xxxxx')
    w.show()
    sys.exit(app.exec())

核心代码上面已放出,如需整套源码下载,一套完整的程序,解压即可正常执行~~~~有疑问或者有其他需求也欢迎私聊。

原创作品,未经同意,不得转载~~~~

  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在 PyQt 中,可以使用 QTableWidget 或者 QTableView 控件来实现表格增删改查功能。下面给出一个简单的示例代码: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget, QPushButton, QHBoxLayout, QLineEdit, QLabel class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Table Example") self.table_widget = QTableWidget() self.table_widget.setRowCount(5) self.table_widget.setColumnCount(3) self.table_widget.setItem(0, 0, QTableWidgetItem("John")) self.table_widget.setItem(0, 1, QTableWidgetItem("Doe")) self.table_widget.setItem(0, 2, QTableWidgetItem("[email protected]")) self.table_widget.setItem(1, 0, QTableWidgetItem("Jane")) self.table_widget.setItem(1, 1, QTableWidgetItem("Doe")) self.table_widget.setItem(1, 2, QTableWidgetItem("[email protected]")) self.table_widget.setHorizontalHeaderLabels(["First Name", "Last Name", "Email"]) # Add buttons add_button = QPushButton("Add") add_button.clicked.connect(self.add_row) delete_button = QPushButton("Delete") delete_button.clicked.connect(self.delete_row) update_button = QPushButton("Update") update_button.clicked.connect(self.update_row) # Add input fields self.first_name_input = QLineEdit() self.last_name_input = QLineEdit() self.email_input = QLineEdit() add_layout = QHBoxLayout() add_layout.addWidget(QLabel("First Name")) add_layout.addWidget(self.first_name_input) add_layout.addWidget(QLabel("Last Name")) add_layout.addWidget(self.last_name_input) add_layout.addWidget(QLabel("Email")) add_layout.addWidget(self.email_input) add_layout.addWidget(add_button) # Add layout to widget widget = QWidget() main_layout = QVBoxLayout() main_layout.addWidget(self.table_widget) main_layout.addLayout(add_layout) main_layout.addWidget(delete_button) main_layout.addWidget(update_button) widget.setLayout(main_layout) self.setCentralWidget(widget) def add_row(self): row_count = self.table_widget.rowCount() self.table_widget.setRowCount(row_count + 1) first_name = self.first_name_input.text() last_name = self.last_name_input.text() email = self.email_input.text() self.table_widget.setItem(row_count, 0, QTableWidgetItem(first_name)) self.table_widget.setItem(row_count, 1, QTableWidgetItem(last_name)) self.table_widget.setItem(row_count, 2, QTableWidgetItem(email)) self.first_name_input.clear() self.last_name_input.clear() self.email_input.clear() def delete_row(self): selected_row = self.table_widget.currentRow() if selected_row != -1: self.table_widget.removeRow(selected_row) def update_row(self): selected_row = self.table_widget.currentRow() if selected_row != -1: first_name = self.first_name_input.text() last_name = self.last_name_input.text() email = self.email_input.text() self.table_widget.setItem(selected_row, 0, QTableWidgetItem(first_name)) self.table_widget.setItem(selected_row, 1, QTableWidgetItem(last_name)) self.table_widget.setItem(selected_row, 2, QTableWidgetItem(email)) self.first_name_input.clear() self.last_name_input.clear() self.email_input.clear() if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 该示例代码中实现一个简单表格,可以添加、删除和更新表格中的行。用户可以通过输入框输入数据,并点击相应的按钮来实现增删改查操作。在该示例中,使用了 QTableWidget 控件来展示表格数据,并添加了 QLineEdit、QLabel 和 QPushButton 等控件来实现用户交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lbxoqy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值