import sys
import json
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import Qt
from collections import deque
selectedItems1 = []
class GraphicsScene(QtWidgets.QGraphicsScene):
def __init__(self, parent=None, ns=""):
# super(GraphicsScene, self).__init__(parent)
super().__init__(0,0,1280/1.2,720/1.2)
self.parent = parent
self._selectedItemVec = deque()
self.ns = ns
self.c1=(0,0)
self.c2=(0,0)
def selectItems(self):
print("selectItems called --");
x_start = int(min(self.c1[0],self.c2[0]));
x_end = int(max(self.c1[0],self.c2[0]));
y_start = int(min(self.c1[1],self.c2[1]));
y_end = int(max(self.c1[1],self.c2[1]));
for x in range(x_start, x_end+1):
for y in range(y_start, y_end+1):
item = self.itemAt(x,y,QtGui.QTransform())
if item:
if item not in selectedItems1:
selectedItems1.append(item)
item.setOpacity(0.1)
for i in range(len(selectedItems1)):
item1 = selectedItems1[i]
print("id:",item1.identifier);
def mouseReleaseEvent(self, event):
self.c2=(event.scenePos().x(),event.scenePos().y());
self.selectItems();
def mousePressEvent(self, event):
self.c1=(event.scenePos().x(),event.scenePos().y());
def createPathObject(data, identifier, frames, nFrames):
positions = data["positions"]
frames = data["frames"]
pathItem = QtWidgets.QGraphicsPathItem()
actualPath = QtGui.QPainterPath()
actualPath.moveTo(positions[0]["x"],positions[0]["y"])
colorset = [];
for i in range(len(positions)-1):
actualPath.setPen(QColor(frames[i]/nFrames, 106, 25)) #NOT WORKING
actualPath.lineTo(positions[i+1]["x"],positions[i+1]["y"])
pathItem.setPath(actualPath)
pathItem.identifier = identifier
pathItem.startFrame = frames[0]
pathItem.endFrame = frames[-1]
pathItem.frames = frames
pathItem.positions = data["positions"]
pathItem.colorset = colorset;
return pathItem
def refreshCanvas(scene, category_paths):
nFrames = category_paths["metaInfo"]["frames_count"]
print("Total number of frames:", nFrames)
for id in range(category_paths["LCV"]["count"]):
scene.addItem(createPathObject(category_paths["LCV"][str(id)], id, str(id), nFrames))
global selectedItems1
selectedItems1 = []
app = QtWidgets.QApplication(sys.argv)
scene = GraphicsScene()
refreshCanvas(scene, category_paths)
widget = QtWidgets.QGraphicsView(scene)
widget.setMouseTracking(1)
widget.setDragMode(QtWidgets.QGraphicsView.RubberBandDrag)
window = QtWidgets.QMainWindow()
window.setWindowTitle("hello")
buttons_layout = QtWidgets.QVBoxLayout()
layout = QtWidgets.QHBoxLayout()
layout.addWidget(widget)
refreshButton = QtWidgets.QPushButton("refresh")
refreshButton.pressed.connect(lambda: refreshCanvas(scene, category_paths))
layout.addWidget(refreshButton)
finalWidget = QtWidgets.QWidget()
finalWidget.setLayout(layout)
window.setCentralWidget(finalWidget)
window.show()
app.exec_()
Я пытался реализовать простой инструмент визуализации красочного пути с возможностью выбора линий, и это был кошмар.
Текущая проблема:
Я не могу изменить цвета для строки с помощью actualPath.setPen ()
Объяснение кода:
GraphicsScene наследует QGraphicsScene
selectItems находит строки, лежащие в прямоугольнике, созданном mouseReleaseEvent, а mousePressEvent
createPathObject создает QtWidgets.QGraphicsPathItem возвращает
refreshCanvas запрашивает pathItems (для createPathObject) и добавляет их в сцену
тело кода создает приложение, сцену, виджет, макет, окно и показывает окно.