python - 在 QGraphicsScene 中移动 QlineF
问题描述
我试图了解如何在 QGraphicsScene 中移动/转换图形项目。
在我的代码中,我将带有场景的 QGraphicView 定义为 QGraphicsScene。然后我用 QLineF 创建了一条线“l2”。然后我将“l2”定义为 QGraphicsItem“lnk”,并定义 pen、isSelectable 和 isMovable。我用“addItem”将它添加到场景中
后记我阅读了起点和终点,操纵终点并希望在场景中更新线。在这里我失败了。
我的代码是
self.gvCanvas.setGeometry(QtCore.QRect(20, 10, 501, 501))
self.scene = QtWidgets.QGraphicsScene()
l2 = QtCore.QLineF(100,100,300,70)
penlnk = QtGui.QPen(QtCore.Qt.black,3,QtCore.Qt.SolidLine)
lnk = QGraphicsLineItem(l2)
lnk.setPen(penlnk)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
self.scene.addItem(lnk)
pt1 = l2.p1()
pt2 = l2.p2()
xpos = pt2.x()+1500
ypos = pt2.y()
ypos = ypos+500
ptnew=QtCore.QPoint(xpos,ypos)
l2 = QtCore.QLineF(pt1,ptnew)
我尝试了“setLine(l2)”、“scene.update()”等。没有任何效果。
我可以先删除“l2”行,然后再新建。但这肯定不是正确的方法!?!
解决方案
QGraphicsLineItem 复制了 l2 的值,所以修改 l2 不会修改 QGraphicsLineItem,你要做的就是使用setLine()为 item 设置新行,这个方法会在内部调用该update()
方法:
# ...
ptnew=QtCore.QPoint(xpos,ypos)
l2 = QtCore.QLineF(pt1,ptnew)
lnk.setLine(l2)
您以前的代码可以简化为以下内容:
self.gvCanvas.setGeometry(QtCore.QRect(20, 10, 501, 501))
self.scene = QtWidgets.QGraphicsScene()
l2 = QtCore.QLineF(100,100,300,70)
penlnk = QtGui.QPen(QtCore.Qt.black, 3, QtCore.Qt.SolidLine)
lnk = QGraphicsLineItem(l2)
lnk.setPen(penlnk)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
self.scene.addItem(lnk)
l2.setP2(l2.p2() + QtCore.QPointF(1500, 500))
lnk.setLine(l2)
推荐阅读
- javascript - 未捕获的错误、语法错误、无法识别的表达式 [JQUERY]
- debugging - clion 调试器“无法找到和加载段”
- video-streaming - GStreamer - RTSP 流到 FLV 文件
- sql-server - SQL Server:将 IPv6 转换为 INTEGER
- sql - 用于将数据库导出到 .bacpac 文件的 Azure ARM 模板
- ruby - 有没有办法使用 Gosu 无限期地使用光标滚动地图
- c++ - 代码运行但输入值后不显示输出
- pointers - 如何修改嵌套结构的属性值
- ruby-on-rails - 没有路由匹配 [POST] "/session.account"
- oracle - 试图通过传递值来调用参数化的 oracle 函数