PyQGIS开发 实现拉框并在2秒后使框消失
时间: 2024-06-08 15:11:16 浏览: 16
实现这个功能需要使用 PyQGIS 中的 MapCanvas 类和 QTimer 类。具体实现步骤如下:
1. 定义一个类,该类继承自 QgsMapTool 类,用于实现拉框功能。
```python
class BoxSelectTool(QgsMapTool):
def __init__(self, canvas):
QgsMapTool.__init__(self, canvas)
self.canvas = canvas
self.rect = None
self.isEmittingPoint = False
```
2. 重写 QgsMapTool 类的 mousePressEvent() 和 mouseMoveEvent() 方法,实现拉框功能。在 mousePressEvent() 方法中记录鼠标按下的位置,而在 mouseMoveEvent() 方法中计算矩形框的位置并在地图画布上绘制出来。
```python
def mousePressEvent(self, event):
self.isEmittingPoint = True
self.startPoint = self.toMapCoordinates(event.pos())
self.rect = QgsRubberBand(self.canvas, QgsWkbTypes.PolygonGeometry)
self.rect.setColor(Qt.red)
self.rect.setWidth(1)
self.timer = QTimer()
self.timer.timeout.connect(self.hideRect)
self.timer.start(2000)
def mouseMoveEvent(self, event):
if not self.isEmittingPoint:
return
self.rect.reset(QgsWkbTypes.PolygonGeometry)
endPoint = self.toMapCoordinates(event.pos())
point1 = QgsPointXY(self.startPoint.x(), self.startPoint.y())
point2 = QgsPointXY(self.startPoint.x(), endPoint.y())
point3 = QgsPointXY(endPoint.x(), endPoint.y())
point4 = QgsPointXY(endPoint.x(), self.startPoint.y())
self.rect.addPoint(point1, False)
self.rect.addPoint(point2, False)
self.rect.addPoint(point3, False)
self.rect.addPoint(point4, True)
self.rect.show()
```
3. 定义一个 hideRect() 方法,在定时器触发的时候调用该方法,实现框消失功能。
```python
def hideRect(self):
self.rect.hide()
self.isEmittingPoint = False
```
4. 在主程序中实例化 BoxSelectTool 类,并将其设置为当前地图工具。
```python
canvas = iface.mapCanvas()
boxSelectTool = BoxSelectTool(canvas)
canvas.setMapTool(boxSelectTool)
```
整个实现代码如下:
```python
from qgis.core import *
from qgis.gui import *
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class BoxSelectTool(QgsMapTool):
def __init__(self, canvas):
QgsMapTool.__init__(self, canvas)
self.canvas = canvas
self.rect = None
self.isEmittingPoint = False
def mousePressEvent(self, event):
self.isEmittingPoint = True
self.startPoint = self.toMapCoordinates(event.pos())
self.rect = QgsRubberBand(self.canvas, QgsWkbTypes.PolygonGeometry)
self.rect.setColor(Qt.red)
self.rect.setWidth(1)
self.timer = QTimer()
self.timer.timeout.connect(self.hideRect)
self.timer.start(2000)
def mouseMoveEvent(self, event):
if not self.isEmittingPoint:
return
self.rect.reset(QgsWkbTypes.PolygonGeometry)
endPoint = self.toMapCoordinates(event.pos())
point1 = QgsPointXY(self.startPoint.x(), self.startPoint.y())
point2 = QgsPointXY(self.startPoint.x(), endPoint.y())
point3 = QgsPointXY(endPoint.x(), endPoint.y())
point4 = QgsPointXY(endPoint.x(), self.startPoint.y())
self.rect.addPoint(point1, False)
self.rect.addPoint(point2, False)
self.rect.addPoint(point3, False)
self.rect.addPoint(point4, True)
self.rect.show()
def mouseReleaseEvent(self, event):
self.isEmittingPoint = False
def hideRect(self):
self.rect.hide()
self.isEmittingPoint = False
canvas = iface.mapCanvas()
boxSelectTool = BoxSelectTool(canvas)
canvas.setMapTool(boxSelectTool)
```
运行该程序,即可实现拉框并在 2 秒后使框消失的功能。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)