Рисование и выбор QGraphicsPathItem в PySide2 - PullRequest
0 голосов
/ 09 мая 2020
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) и добавляет их в сцену
тело кода создает приложение, сцену, виджет, макет, окно и показывает окно.

...