【PyQt】(自制类)简易的控件画布

该博客介绍了如何使用Python的PyQt库创建一个简易的控件画布,支持控件层级放置、画布拖拽及滚轮缩放。作者通过自制类实现了这一功能,并注意到控件数量过多会导致性能问题。文中提供了测试代码和运行结果,展示了当画布上存在900个控件时的明显卡顿现象。
摘要由CSDN通过智能技术生成

说一下标题的意思,就是一个可往上面放QtWidgets控件(例如QLabelQPushButton)并且画布可拖拽缩放的一个简易画布类。
强调一下的就是,这和涂鸦画布(类比于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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值