QRubberBand 橡皮筋选中框
-
描述
- 提供一个矩形或线来指示选择或边界
- 一般结合鼠标事件(鼠标点击、鼠标移动、鼠标释放)一同协作
mousePressEvent(self, evt) # 鼠标点击事件 mouseMoveEvent(self, evt) # 鼠标移动事件 mouseReleaseEvent(self, evt) # 鼠标释放事件
- 在鼠标点击事件中:设置控件位置、大小、显示橡皮筋选中控件
- 在鼠标移动事件中:更新橡皮筋选中控件大小
- 在鼠标释放事件中:获取框选对象、影藏橡皮筋选中控件
-
继承自:QWidget
-
功能作用
-
构造函数
QRubberBand(QRubberBand.Shape, parent: QWidget = None) # 创建对象的同时设置对象形状并设置父对象 # 参数:QRubberBand.Shape QRubberBand.Line # 设置形状为一条线 QRubberBand.Rectangle # 设置形状为矩形框
-
移动
move(x, y) # 通过数值设置移动位置 move(QPoint) # 通过QPoint对象设置移动位置 # QPoint(int, int) (x坐标,y坐标)
-
调整大小
resize(width, height) # 通过数值设置控件宽度和高度 resize(QSize) # 通过QSize对象设置控件宽度和高度 # QSize(int, int) (宽度,高度)
-
统一设置(坐标和大小)
setGeometry(int x, int y, int width, int height) # 通过x、y坐标、宽度、高度设置框选范围 setGeometry(QRect rect) # 通过QRect对象设置框选范围 # QRect(int, int, int, int) x坐标、y坐标、宽度、高度 # QRect(QPoint, QPoint) 左上角一个点(x,y),右下角一个点(x,y) # QRect(QPoint, QSize) 左上角一个点(x,y),QSize(宽度,高度) # QPoint可以通过 evt.pos() 直接获取 # QRect通过normalized()方法设置计算出来的宽和高保持为正数(鼠标点击后往左拉框选时) geometry() # 获取框选范围
-
形状获取
shape() -> QRubberBand.Shape # 获取橡皮筋选中控件对象的形状
-
关联内容
-
判断一个范围是否包含另一个范围
范围1.contains(范围2) # 判断控件是否在另一个控件内部,返回True/False # 范围可以通过 obj.geometry() 获取
-
判断一个控件是否继承自另一个控件
控件1.inherits("控件2类名") # 判断控件1是否继承自控件2类
-
可用信号
- 继承父类
-
代码示例
-
示例1:QRubberBand-功能作用
from PyQt5.Qt import * import sys class Windows(QWidget): def __init__(self): super().__init__() self.setWindowTitle('QRubberBand-功能作用') self.resize(500, 500) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): rbd = QRubberBand(QRubberBand.Rectangle, self) rbd.resize(100, 100) rbd.show() rbd.move(100,100) if __name__ == '__main__': app = QApplication(sys.argv) window = Windows() window.show() sys.exit(app.exec_())
-
案例2:在一个空白窗口内, 展示多个复选框控件,通过橡皮筋实现批量选中与取消选中效果
-
效果图
-
示例代码
from PyQt5.Qt import * import sys class Windows(QWidget): def __init__(self): super().__init__() self.setWindowTitle('QRubberBand-案例') self.resize(500, 500) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): self.rbd = QRubberBand(QRubberBand.Rectangle,self) for i in range(0, 30): cb = QCheckBox(self) cb.setText(str(i)) # 5 * 6 cb.move(i % 5 * 50 + 50, i // 5 * 50 + 50) def mousePressEvent(self, evt) -> None: self.rbd.setVisible(True) self.oldpos = evt.pos() self.rbd.setGeometry(QRect(evt.pos(),evt.pos())) def mouseMoveEvent(self, evt) -> None: self.rbd.setGeometry(QRect(self.oldpos,evt.pos()).normalized()) def mouseReleaseEvent(self, evt) -> None: self.rbd.setVisible(False) geo = self.rbd.geometry() for sub in self.children(): if geo.contains(sub.geometry()) and sub.inherits('QCheckBox'): sub.toggle() if __name__ == '__main__': app = QApplication(sys.argv) window = Windows() window.show() sys.exit(app.exec_())