欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

QRubberBand简介: 重新探索QRubberBand的功能与特点

最编程 2024-08-14 15:42:38
...

1、QRubberBand:橡皮筋选中:选中一个东西,显示其边框。一般是结合鼠标事件同时完成某项需求。单独没什么意义。

from PyQt5.Qt import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QRubberBand的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        # 橡皮控件需要定义其尺寸大小,位置对应尺寸
        # 借助其他方法设置一定的区域才可以显示出来
        rb = QRubberBand(QRubberBand.Rectangle, self)
        rb.setGeometry(10, 10, 60, 60)
        # 判断当前橡皮筋属性是否被显示
        print(rb.isVisible())
        rb.show()
    

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window = Window()
    window.resize(500, 500)
    window.show()

    sys.exit(app.exec_())

2、QRubberBand----案例

在一个空白窗口内,展示多个复选框控件,通过橡皮筋实现批量选中与取消选中效果。

当鼠标按下,需要创建一个橡皮筋控件,鼠标移动的时候,调整橡皮筋控件的范围区域,当松开鼠标,拿到橡皮筋选中区域做判定,那些子控件在选中区域范围内,改变他的选中标识。

from PyQt5.Qt import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QRubberBand----案例的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        # 0,添加子控件,复选框
        # 一行有四列,每列宽度为50
        for i in range(0, 30):
            cb = QCheckBox(self)
            cb.setText("{}".format(i))
            cb.move(i % 4 * 50, i // 4 * 60)
        # 1创建一个橡皮筋选中控件
        self.rb = QRubberBand(QRubberBand.Rectangle, self)

    def mousePressEvent(self, evt):
        # 2尺寸大小:鼠标点击的位置点,00,获取相对于窗口的局部点
        self.origin_pos = evt.pos()
        # 鼠标刚按下去是没有尺寸的,所以给他一个空的尺寸
        self.rb.setGeometry(QRect(self.origin_pos, QSize()))
        # 3展示橡皮筋控件,
        self.rb.show()

    def mouseMoveEvent(self, evt):
        # 调整橡皮筋选中控件的位置及尺寸,
        # .normalized()保证没有负数
        # 新的坐标点减去旧的坐标点,或者分别传递左上角和右下角坐标,显示选中区域
        self.rb.setGeometry(QRect(self.origin_pos, evt.pos()).normalized())

        # 反向选中效果


    def mouseReleaseEvent(self, evt):
        # 1 获取橡皮筋控件的尺寸范围
        rect = self.rb.geometry()
        # 2 遍历所有的子控件,查看,那些子控件在区域范围
        for child in self.children():
            # 判断一个矩形是否包含另外一个点或者另外一个矩形
            if rect.contains(child.geometry()) and child.inherits("QCheckBox"):
                print(child)
                # 切换状态
                child.toggle()

        self.rb.hide()

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window = Window()
    window.resize(500, 500)
    window.show()

    sys.exit(app.exec_())