我在QGraphicscene上单击鼠标保存点,将其附加到列表中,并通过循环列表创建QGraphicsPolygonItem
我使用一个定制的QGraphicscene,每当出现鼠标按下事件时,它都会发出位置信息。代码如下。(学分为SignalHelper class)
class SignalHelper(QObject):
messageSignal = QtCore.Signal(object)
class Scene(QGraphicsScene):
def __init__(self, parent=None):
super(Scene, self).__init__(parent)
self.helper = SignalHelper()
def mousePressEvent(self, event):
self.helper.messageSignal.emit(event.scenePos())
这是我的主窗口的代码
class main_window(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(100, 100, 500, 500)
self.pen = QtGui.QPen(QtGui.QColor(0,0,0))
self.pen.setWidth(5)
self.view = QGraphicsView(self)
self.scene = Scene()
self.btn_record_points = QPushButton("Record")
self.btn_finished = QPushButton("Finished")
self.view.setSceneRect(0, 0, 500,500)
self.view.setScene(self.scene)
vbox = QVBoxLayout(self)
vbox.addWidget(self.view)
vbox.addWidget(self.btn_record_points)
vbox.addWidget(self.btn_finished)
self.setLayout(vbox)
self.point_list = []
self.record_points = False
#Signals
self.btn_record_points.clicked.connect(self.enable_record_points)
self.btn_finished.clicked.connect(self.create_polygon)
self.scene.helper.messageSignal.connect(self.draw_points)
def create_polygon(self):
# Remove ellipses
drawn_points = self.scene.items()
for i in drawn_points:
self.scene.removeItem(i)
polygon = QGraphicsPolygonItem(QtGui.QPolygonF(self.point_list))
polygon.setFlag(QGraphicsItem.ItemIsMovable, True)
self.scene.addItem(polygon)
self.record_points = False
self.point_list.clear()
QtCore.Slot(QtCore.QPointF)
def draw_points(self, point):
if self.record_points == True:
self.point_list.append(point)
self.scene.addEllipse(point.toTuple()[0], point.toTuple()[1], 1, 1)
QtCore.Slot(bool)
def enable_record_points(self):
self.record_points = True
以下是随机多边形的示例:
关于如何使用的说明:
现在多边形已经创建,有没有办法通过拖动其角点来调整多边形的大小
通过“拖动多边形的角来调整多边形的大小”我想象您想要移动多边形的点
因此,这里有一种方法
因此,首先使多边形可选择,一旦选定多边形,就在多边形的点上迭代并在每个点上绘制一个椭圆。存储椭圆、多边形、点和索引映射
现在,通过迭代映射列表来检查选择了哪个椭圆,然后使用此椭圆、多边形索引映射来更新多边形的特定点
以下是一个示例(您可以改进):
输出:
相关问题 更多 >
编程相关推荐