285 lines
8.9 KiB
Python
285 lines
8.9 KiB
Python
|
# -*- coding: utf-8 -*-
|
|||
|
'''
|
|||
|
description: 抽象类模块
|
|||
|
|
|||
|
Created on 2018年7月7日
|
|||
|
|
|||
|
Author: 人间白头
|
|||
|
|
|||
|
email: 625781186@qq.com
|
|||
|
|
|||
|
'''
|
|||
|
import sip , functools
|
|||
|
|
|||
|
from PyQt5 import QtGui, QtWidgets, QtCore
|
|||
|
from PyQt5.QtCore import *
|
|||
|
from PyQt5.QtGui import *
|
|||
|
from PyQt5.QtWidgets import *
|
|||
|
|
|||
|
from Tools.qmf_showError import f_showERROR, w_showERROR
|
|||
|
from Tools.CommonHelper import CommonHelper
|
|||
|
|
|||
|
|
|||
|
SHOWMENU = {"yes":True , "no":False , "setShow":True , "setHide":False }
|
|||
|
ENTERMENU = {"yes":True , "no":False }
|
|||
|
|
|||
|
class SingeleWidget(QWidget):
|
|||
|
'''
|
|||
|
菜单栏的每个框。
|
|||
|
'''
|
|||
|
#1
|
|||
|
|
|||
|
Button_hideFlag = SHOWMENU["setHide"]
|
|||
|
|
|||
|
def __init__(self, parent=None):
|
|||
|
'''
|
|||
|
Button_hideFlag: 0 表明没有显示弹窗;1表示显示了弹窗。
|
|||
|
'''
|
|||
|
super(SingeleWidget, self).__init__(parent)
|
|||
|
|
|||
|
# 很重要 , 否则样式背景无效!
|
|||
|
self.setAttribute(Qt.WA_StyledBackground, True)
|
|||
|
|
|||
|
# 这个m_menu没有用, 有用的是main.py中生成的m_menu
|
|||
|
self.m_menu = QWidget()
|
|||
|
|
|||
|
# 用来测试qss的 , 可以注释掉
|
|||
|
self.setProperty("WID", "isTrue")
|
|||
|
|
|||
|
def enterEvent(self, e):
|
|||
|
|
|||
|
#设置菜单窗体的宽度
|
|||
|
self.m_menu.setMinimumWidth(self.width())
|
|||
|
self.m_menu.setMaximumWidth(self.width())
|
|||
|
|
|||
|
#我靠! 把菜单窗体对齐到按钮框
|
|||
|
menu_Pos = self.mapToGlobal(
|
|||
|
QPoint( self.parent().x() ,
|
|||
|
self.parent().height() )
|
|||
|
)
|
|||
|
|
|||
|
self.m_menu.move(menu_Pos)
|
|||
|
|
|||
|
self.m_menu.show()
|
|||
|
|
|||
|
#表明显示了弹窗
|
|||
|
self.Button_hideFlag = SHOWMENU["setShow"]
|
|||
|
|
|||
|
def leaveEvent(self, e):
|
|||
|
'''
|
|||
|
离开时判断是否显示了窗体,80ms后发射到_jugement去检测。
|
|||
|
'''
|
|||
|
if self.Button_hideFlag is SHOWMENU["yes"]: #显示了窗体
|
|||
|
QTimer.singleShot(80, self._jugement)
|
|||
|
|
|||
|
def _jugement(self):
|
|||
|
'''
|
|||
|
离开上面窗体之后80ms, 1:进入旁边的菜单框;2:进入弹出的菜单。
|
|||
|
'''
|
|||
|
if self.m_menu.Menu_hideFlag is ENTERMENU["no"]:
|
|||
|
self.m_menu.hide()
|
|||
|
self.m_menu.close()
|
|||
|
self.Button_hideFlag = SHOWMENU["setHide"]
|
|||
|
|
|||
|
#==================================================
|
|||
|
class BaseMenuWidget(QTableWidget):
|
|||
|
#2
|
|||
|
'''
|
|||
|
下拉菜单。
|
|||
|
'''
|
|||
|
m_currentRow = None
|
|||
|
m_currentCol = None
|
|||
|
|
|||
|
Menu_hideFlag = ENTERMENU["no"]
|
|||
|
|
|||
|
def __init__(self, parent=None):
|
|||
|
'''
|
|||
|
Menu_hideFlag: 0时隐藏,1时显示;
|
|||
|
'''
|
|||
|
|
|||
|
super(BaseMenuWidget, self).__init__(parent)
|
|||
|
|
|||
|
self.__initUI()
|
|||
|
|
|||
|
def __initUI(self):
|
|||
|
|
|||
|
#无边框,隐藏任务栏;
|
|||
|
self.setWindowFlags( Qt.FramelessWindowHint|Qt.Tool|Qt.Widget)
|
|||
|
#列宽设置
|
|||
|
self.horizontalHeader().setSectionResizeMode(3)
|
|||
|
#充满列宽
|
|||
|
self.horizontalHeader().setStretchLastSection(True)
|
|||
|
#行高模式
|
|||
|
self.verticalHeader().setSectionResizeMode(1)
|
|||
|
#充满行高
|
|||
|
self.verticalHeader().setStretchLastSection(True)
|
|||
|
#只读
|
|||
|
self.setEditTriggers(QAbstractItemView.NoEditTriggers)
|
|||
|
|
|||
|
# 隐藏表头
|
|||
|
self.horizontalHeader().setVisible(False);
|
|||
|
self.verticalHeader().setVisible(False);
|
|||
|
|
|||
|
# 关闭滑动条
|
|||
|
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
|||
|
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
|||
|
|
|||
|
self.setColumnCount(1);
|
|||
|
self._setHeight()
|
|||
|
|
|||
|
# 不知道为啥main.py中的下拉菜单样式要重新赋予一次
|
|||
|
self.parent().readCSS(self)
|
|||
|
|
|||
|
def _setHeight(self):
|
|||
|
height = self.rowCount()*40
|
|||
|
self.setMinimumHeight(height)
|
|||
|
self.setMaximumHeight(height)
|
|||
|
|
|||
|
def enterEvent(self, e):
|
|||
|
#表明进入了弹窗
|
|||
|
self.Menu_hideFlag = ENTERMENU["yes"]
|
|||
|
|
|||
|
def leaveEvent(self, e):
|
|||
|
#表名离开了弹窗
|
|||
|
self.Menu_hideFlag = ENTERMENU["no"]
|
|||
|
self.hide()
|
|||
|
|
|||
|
#取消点击的按钮
|
|||
|
if self.m_currentRow is not None:
|
|||
|
self.clearSelection()
|
|||
|
self.cellWidget(self.m_currentRow,
|
|||
|
self.m_currentCol).setCheckable(False)
|
|||
|
|
|||
|
def _addAction(self, text, MyWidget=None, func=None, *args, **kwags):
|
|||
|
'''
|
|||
|
obj : QPushButton对象;
|
|||
|
text:obj的字;
|
|||
|
func:obj点击链接的信号;
|
|||
|
MyWidget:想要显示的窗体对象;
|
|||
|
'''
|
|||
|
self.insertRow(self.rowCount())
|
|||
|
self._setHeight()
|
|||
|
row = self.rowCount()-1
|
|||
|
col = self.columnCount()-1
|
|||
|
|
|||
|
obj = QPushButton(text)
|
|||
|
obj.setProperty("M_Action", "isTrue")
|
|||
|
obj.setFlat(True)
|
|||
|
obj.setCheckable(True);
|
|||
|
obj.setAutoExclusive(True);
|
|||
|
|
|||
|
#老子真聪明,哈哈
|
|||
|
#按钮默认连接changeTab函数
|
|||
|
if func == None :
|
|||
|
func = self.changeTab
|
|||
|
obj.clicked.connect(lambda: setattr(self , "m_currentRow" , row))
|
|||
|
obj.clicked.connect(lambda: setattr(self , "m_currentCol" , col))
|
|||
|
|
|||
|
obj.clicked.connect(functools.partial(
|
|||
|
func,
|
|||
|
text,
|
|||
|
MyWidget,
|
|||
|
*args,
|
|||
|
**kwags)
|
|||
|
)
|
|||
|
|
|||
|
self.setCellWidget(row, col , obj);
|
|||
|
|
|||
|
def _findParent(self, currentObj):
|
|||
|
'''
|
|||
|
递归找父窗口。
|
|||
|
'''
|
|||
|
|
|||
|
if currentObj.parent().objectName()=="MainWindow":
|
|||
|
return currentObj.parent()
|
|||
|
|
|||
|
#这里有返回值,返回倒数第二次的
|
|||
|
return self._findParent(currentObj.parent())
|
|||
|
|
|||
|
def changeTab(self, text, MyWidget, *args, **kwags):
|
|||
|
#返回的MainWindow
|
|||
|
mw = self._findParent(self)
|
|||
|
|
|||
|
#save:是否保留窗体;id:在mw.Wid_Obj 二级字典的键值;
|
|||
|
if "save" in kwags and "id" in kwags:
|
|||
|
save, id = kwags["save"], kwags["id"]
|
|||
|
#B1类-b1; B2类-b2;
|
|||
|
_key = "b"+ self.__class__.__name__[-1]
|
|||
|
# print(_key)
|
|||
|
childrens = mw.bottomWidget.children()[1:]
|
|||
|
if childrens!=[]:
|
|||
|
for obj in childrens:
|
|||
|
# 隐藏所有对象
|
|||
|
obj.setVisible(False)
|
|||
|
# 如果没有不可删除的属性,就删掉
|
|||
|
if not hasattr(obj, "SAVE"):
|
|||
|
sip.delete(obj)
|
|||
|
del obj
|
|||
|
|
|||
|
#如果为"s", 即对象不删除,保存到字典中;
|
|||
|
if save=="s":
|
|||
|
if MyWidget is not None:
|
|||
|
#第一次点击到时候判断是否存在二级字典中;
|
|||
|
if id in mw.Wid_Obj[_key].keys():
|
|||
|
print("存在wid_obj:", mw.Wid_Obj[_key][id])
|
|||
|
print("EXIT?:",mw.Wid_Obj[_key][id].SAVE )
|
|||
|
mw.Wid_Obj[_key][id].setVisible(True)
|
|||
|
else:
|
|||
|
#不存在则创建;
|
|||
|
print("saving..")
|
|||
|
obj_Widget = MyWidget()
|
|||
|
#动态添加不删除标志
|
|||
|
obj_Widget.SAVE = True
|
|||
|
#存对象
|
|||
|
mw.Wid_Obj[_key][id] = obj_Widget
|
|||
|
#加到布局
|
|||
|
mw.Bottom_Vbox.addWidget(obj_Widget)
|
|||
|
|
|||
|
elif save=="d":
|
|||
|
obj_Widget = MyWidget(mw)
|
|||
|
mw.Bottom_Vbox.addWidget(obj_Widget)
|
|||
|
|
|||
|
print(mw.Wid_Obj)
|
|||
|
|
|||
|
#==================================================
|
|||
|
class BaseButton(QPushButton):
|
|||
|
#1
|
|||
|
'''
|
|||
|
菜单栏的按钮的样式。
|
|||
|
'''
|
|||
|
def __init__(self, parent=None):
|
|||
|
|
|||
|
super(BaseButton, self).__init__(parent)
|
|||
|
|
|||
|
self.setMinimumWidth(70)
|
|||
|
self.setMaximumWidth(88)
|
|||
|
self.setMinimumHeight(self.width()) #保证是个正方形
|
|||
|
|
|||
|
self.setFocusPolicy(Qt.NoFocus) #无焦点,防止背景卡色
|
|||
|
self.setFlat(True) #无凸起阴影
|
|||
|
|
|||
|
self.clicked.connect(self._todo)
|
|||
|
|
|||
|
self.png = QLabel(self)
|
|||
|
|
|||
|
def _createLabel(self, path):
|
|||
|
'''
|
|||
|
path:主菜单图标的路径。
|
|||
|
'''
|
|||
|
self.png.resize(self.size())
|
|||
|
self.png_pixmap = QPixmap(path)
|
|||
|
self.png.setPixmap(self.png_pixmap)
|
|||
|
self.png.setScaledContents(True)
|
|||
|
pass
|
|||
|
|
|||
|
def _todo(self, *args, **kwgs):
|
|||
|
'''
|
|||
|
每个按钮要重新实现的功能函数。
|
|||
|
'''
|
|||
|
pass
|
|||
|
|
|||
|
def resizeEvent(self, e):
|
|||
|
self.setMinimumHeight(self.width())
|
|||
|
self.png.resize(self.size())
|
|||
|
|