说一下标题的意思,就是一个可往上面放QtWidgets
控件(例如QLabel
、QPushButton
)并且画布可拖拽缩放的一个简易画布类。
强调一下的就是,这和涂鸦画布(类比于win自带的画图软件)不是同个东西。
只不过通过这个自制类我明白了一点的就是控件数量太多会造成明显卡顿(哪怕控件数量也才几百个),这让我对自己写的鸡肋玩意儿的整活程度又上升了一个档次(想想都鸡肋,写的这破玩意儿用哪才合适。
Python代码:
#XJ_Canvas.py
import numpy as np
from PyQt5.QtWidgets import QWidget
from PyQt5.QtCore import Qt,QRect
from XJ_MouseStatus import *
__all__=['XJ_Canvas']
class XJ_Canvas(QWidget):
__objs={
}#{weight:[obj,...]}
__weights={
}#{obj:weight}
__poses={
}#{obj:QRect}#不知道要咋起名,随便来算了
__matrix=None#转换矩阵(np.array),逻辑坐标→显示坐标
__mouseStatus=None#XJ_MouseStatus
def __init__(self):
super().__init__()
self.__objs={
}
self.__weights={
}
self.__poses={
}
self.__matrix=np.array([[3,0,0],[0,3,0],[0,0,1]])
self.__mouseStatus=XJ_MouseStatus()
def Opt_ObjectAdd(self,obj,weight=1,pos=QRect(0,0,1,1)):#添加控件(需要附加控件的显示权重,数值越小越优先),pos为控件位置
if(isinstance(obj.parent(),XJ_Canvas)):#obj曾出现在别的画布中
obj.parent().Opt_ObjectRemove(obj)
obj.setParent(self)
objs=self.__objs
weigs=self.__weights
poses=self.__poses
lst=objs.setdefault(weight,[])
if(obj in lst):
lst.remove(obj)
lst.insert(0,obj)
weigs[obj]=weight
poses[obj]=pos
keys=sorted(objs)
index=keys.index(weight)
if(index==0):#顶级
obj.raise_()
else:#置后
key_front=keys[index-1]
obj_front=objs[key_front][-1]
obj.stackUnder(obj_front)
obj.show()
self.__Update(obj)
def Opt_ObjectRemove(self,obj):#移除控件
if(obj in self.__weights):
self.__objs[self.__weights[obj]].pop(obj)
self.__weights.pop(obj)
obj.setParent(None)
obj.hide()
def Opt_OrderAlter(self,obj_move,obj_target,*,Above=False,Below=False):#使控件obj_move位置置于obj_target之上/下(取决于Above/Below取值),同时修改obj_move的权
objs=self.__objs
weigs=self.__weights
if(Above^Below):#有一值为真
if(obj_move in weigs and obj_target in weigs):#确保俩控件都在画布中
obj_m=obj_move
obj_t=obj_target
weig_m=weigs[obj_move]
weig_t=weigs[obj_target]
lst=objs[weig_t]
index=lst.index(weig_t)
objs[weig_m].remove(obj_m)
weigs[obj_m]=weig_t
obj_m.stackUnder(obj_t)
if(Above):#置上
obj_t.stackUnder(obj_m)
lst.insert(index,obj_m)
else:#置下
lst.insert(index+1,obj_m)
def Get_ObjectExist(self,obj):#判断控件是否存在
return obj in self.__weights
def Get_ObjectPosition(self,obj):#获取控件位置(控件不存在将返回无效QRect)
if(obj not in self.__weights):
return QRect()
return self.__poses[obj]
def