在图像的交互式选择区域中输出几个点,但不太了解 PyQt,无法选择合适的元素执行任务。希望通过 PyQt 选择一个矩形区域,并在这个区域中填充网格,网格的交点可被选择,但目前不知道如何实现。
2、解决方案
为了解决这个问题,可以使用 QGraphicsScene 和 QGraphicsView 来显示场景。其中 QGraphicsView 是 QGraphicsScene 的视图,它负责将场景映射到屏幕上。
下面是具体的实现步骤:
- 使用 scene->addPixmap 将图像添加到场景中。
- 使用 QRubberBand 在图像中选择一个矩形区域。
- 使用 view->mapToScene 将从 QRubberBand 获得的视口坐标转换为场景坐标。
- 使用 scene->addLine 在区域中添加线条。
- 在线条交点处添加小的圆形项目,使用 scene->addEllipse。这个函数返回 QGraphicsEllipseItem* 对象,使用圆形(0,0)中心。使用 item->setPos 将每个圆形移动到适当的位置。
- 使用 item->setFlag(QGraphicsItem::ItemIsSelectable) 使圆形项目可选择。现在可以使用鼠标点击选择项目。
- 如果想要使用自动 QRubberBand 启用项目选择,可以使用 view->dragMode(QGraphicsView::RubberBandDrag)。
- 使用 QGraphicsScene::selectedItems 来获取选定的项目,然后可以使用 item->pos() 获得项目的位置。
以下是一个示例代码片段,展示了如何使用 PyQt 来选择区域并填充网格:
import sys
from PyQt5 import QtGui, QtWidgets, QtCore
class GridScene(QtWidgets.QGraphicsScene):
def __init__(self, image):
super().__init__()
self.image = image
self.setSceneRect(0, 0, self.image.width(), self.image.height())
self.grid_size = 10 # Size of the grid cells in pixels
self.grid_lines = [] # List of grid lines
self.grid_points = [] # List of grid points
def add_image(self):
self.setBackgroundBrush(QtGui.QBrush(self.image))
def add_grid(self):
# Calculate the number of grid lines needed
num_grid_lines = int(self.sceneRect().width() / self.grid_size) + 1
# Create the grid lines
for i in range(num_grid_lines):
line = QtWidgets.QGraphicsLineItem()
line.setLine(i * self.grid_size, 0, i * self.grid_size, self.sceneRect().height())
line.setPen(QtGui.QPen(QtCore.Qt.black, 1))
self.grid_lines.append(line)
self.addItem(line)
# Create the grid points
for i in range(num_grid_lines):
for j in range(num_grid_lines):
point = QtWidgets.QGraphicsEllipseItem()
point.setRect(i * self.grid_size - 1, j * self.grid_size - 1, 2, 2)
point.setBrush(QtGui.QBrush(QtCore.Qt.black))
point.setFlags(QtWidgets.QGraphicsItem.ItemIsSelectable)
self.grid_points.append(point)
self.addItem(point)
def mousePressEvent(self, event):
# Check if the mouse is inside a grid point
for point in self.grid_points:
if point.rect().contains(event.pos()):
# Select the point
point.setSelected(True)
break
class GridView(QtWidgets.QGraphicsView):
def __init__(self):
super().__init__()
self.setDragMode(QtWidgets.QGraphicsView.RubberBandDrag)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
image = QtGui.QImage("image.png")
scene = GridScene(image)
scene.add_image()
scene.add_grid()
view = GridView()
view.setScene(scene)
view.show()
sys.exit(app.exec_())
这个示例代码首先创建一个 GridScene 对象,并添加了图像和网格。然后创建一个 GridView 对象,并将其设置为场景的视图。最后,显示视图并启动应用程序。