一简介
本软件作用于人员管理,
1创建一个岗位管理界面,点击岗位管理之后,设置好岗位名称,拖动鼠标画框,完成岗位创建,之后里面可以放置人员。
可以将之前建立的岗位删除,同时里面的人员也会删除。
2新增人员,包括(身份信息用不同颜色表示,岗位信息代表处于何种岗位)
3人员可以拖动到任意岗位,岗位也可以拖动到任意位置
4保存和读取功能
如图所示
,管理岗位
新增人员
人员状态管理
二 代码部分
分两次写的,借鉴很多,语法较乱,基本都有标注
pydesigner生成的四个界面内,然后重写按键类使其可以拖动
1主代码boy_main.py
# -*- coding:utf-8 -*-
import ast # 文本转字典
import sys
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget # 布局的框体
from boy_ui_main import Ui_MainWindow # 导入第一个py,主窗口
from boy_ui_new import Ui_newboy # 导入第二个py,新增成员窗口
from manager_ui_gangwei import Ui_widget # 导入第三个py,岗位管理窗口
import button # 导入的第四个py,按键重写,第四个窗口导入了这里
save_data_anjian = dict() # 需要保存的按键字典
save_data_layout = dict() # 需要保存的框体字典
# 主窗口
class MainWindow(QMainWindow, Ui_MainWindow): # 多重继承QMainWindow和Ui_MainWindow
def __init__(self):
super(MainWindow, self).__init__() # 先调用父类QMainWindow的初始化方法
self.setupUi(self) # 再调用setupUi方法
self.newboyshow = newwindow_anjian() # 实例化新建成员窗口
self.newgangweishow = newwindow_gangwei() # 实例化管理岗位窗口
self.add_boy.triggered.connect(self.newshow) # 为增加人员按钮添加打开新窗口的动作
self.saveaction.triggered.connect(self.savenow) # 为保存增加保存savedata的动作
self.openaction.triggered.connect(self.opennow) # 为打开增加打开savedata的动作
self.add_gangwei_huakuang.triggered.connect(self.manager_gangwei) # 为增加岗位增加管理岗位功能,可以画了
self.setAcceptDrops(True) # 拖动按键用——人员
self.sig_huakuang = 0 # 画框用,=0时不让画框
self.x0 = 0 # 画框用
self.y0 = 0 # 画框用
self.x1 = 0 # 画框用
self.y1 = 0 # 画框用
self.flag = False # # 画框用,鼠标未按下
self.move = False # # 画框用,存在移动
self.gangwei = 0 # 初始岗位设置
self.x_move = None#拖动岗位框体后的坐标
self.y_move = None#拖动岗位框体后的坐标
# 管理岗位页面,在新岗位页面设置完了岗位,点了确定,才能画框
def manager_gangwei(self):
self.newgangweishow.show()
# 画框用第一步---单击鼠标触发事件,初始左上角的点
def mousePressEvent(self, event):
# barHeight = self.bar.height()
self.x0 = event.pos().x()
self.y0 = event.pos().y()
self.flag = True
# 画框用第二步--鼠标移动事件
def mouseMoveEvent(self, event):
# barHeight = self.bar.height()
self.move = True
if self.flag:
self.x1 = event.pos().x()
self.y1 = event.pos().y()
self.update()
# 画框用第三步,只要拖动就会一直绘制事件
def paintEvent(self, event):
super().paintEvent(event)
painter = QPainter(self) # 拖动时候的临时框
painter.setPen(QPen(Qt.green, 2, Qt.SolidLine))#画笔设置
# 打开之后,再画或者最大化以后才能出现,不知道为啥,对刷新不太了解
for rec in save_data_layout.values():#遍历所有的框体,一直画
painter.drawRect(QRect(rec[0], rec[1], rec[2], rec[3]))
if self.flag and self.move and self.sig_huakuang == 1: # 只有当鼠标按下并且移动状态
rect = QRect(self.x0, self.y0, abs(self.x1 - self.x0), abs(self.y1 - self.y0))
painter.setPen(QPen(Qt.red, 2, Qt.SolidLine))
painter.drawRect(rect)
# 画框用第四步--鼠标释放事件,清零,并且不再绘制,self.sig_huakuang=0
def mouseReleaseEvent(self, event):
self.flag = False # 不再按下
self.move = False # 不再移动
self.x_move = event.pos().x() # 拖动岗位类的最终位置
self.y_move = event.pos().y() # 拖动岗位类的最终位置
# 释放鼠标时储存
if self.x1 and self.y1 and self.sig_huakuang == 1: # 不移动按了没用,也就是有宽度和高度时
print("鼠标放下")
gangwei = self.gangwei # 框体的临时名称
rec = self.x0, self.y0, abs(self.x1 - self.x0), abs(self.y1 - self.y0) # 位置和大小
save_data_layout[gangwei] = rec # 保存这个框体的数据
# 同时建立一个布局和一个按钮显示布局信息
self.draw_rect(gangwei, rec) # 执行创建岗位命令
self.sig_huakuang = 0 # 使其不能再画
# print("岗位状态", button.Y.mouseMoveEvent(event),self.x1, self.y1,self.sig_huakuang)
# 如果有岗位按键,并且现在不让画框,并且按了左键拖动了:那么移动岗位和布局控件,修改存储的数据,button.Y=目前的岗位框
if button.Y and self.sig_huakuang == 0 and button.U:
ganwgei = button.Y.text() # 从按键名字提取岗位信息
self.__dict__["pushButton" + ganwgei].move(self.x_move, self.y_move - 55) # 55,修改个位置
self.__dict__["gridLayoutWidget" + ganwgei].move(self.x_move, self.y_move - 30)
# 更改数据信息
# print(type(save_data_layout[ganwgei])) <class 'tuple'> 单个值没法修改
xx = save_data_layout[ganwgei][2] # 只能更改字典值
yy = save_data_layout[ganwgei][3] # 只能更改字典值
save_data_layout[ganwgei] = (self.x_move, self.y_move, xx, yy) # 保存新的岗位信息
button.U = 0 # 设置完了就不能动了,除非再点按钮
self.x0, self.y0, self.x1, self.y1 = (0, 0, 0, 0) # 鼠标重新设置
# 画框体、按键、和布局.打开文件和创建时候用。同时增加人员岗位可选项
def draw_rect(self, gangwei, rec):
# print(rec[0], rec[1], rec[2], rec[3])#左上点和 宽。高self.centralwidget
self.__dict__["gridLayoutWidget" + gangwei] = QWidget(self.centralwidget) # 布局要放到个容器里
self.__dict__["gridLayoutWidget" + gangwei].setGeometry(QRect(rec[0], rec[1], rec[2], rec[3])) # 容器大小
# self.__dict__["gridLayoutWidget" + gangwei].setObjectName(gangwei)#控件名字
self.__dict__["layout" + gangwei] = QVBoxLayout() # 做个垂直布局
self.__dict__["layout" + gangwei].setContentsMargins(0, 0, 0, 0) # 上下左右不留缝隙
self.__dict__["gridLayoutWidget" + gangwei].setLayout(self.__dict__["layout" + gangwei]) # 容器使用这个垂直布局
self.__dict__["gridLayoutWidget" + gangwei].show() # 容器要显示,少了这个麻烦了
# 按钮显示 同宽,往上50像素,高30像素
rectanjian = QRect(rec[0], rec[1] - 55, rec[2], 30)
self.__dict__["pushButton" + gangwei] = button.Buttongangwei(self.centralwidget, gangwei, rectanjian)
self.__dic