pyqt5-橡皮筋控件QRubberBand

 

 

提供一个矩形或线来指示选择或边界

一般结合鼠标事件一同协作

继承于 QWidget  

import sys
from PyQt5.QtWidgets import QApplication, QWidget,QRubberBand,QCheckBox
from PyQt5.QtCore import QRect,QSize

class Demo(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(300,300)

        #rb=QRubberBand(QRubberBand.Rectangle,self)  #创建橡皮筋控件
        #参数:橡皮筋的轮廓
        #QRubberBand.Line=0  线
        #QRubberBand.Rectangle=1 矩形

        #rb.setGeometry(10, 10, 50, 40)  #位置和大小

        #其它
        #move(x, y)    move(QPoint)
        #resize(width, height)      resize(QSize)
        #setGeometry(QRect rect)
        #shape() -> QRubberBand.Shape     形状获取

        #rb.show()  #显示
        #一般是不显示的,用鼠标选择时才显示

        #案例
        for i in range(0,30):
            cb=QCheckBox(self)
            cb.setText(str(i))
            cb.move(i%4*50,i//4*30)
            #50表示每列的宽度   30表示每行的高度
            #i%4  表示第i列      i//4  表示第几行

            self.rb = QRubberBand(QRubberBand.Rectangle, self)  # 创建橡皮筋控件

    def mousePressEvent(self, event):  # 鼠标键按下时调用
            #1.尺寸:鼠标的点击位置
            #2.展示橡皮筋控件

        self.weizi=event.pos()
        self.rb.setGeometry(QRect(self.weizi,QSize()))
        self.rb.show()


    def mouseMoveEvent(self, event):  # 鼠标移动事件
            #调整橡皮筋控件的尺寸
        self.rb.setGeometry(QRect(self.weizi, event.pos()).normalized())
            #normalized()  使鼠标往下往上归一化,如果width<0 交换左右角;如果height<0,就交换顶角和底角
            #我不理解的问题:QRect的第二个参数不是应该是矩形的width和height,event.pos()不是鼠标的位置吗,它不是宽和高,我认为应该减去原点才是宽和高啊?请理解的学友给我解释解释

        pass

    def mouseReleaseEvent(self, event):  # 鼠标键释放时调用
            #1.获取橡皮筋控件的尺寸范围
            #2.遍历所有的子控件,查看哪些控件在区域范围
        rect=self.rb.geometry()
        for child in self.children():
            if rect.contains(child.geometry()) and child.inherits('QCheckBox'):
                #contains  rect的范围是否包含参数的范围
                #child.inherits('QCheckBox')    child继承于QCheckBox
                child.toggle()
            self.rb.hide()
        pass


    def AA(self,val):
        print(val)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

 

posted @ 2019-06-14 12:45  天子骄龙  阅读(1297)  评论(0编辑  收藏  举报