Как привязать к программе отрисовку фигур(линии, прямоугольника), используя класс с двумя координатами
Как привязать к программе отрисовку фигур(линии, прямоугольника), используя класс, содержащий 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_())


