Как привязать к программе отрисовку фигур(линии, прямоугольника), используя класс с двумя координатами

Как привязать к программе отрисовку фигур(линии, прямоугольника), используя класс, содержащий 2 точки с координатами. (фигуры тоже должны иметь свои классы).

введите сюда описание изображения

По поведению должен получится мини-векторный редактор, где можно ставить линии и прямоугольники нужного размера.

введите сюда описание изображения

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal
from PyQt5 import QtWidgets


class Editor(QMainWindow):

    def __init__(self):
        super().__init__()
        self.figure = None
        self.window()
        self.file_toolbar = None
        self.set_figure()
        
    def window(self):
        self.setGeometry(0, 0, 600, 500)
        self.setWindowTitle('Editor')
        self.createGraphicView()
        self.show()

    def set_figure(self):
        self.file_toolbar = QToolBar("figure")
        self.file_toolbar.setIconSize(QSize(14, 14))
        self.addToolBar(self.file_toolbar)
        #кнопка line
        line_action = QAction(QIcon("images/line.png"), 'line', self)
        line_action.setStatusTip("Open file")
        self.file_toolbar.addAction(line_action)
        #кнопка rectangle
        rect_action = QAction(QIcon("images/rect.png"), 'rect', self)
        rect_action.setStatusTip("Open file")
        self.file_toolbar.addAction(rect_action)

    def createGraphicView(self):
        self.scene = QGraphicsScene()
        graphicView = QGraphicsView(self.scene, self)
        graphicView.setGeometry(0, 0, 600, 500)
    
def main():
    app = QtWidgets.QApplication(sys.argv)
    g = Editor()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

Ответы (1 шт):

Автор решения: S. Nick

я понял вашу задачу так:

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *


class ModelessDialog(QDialog):
    def __init__(self, item, parent=None):
        super().__init__(parent)
        self.setWindowTitle("Dialog")
        self.parent = parent
        self.item = item
        if self.item == 'line_item':
            text = 'Введите координаты двух концов линии.'
        else: 
            text = 'Введите координаты позиции и размера прямоугольника.'
        
        lbl = QLabel(text)
        self.sb1 = QSpinBox()
        self.sb1.setRange(0, 500)
        self.sb2 = QSpinBox()
        self.sb2.setRange(0, 500)
        self.sb3 = QSpinBox()
        self.sb3.setRange(0, 500)
        self.sb4 = QSpinBox()        
        self.sb4.setRange(0, 500)
        
        buttonBox = QDialogButtonBox(
            QDialogButtonBox.Cancel|QDialogButtonBox.Apply)

        layout = QFormLayout(self)
        layout.addRow(lbl)
        layout.addRow(QLabel("x1:"), self.sb1)
        layout.addRow(QLabel("y1:"), self.sb2)
        layout.addRow(QLabel("x2:") if self.item == 'line_item' else 'width', self.sb3)
        layout.addRow(QLabel("y2:") if self.item == 'line_item' else 'height', self.sb4)
        layout.addRow(buttonBox) 

        applyBtn = buttonBox.button(QDialogButtonBox.Apply)
        applyBtn.clicked.connect(self.apply)
        cancelBtn = buttonBox.button(QDialogButtonBox.Cancel)
        cancelBtn.clicked.connect(self.reject)
        
    def apply(self):
        if self.item == 'line_item':
            line = QGraphicsLineItem()
            line.setLine(self.sb1.value(), self.sb2.value(), self.sb3.value(), self.sb4.value())
            self.parent.scene.addItem(line)        
        else:
            rect = QGraphicsRectItem()
            rect.setRect(self.sb1.value(), self.sb2.value(), self.sb3.value(), self.sb4.value())
            self.parent.scene.addItem(rect)        
        self.close()


class Editor(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.window()
        self.set_figure()
        
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)   
        mainLayout = QVBoxLayout(self.centralWidget)
        mainLayout.addWidget(self.graphicView)
        
    def window(self):
        self.resize(540, 540)
        self.setWindowTitle('Editor')
        self.createGraphicView()

    def set_figure(self):
        self.file_toolbar = QToolBar("figure")
        self.file_toolbar.setIconSize(QSize(14, 14))
        
        self.basicToolBar = self.addToolBar(self.file_toolbar)
        
        line_action = QAction(QIcon('Ok.png'), 'Line', self)
        line_action.setStatusTip("Open file")
        line_action.triggered.connect(self.line_item)           # +
        self.file_toolbar.addAction(line_action)
        rect_action = QAction(QIcon('im.png'), 'Rect', self)
        rect_action.triggered.connect(self.rect_item)           # +
        rect_action.setStatusTip("Open file")
        self.file_toolbar.addAction(rect_action)

    def createGraphicView(self):
        self.scene = QGraphicsScene()
        self.scene.setSceneRect(0, 0, 520, 520)
        self.graphicView = QGraphicsView(self.scene, self)
        self.graphicView.resize(540, 540)
        
    def line_item(self):
        dialog = ModelessDialog("line_item", self)
        dialog.exec()        

    def rect_item(self):
        dialog = ModelessDialog("rect_item", self)
        dialog.exec() 


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    g = Editor()
    g.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка