aboutsummaryrefslogtreecommitdiffstats
path: root/examples/widgets/graphicsview/diagramscene/diagramscene.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/widgets/graphicsview/diagramscene/diagramscene.py')
-rw-r--r--examples/widgets/graphicsview/diagramscene/diagramscene.py1150
1 files changed, 564 insertions, 586 deletions
diff --git a/examples/widgets/graphicsview/diagramscene/diagramscene.py b/examples/widgets/graphicsview/diagramscene/diagramscene.py
index 3890782c4..60e05613c 100644
--- a/examples/widgets/graphicsview/diagramscene/diagramscene.py
+++ b/examples/widgets/graphicsview/diagramscene/diagramscene.py
@@ -1,300 +1,276 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import math
+import sys
-from PySide2 import QtCore, QtGui, QtWidgets
+from PySide6.QtCore import (QLineF, QPointF, QRect, QRectF, QSize, QSizeF, Qt,
+ Signal, Slot)
+from PySide6.QtGui import (QAction, QBrush, QColor, QFont, QIcon, QIntValidator,
+ QPainter, QPainterPath, QPen, QPixmap, QPolygonF)
+from PySide6.QtWidgets import (QAbstractButton, QApplication, QButtonGroup,
+ QComboBox, QFontComboBox, QGraphicsItem, QGraphicsLineItem,
+ QGraphicsPolygonItem, QGraphicsTextItem,
+ QGraphicsScene, QGraphicsView, QGridLayout,
+ QHBoxLayout, QLabel, QMainWindow, QMenu,
+ QMessageBox, QSizePolicy, QToolBox, QToolButton,
+ QWidget)
-import diagramscene_rc
+import diagramscene_rc # noqa: F401
-class Arrow(QtWidgets.QGraphicsLineItem):
+class Arrow(QGraphicsLineItem):
def __init__(self, startItem, endItem, parent=None, scene=None):
- super(Arrow, self).__init__(parent, scene)
+ super().__init__(parent, scene)
- self.arrowHead = QtGui.QPolygonF()
+ self._arrow_head = QPolygonF()
- self.myStartItem = startItem
- self.myEndItem = endItem
- self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
- self.myColor = QtCore.Qt.black
- self.setPen(QtGui.QPen(self.myColor, 2, QtCore.Qt.SolidLine,
- QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
+ self._my_start_item = startItem
+ self._my_end_item = endItem
+ self.setFlag(QGraphicsItem.ItemIsSelectable, True)
+ self._my_color = Qt.black
+ self.setPen(QPen(self._my_color, 2, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
- def setColor(self, color):
- self.myColor = color
+ def set_color(self, color):
+ self._my_color = color
- def startItem(self):
- return self.myStartItem
+ def start_item(self):
+ return self._my_start_item
- def endItem(self):
- return self.myEndItem
+ def end_item(self):
+ return self._my_end_item
def boundingRect(self):
extra = (self.pen().width() + 20) / 2.0
p1 = self.line().p1()
p2 = self.line().p2()
- return QtCore.QRectF(p1, QtCore.QSizeF(p2.x() - p1.x(), p2.y() - p1.y())).normalized().adjusted(-extra, -extra, extra, extra)
+ rect = QRectF(p1, QSizeF(p2.x() - p1.x(), p2.y() - p1.y()))
+ return rect.normalized().adjusted(-extra, -extra, extra, extra)
def shape(self):
path = super(Arrow, self).shape()
- path.addPolygon(self.arrowHead)
+ path.addPolygon(self._arrow_head)
return path
- def updatePosition(self):
- line = QtCore.QLineF(self.mapFromItem(self.myStartItem, 0, 0), self.mapFromItem(self.myEndItem, 0, 0))
- self.setLine(line)
+ def update_position(self):
+ start = self.mapFromItem(self._my_start_item, 0, 0)
+ end = self.mapFromItem(self._my_end_item, 0, 0)
+ self.setLine(QLineF(start, end))
def paint(self, painter, option, widget=None):
- if (self.myStartItem.collidesWithItem(self.myEndItem)):
+ if (self._my_start_item.collidesWithItem(self._my_end_item)):
return
- myStartItem = self.myStartItem
- myEndItem = self.myEndItem
- myColor = self.myColor
- myPen = self.pen()
- myPen.setColor(self.myColor)
- arrowSize = 20.0
- painter.setPen(myPen)
- painter.setBrush(self.myColor)
-
- centerLine = QtCore.QLineF(myStartItem.pos(), myEndItem.pos())
- endPolygon = myEndItem.polygon()
- p1 = endPolygon.at(0) + myEndItem.pos()
-
- intersectPoint = QtCore.QPointF()
- for i in endPolygon:
- p2 = i + myEndItem.pos()
- polyLine = QtCore.QLineF(p1, p2)
- intersectType, intersectPoint = polyLine.intersect(centerLine)
- if intersectType == QtCore.QLineF.BoundedIntersection:
+ my_start_item = self._my_start_item
+ my_end_item = self._my_end_item
+ my_color = self._my_color
+ my_pen = self.pen()
+ my_pen.setColor(self._my_color)
+ arrow_size = 20.0
+ painter.setPen(my_pen)
+ painter.setBrush(self._my_color)
+
+ center_line = QLineF(my_start_item.pos(), my_end_item.pos())
+ end_polygon = my_end_item.polygon()
+ p1 = end_polygon.at(0) + my_end_item.pos()
+
+ intersect_point = QPointF()
+ for i in end_polygon:
+ p2 = i + my_end_item.pos()
+ poly_line = QLineF(p1, p2)
+ intersectType, intersect_point = poly_line.intersects(center_line)
+ if intersectType == QLineF.BoundedIntersection:
break
p1 = p2
- self.setLine(QtCore.QLineF(intersectPoint, myStartItem.pos()))
+ self.setLine(QLineF(intersect_point, my_start_item.pos()))
line = self.line()
angle = math.acos(line.dx() / line.length())
if line.dy() >= 0:
angle = (math.pi * 2.0) - angle
- arrowP1 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi / 3.0) * arrowSize,
- math.cos(angle + math.pi / 3) * arrowSize)
- arrowP2 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi - math.pi / 3.0) * arrowSize,
- math.cos(angle + math.pi - math.pi / 3.0) * arrowSize)
+ arrow_head1 = QPointF(math.sin(angle + math.pi / 3.0) * arrow_size,
+ math.cos(angle + math.pi / 3) * arrow_size)
+ arrow_p1 = line.p1() + arrow_head1
+ arrow_head2 = QPointF(math.sin(angle + math.pi - math.pi / 3.0) * arrow_size,
+ math.cos(angle + math.pi - math.pi / 3.0) * arrow_size)
+ arrow_p2 = line.p1() + arrow_head2
- self.arrowHead.clear()
- for point in [line.p1(), arrowP1, arrowP2]:
- self.arrowHead.append(point)
+ self._arrow_head.clear()
+ for point in [line.p1(), arrow_p1, arrow_p2]:
+ self._arrow_head.append(point)
painter.drawLine(line)
- painter.drawPolygon(self.arrowHead)
+ painter.drawPolygon(self._arrow_head)
if self.isSelected():
- painter.setPen(QtGui.QPen(myColor, 1, QtCore.Qt.DashLine))
- myLine = QtCore.QLineF(line)
- myLine.translate(0, 4.0)
- painter.drawLine(myLine)
- myLine.translate(0,-8.0)
- painter.drawLine(myLine)
+ painter.setPen(QPen(my_color, 1, Qt.DashLine))
+ my_line = QLineF(line)
+ my_line.translate(0, 4.0)
+ painter.drawLine(my_line)
+ my_line.translate(0, -8.0)
+ painter.drawLine(my_line)
-class DiagramTextItem(QtWidgets.QGraphicsTextItem):
- lostFocus = QtCore.Signal(QtWidgets.QGraphicsTextItem)
+class DiagramTextItem(QGraphicsTextItem):
+ lost_focus = Signal(QGraphicsTextItem)
- selectedChange = QtCore.Signal(QtWidgets.QGraphicsItem)
+ selected_change = Signal(QGraphicsItem)
def __init__(self, parent=None, scene=None):
- super(DiagramTextItem, self).__init__(parent, scene)
+ super().__init__(parent, scene)
- self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
- self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable)
+ self.setFlag(QGraphicsItem.ItemIsMovable)
+ self.setFlag(QGraphicsItem.ItemIsSelectable)
def itemChange(self, change, value):
- if change == QtWidgets.QGraphicsItem.ItemSelectedChange:
- self.selectedChange.emit(self)
+ if change == QGraphicsItem.ItemSelectedChange:
+ self.selected_change.emit(self)
return value
def focusOutEvent(self, event):
- self.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
- self.lostFocus.emit(self)
+ self.setTextInteractionFlags(Qt.NoTextInteraction)
+ self.lost_focus.emit(self)
super(DiagramTextItem, self).focusOutEvent(event)
def mouseDoubleClickEvent(self, event):
- if self.textInteractionFlags() == QtCore.Qt.NoTextInteraction:
- self.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction)
+ if self.textInteractionFlags() == Qt.NoTextInteraction:
+ self.setTextInteractionFlags(Qt.TextEditorInteraction)
super(DiagramTextItem, self).mouseDoubleClickEvent(event)
-class DiagramItem(QtWidgets.QGraphicsPolygonItem):
+class DiagramItem(QGraphicsPolygonItem):
Step, Conditional, StartEnd, Io = range(4)
- def __init__(self, diagramType, contextMenu, parent=None, scene=None):
- super(DiagramItem, self).__init__(parent, scene)
+ def __init__(self, diagram_type, contextMenu, parent=None, scene=None):
+ super().__init__(parent, scene)
self.arrows = []
- self.diagramType = diagramType
- self.myContextMenu = contextMenu
+ self.diagram_type = diagram_type
+ self._my_context_menu = contextMenu
- path = QtGui.QPainterPath()
- if self.diagramType == self.StartEnd:
+ path = QPainterPath()
+ if self.diagram_type == self.StartEnd:
path.moveTo(200, 50)
path.arcTo(150, 0, 50, 50, 0, 90)
path.arcTo(50, 0, 50, 50, 90, 90)
path.arcTo(50, 50, 50, 50, 180, 90)
path.arcTo(150, 50, 50, 50, 270, 90)
path.lineTo(200, 25)
- self.myPolygon = path.toFillPolygon()
- elif self.diagramType == self.Conditional:
- self.myPolygon = QtGui.QPolygonF([
- QtCore.QPointF(-100, 0), QtCore.QPointF(0, 100),
- QtCore.QPointF(100, 0), QtCore.QPointF(0, -100),
- QtCore.QPointF(-100, 0)])
- elif self.diagramType == self.Step:
- self.myPolygon = QtGui.QPolygonF([
- QtCore.QPointF(-100, -100), QtCore.QPointF(100, -100),
- QtCore.QPointF(100, 100), QtCore.QPointF(-100, 100),
- QtCore.QPointF(-100, -100)])
+ self._my_polygon = path.toFillPolygon()
+ elif self.diagram_type == self.Conditional:
+ self._my_polygon = QPolygonF([
+ QPointF(-100, 0), QPointF(0, 100),
+ QPointF(100, 0), QPointF(0, -100),
+ QPointF(-100, 0)])
+ elif self.diagram_type == self.Step:
+ self._my_polygon = QPolygonF([
+ QPointF(-100, -100), QPointF(100, -100),
+ QPointF(100, 100), QPointF(-100, 100),
+ QPointF(-100, -100)])
else:
- self.myPolygon = QtGui.QPolygonF([
- QtCore.QPointF(-120, -80), QtCore.QPointF(-70, 80),
- QtCore.QPointF(120, 80), QtCore.QPointF(70, -80),
- QtCore.QPointF(-120, -80)])
+ self._my_polygon = QPolygonF([
+ QPointF(-120, -80), QPointF(-70, 80),
+ QPointF(120, 80), QPointF(70, -80),
+ QPointF(-120, -80)])
- self.setPolygon(self.myPolygon)
- self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
- self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
+ self.setPolygon(self._my_polygon)
+ self.setFlag(QGraphicsItem.ItemIsMovable, True)
+ self.setFlag(QGraphicsItem.ItemIsSelectable, True)
- def removeArrow(self, arrow):
+ def remove_arrow(self, arrow):
try:
self.arrows.remove(arrow)
except ValueError:
pass
- def removeArrows(self):
+ def remove_arrows(self):
for arrow in self.arrows[:]:
- arrow.startItem().removeArrow(arrow)
- arrow.endItem().removeArrow(arrow)
+ arrow.start_item().remove_arrow(arrow)
+ arrow.end_item().remove_arrow(arrow)
self.scene().removeItem(arrow)
- def addArrow(self, arrow):
+ def add_arrow(self, arrow):
self.arrows.append(arrow)
def image(self):
- pixmap = QtGui.QPixmap(250, 250)
- pixmap.fill(QtCore.Qt.transparent)
- painter = QtGui.QPainter(pixmap)
- painter.setPen(QtGui.QPen(QtCore.Qt.black, 8))
- painter.translate(125, 125)
- painter.drawPolyline(self.myPolygon)
+ pixmap = QPixmap(250, 250)
+ pixmap.fill(Qt.transparent)
+ with QPainter(pixmap) as painter:
+ painter.setPen(QPen(Qt.black, 8))
+ painter.translate(125, 125)
+ painter.drawPolyline(self._my_polygon)
return pixmap
def contextMenuEvent(self, event):
self.scene().clearSelection()
self.setSelected(True)
- self.myContextMenu.exec_(event.screenPos())
+ self._my_context_menu.exec(event.screenPos())
def itemChange(self, change, value):
- if change == QtWidgets.QGraphicsItem.ItemPositionChange:
+ if change == QGraphicsItem.ItemPositionChange:
for arrow in self.arrows:
arrow.updatePosition()
return value
-class DiagramScene(QtWidgets.QGraphicsScene):
- InsertItem, InsertLine, InsertText, MoveItem = range(4)
+class DiagramScene(QGraphicsScene):
+ InsertItem, InsertLine, InsertText, MoveItem = range(4)
- itemInserted = QtCore.Signal(DiagramItem)
+ item_inserted = Signal(DiagramItem)
- textInserted = QtCore.Signal(QtWidgets.QGraphicsTextItem)
+ text_inserted = Signal(QGraphicsTextItem)
- itemSelected = QtCore.Signal(QtWidgets.QGraphicsItem)
+ item_selected = Signal(QGraphicsItem)
def __init__(self, itemMenu, parent=None):
- super(DiagramScene, self).__init__(parent)
+ super().__init__(parent)
- self.myItemMenu = itemMenu
- self.myMode = self.MoveItem
- self.myItemType = DiagramItem.Step
+ self._my_item_menu = itemMenu
+ self._my_mode = self.MoveItem
+ self._my_item_type = DiagramItem.Step
self.line = None
- self.textItem = None
- self.myItemColor = QtCore.Qt.white
- self.myTextColor = QtCore.Qt.black
- self.myLineColor = QtCore.Qt.black
- self.myFont = QtGui.QFont()
-
- def setLineColor(self, color):
- self.myLineColor = color
- if self.isItemChange(Arrow):
+ self._text_item = None
+ self._my_item_color = Qt.white
+ self._my_text_color = Qt.black
+ self._my_line_color = Qt.black
+ self._my_font = QFont()
+
+ def set_line_color(self, color):
+ self._my_line_color = color
+ if self.is_item_change(Arrow):
item = self.selectedItems()[0]
- item.setColor(self.myLineColor)
+ item.set_color(self._my_line_color)
self.update()
- def setTextColor(self, color):
- self.myTextColor = color
- if self.isItemChange(DiagramTextItem):
+ def set_text_color(self, color):
+ self._my_text_color = color
+ if self.is_item_change(DiagramTextItem):
item = self.selectedItems()[0]
- item.setDefaultTextColor(self.myTextColor)
+ item.setDefaultTextColor(self._my_text_color)
- def setItemColor(self, color):
- self.myItemColor = color
- if self.isItemChange(DiagramItem):
+ def set_item_color(self, color):
+ self._my_item_color = color
+ if self.is_item_change(DiagramItem):
item = self.selectedItems()[0]
- item.setBrush(self.myItemColor)
+ item.setBrush(self._my_item_color)
- def setFont(self, font):
- self.myFont = font
- if self.isItemChange(DiagramTextItem):
+ def set_font(self, font):
+ self._my_font = font
+ if self.is_item_change(DiagramTextItem):
item = self.selectedItems()[0]
- item.setFont(self.myFont)
+ item.setFont(self._my_font)
- def setMode(self, mode):
- self.myMode = mode
+ def set_mode(self, mode):
+ self._my_mode = mode
- def setItemType(self, type):
- self.myItemType = type
+ def set_item_type(self, type):
+ self._my_item_type = type
- def editorLostFocus(self, item):
+ def editor_lost_focus(self, item):
cursor = item.textCursor()
cursor.clearSelection()
item.setTextCursor(cursor)
@@ -304,521 +280,523 @@ class DiagramScene(QtWidgets.QGraphicsScene):
item.deleteLater()
def mousePressEvent(self, mouseEvent):
- if (mouseEvent.button() != QtCore.Qt.LeftButton):
+ if (mouseEvent.button() != Qt.LeftButton):
return
- if self.myMode == self.InsertItem:
- item = DiagramItem(self.myItemType, self.myItemMenu)
- item.setBrush(self.myItemColor)
+ if self._my_mode == self.InsertItem:
+ item = DiagramItem(self._my_item_type, self._my_item_menu)
+ item.setBrush(self._my_item_color)
self.addItem(item)
item.setPos(mouseEvent.scenePos())
- self.itemInserted.emit(item)
- elif self.myMode == self.InsertLine:
- self.line = QtWidgets.QGraphicsLineItem(QtCore.QLineF(mouseEvent.scenePos(),
- mouseEvent.scenePos()))
- self.line.setPen(QtGui.QPen(self.myLineColor, 2))
+ self.item_inserted.emit(item)
+ elif self._my_mode == self.InsertLine:
+ self.line = QGraphicsLineItem(QLineF(mouseEvent.scenePos(), mouseEvent.scenePos()))
+ self.line.setPen(QPen(self._my_line_color, 2))
self.addItem(self.line)
- elif self.myMode == self.InsertText:
- textItem = DiagramTextItem()
- textItem.setFont(self.myFont)
- textItem.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction)
- textItem.setZValue(1000.0)
- textItem.lostFocus.connect(self.editorLostFocus)
- textItem.selectedChange.connect(self.itemSelected)
- self.addItem(textItem)
- textItem.setDefaultTextColor(self.myTextColor)
- textItem.setPos(mouseEvent.scenePos())
- self.textInserted.emit(textItem)
+ elif self._my_mode == self.InsertText:
+ text_item = DiagramTextItem()
+ text_item.setFont(self._my_font)
+ text_item.setTextInteractionFlags(Qt.TextEditorInteraction)
+ text_item.setZValue(1000.0)
+ text_item.lost_focus.connect(self.editor_lost_focus)
+ text_item.selected_change.connect(self.item_selected)
+ self.addItem(text_item)
+ text_item.setDefaultTextColor(self._my_text_color)
+ text_item.setPos(mouseEvent.scenePos())
+ self.text_inserted.emit(text_item)
super(DiagramScene, self).mousePressEvent(mouseEvent)
def mouseMoveEvent(self, mouseEvent):
- if self.myMode == self.InsertLine and self.line:
- newLine = QtCore.QLineF(self.line.line().p1(), mouseEvent.scenePos())
- self.line.setLine(newLine)
- elif self.myMode == self.MoveItem:
+ if self._my_mode == self.InsertLine and self.line:
+ new_line = QLineF(self.line.line().p1(), mouseEvent.scenePos())
+ self.line.setLine(new_line)
+ elif self._my_mode == self.MoveItem:
super(DiagramScene, self).mouseMoveEvent(mouseEvent)
def mouseReleaseEvent(self, mouseEvent):
- if self.line and self.myMode == self.InsertLine:
- startItems = self.items(self.line.line().p1())
- if len(startItems) and startItems[0] == self.line:
- startItems.pop(0)
- endItems = self.items(self.line.line().p2())
- if len(endItems) and endItems[0] == self.line:
- endItems.pop(0)
+ if self.line and self._my_mode == self.InsertLine:
+ start_items = self.items(self.line.line().p1())
+ if len(start_items) and start_items[0] == self.line:
+ start_items.pop(0)
+ end_items = self.items(self.line.line().p2())
+ if len(end_items) and end_items[0] == self.line:
+ end_items.pop(0)
self.removeItem(self.line)
self.line = None
- if len(startItems) and len(endItems) and \
- isinstance(startItems[0], DiagramItem) and \
- isinstance(endItems[0], DiagramItem) and \
- startItems[0] != endItems[0]:
- startItem = startItems[0]
- endItem = endItems[0]
- arrow = Arrow(startItem, endItem)
- arrow.setColor(self.myLineColor)
- startItem.addArrow(arrow)
- endItem.addArrow(arrow)
+ if (len(start_items) and len(end_items)
+ and isinstance(start_items[0], DiagramItem)
+ and isinstance(end_items[0], DiagramItem)
+ and start_items[0] != end_items[0]):
+ start_item = start_items[0]
+ end_item = end_items[0]
+ arrow = Arrow(start_item, end_item)
+ arrow.set_color(self._my_line_color)
+ start_item.add_arrow(arrow)
+ end_item.add_arrow(arrow)
arrow.setZValue(-1000.0)
self.addItem(arrow)
- arrow.updatePosition()
+ arrow.update_position()
self.line = None
super(DiagramScene, self).mouseReleaseEvent(mouseEvent)
- def isItemChange(self, type):
+ def is_item_change(self, type):
for item in self.selectedItems():
if isinstance(item, type):
return True
return False
-class MainWindow(QtWidgets.QMainWindow):
- InsertTextButton = 10
+class MainWindow(QMainWindow):
+ insert_text_button = 10
def __init__(self):
- super(MainWindow, self).__init__()
+ super().__init__()
- self.createActions()
- self.createMenus()
- self.createToolBox()
+ self.create_actions()
+ self.create_menus()
+ self.create_tool_box()
- self.scene = DiagramScene(self.itemMenu)
- self.scene.setSceneRect(QtCore.QRectF(0, 0, 5000, 5000))
- self.scene.itemInserted.connect(self.itemInserted)
- self.scene.textInserted.connect(self.textInserted)
- self.scene.itemSelected.connect(self.itemSelected)
+ self.scene = DiagramScene(self._item_menu)
+ self.scene.setSceneRect(QRectF(0, 0, 5000, 5000))
+ self.scene.item_inserted.connect(self.item_inserted)
+ self.scene.text_inserted.connect(self.text_inserted)
+ self.scene.item_selected.connect(self.item_selected)
- self.createToolbars()
+ self.create_toolbars()
- layout = QtWidgets.QHBoxLayout()
- layout.addWidget(self.toolBox)
- self.view = QtWidgets.QGraphicsView(self.scene)
+ layout = QHBoxLayout()
+ layout.addWidget(self._tool_box)
+ self.view = QGraphicsView(self.scene)
layout.addWidget(self.view)
- self.widget = QtWidgets.QWidget()
+ self.widget = QWidget()
self.widget.setLayout(layout)
self.setCentralWidget(self.widget)
self.setWindowTitle("Diagramscene")
- def backgroundButtonGroupClicked(self, button):
- buttons = self.backgroundButtonGroup.buttons()
+ @Slot(QAbstractButton)
+ def background_button_group_clicked(self, button):
+ buttons = self._background_button_group.buttons()
for myButton in buttons:
if myButton != button:
button.setChecked(False)
text = button.text()
if text == "Blue Grid":
- self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background1.png')))
+ self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background1.png')))
elif text == "White Grid":
- self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background2.png')))
+ self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background2.png')))
elif text == "Gray Grid":
- self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background3.png')))
+ self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background3.png')))
else:
- self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background4.png')))
+ self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background4.png')))
self.scene.update()
self.view.update()
- def buttonGroupClicked(self, id):
- buttons = self.buttonGroup.buttons()
+ @Slot(int)
+ def button_group_clicked(self, idx):
+ buttons = self._button_group.buttons()
for button in buttons:
- if self.buttonGroup.button(id) != button:
+ if self._button_group.button(idx) != button:
button.setChecked(False)
- if id == self.InsertTextButton:
- self.scene.setMode(DiagramScene.InsertText)
+ if idx == self.insert_text_button:
+ self.scene.set_mode(DiagramScene.InsertText)
else:
- self.scene.setItemType(id)
- self.scene.setMode(DiagramScene.InsertItem)
+ self.scene.set_item_type(idx)
+ self.scene.set_mode(DiagramScene.InsertItem)
- def deleteItem(self):
+ @Slot()
+ def delete_item(self):
for item in self.scene.selectedItems():
if isinstance(item, DiagramItem):
- item.removeArrows()
+ item.remove_arrows()
self.scene.removeItem(item)
- def pointerGroupClicked(self, i):
- self.scene.setMode(self.pointerTypeGroup.checkedId())
+ @Slot(int)
+ def pointer_group_clicked(self, i):
+ self.scene.set_mode(self._pointer_type_group.checkedId())
- def bringToFront(self):
+ @Slot()
+ def bring_to_front(self):
if not self.scene.selectedItems():
return
- selectedItem = self.scene.selectedItems()[0]
- overlapItems = selectedItem.collidingItems()
+ selected_item = self.scene.selectedItems()[0]
+ overlap_items = selected_item.collidingItems()
- zValue = 0
- for item in overlapItems:
- if (item.zValue() >= zValue and isinstance(item, DiagramItem)):
- zValue = item.zValue() + 0.1
- selectedItem.setZValue(zValue)
+ z_value = 0
+ for item in overlap_items:
+ if (item.zValue() >= z_value and isinstance(item, DiagramItem)):
+ z_value = item.zValue() + 0.1
+ selected_item.setZValue(z_value)
- def sendToBack(self):
+ @Slot()
+ def send_to_back(self):
if not self.scene.selectedItems():
return
- selectedItem = self.scene.selectedItems()[0]
- overlapItems = selectedItem.collidingItems()
-
- zValue = 0
- for item in overlapItems:
- if (item.zValue() <= zValue and isinstance(item, DiagramItem)):
- zValue = item.zValue() - 0.1
- selectedItem.setZValue(zValue)
-
- def itemInserted(self, item):
- self.pointerTypeGroup.button(DiagramScene.MoveItem).setChecked(True)
- self.scene.setMode(self.pointerTypeGroup.checkedId())
- self.buttonGroup.button(item.diagramType).setChecked(False)
-
- def textInserted(self, item):
- self.buttonGroup.button(self.InsertTextButton).setChecked(False)
- self.scene.setMode(self.pointerTypeGroup.checkedId())
-
- def currentFontChanged(self, font):
- self.handleFontChange()
-
- def fontSizeChanged(self, font):
- self.handleFontChange()
-
- def sceneScaleChanged(self, scale):
- newScale = int(scale[:-1]) / 100.0
- oldMatrix = self.view.matrix()
- self.view.resetMatrix()
- self.view.translate(oldMatrix.dx(), oldMatrix.dy())
- self.view.scale(newScale, newScale)
-
- def textColorChanged(self):
- self.textAction = self.sender()
- self.fontColorToolButton.setIcon(self.createColorToolButtonIcon(
- ':/images/textpointer.png',
- QtGui.QColor(self.textAction.data())))
- self.textButtonTriggered()
-
- def itemColorChanged(self):
- self.fillAction = self.sender()
- self.fillColorToolButton.setIcon(self.createColorToolButtonIcon(
- ':/images/floodfill.png',
- QtGui.QColor(self.fillAction.data())))
- self.fillButtonTriggered()
-
- def lineColorChanged(self):
- self.lineAction = self.sender()
- self.lineColorToolButton.setIcon(self.createColorToolButtonIcon(
- ':/images/linecolor.png',
- QtGui.QColor(self.lineAction.data())))
- self.lineButtonTriggered()
-
- def textButtonTriggered(self):
- self.scene.setTextColor(QtGui.QColor(self.textAction.data()))
-
- def fillButtonTriggered(self):
- self.scene.setItemColor(QtGui.QColor(self.fillAction.data()))
-
- def lineButtonTriggered(self):
- self.scene.setLineColor(QtGui.QColor(self.lineAction.data()))
-
- def handleFontChange(self):
- font = self.fontCombo.currentFont()
- font.setPointSize(int(self.fontSizeCombo.currentText()))
- if self.boldAction.isChecked():
- font.setWeight(QtGui.QFont.Bold)
+ selected_item = self.scene.selectedItems()[0]
+ overlap_items = selected_item.collidingItems()
+
+ z_value = 0
+ for item in overlap_items:
+ if (item.zValue() <= z_value and isinstance(item, DiagramItem)):
+ z_value = item.zValue() - 0.1
+ selected_item.setZValue(z_value)
+
+ @Slot(QGraphicsPolygonItem)
+ def item_inserted(self, item):
+ self._pointer_type_group.button(DiagramScene.MoveItem).setChecked(True)
+ self.scene.set_mode(self._pointer_type_group.checkedId())
+ self._button_group.button(item.diagram_type).setChecked(False)
+
+ @Slot(QGraphicsTextItem)
+ def text_inserted(self, item):
+ self._button_group.button(self.insert_text_button).setChecked(False)
+ self.scene.set_mode(self._pointer_type_group.checkedId())
+
+ @Slot(QFont)
+ def current_font_changed(self, font):
+ self.handle_font_change()
+
+ @Slot(int)
+ def font_size_changed(self, font):
+ self.handle_font_change()
+
+ @Slot(str)
+ def scene_scale_changed(self, scale):
+ new_scale = int(scale[:-1]) / 100.0
+ old_matrix = self.view.transform()
+ self.view.resetTransform()
+ self.view.translate(old_matrix.dx(), old_matrix.dy())
+ self.view.scale(new_scale, new_scale)
+
+ @Slot()
+ def text_color_changed(self):
+ self._text_action = self.sender()
+ self._font_color_tool_button.setIcon(self.create_color_tool_button_icon(
+ ':/images/textpointer.png', QColor(self._text_action.data())))
+ self.text_button_triggered()
+
+ @Slot()
+ def item_color_changed(self):
+ self._fill_action = self.sender()
+ self._fill_color_tool_button.setIcon(self.create_color_tool_button_icon(
+ ':/images/floodfill.png', QColor(self._fill_action.data())))
+ self.fill_button_triggered()
+
+ @Slot()
+ def line_color_changed(self):
+ self._line_action = self.sender()
+ self._line_color_tool_button.setIcon(self.create_color_tool_button_icon(
+ ':/images/linecolor.png', QColor(self._line_action.data())))
+ self.line_button_triggered()
+
+ @Slot()
+ def text_button_triggered(self):
+ self.scene.set_text_color(QColor(self._text_action.data()))
+
+ @Slot()
+ def fill_button_triggered(self):
+ self.scene.set_item_color(QColor(self._fill_action.data()))
+
+ @Slot()
+ def line_button_triggered(self):
+ self.scene.set_line_color(QColor(self._line_action.data()))
+
+ @Slot()
+ def handle_font_change(self):
+ font = self._font_combo.currentFont()
+ font.setPointSize(int(self._font_size_combo.currentText()))
+ if self._bold_action.isChecked():
+ font.setWeight(QFont.Bold)
else:
- font.setWeight(QtGui.QFont.Normal)
- font.setItalic(self.italicAction.isChecked())
- font.setUnderline(self.underlineAction.isChecked())
+ font.setWeight(QFont.Normal)
+ font.setItalic(self._italic_action.isChecked())
+ font.setUnderline(self._underline_action.isChecked())
- self.scene.setFont(font)
+ self.scene.set_font(font)
- def itemSelected(self, item):
+ @Slot(QGraphicsItem)
+ def item_selected(self, item):
font = item.font()
- color = item.defaultTextColor()
- self.fontCombo.setCurrentFont(font)
- self.fontSizeCombo.setEditText(str(font.pointSize()))
- self.boldAction.setChecked(font.weight() == QtGui.QFont.Bold)
- self.italicAction.setChecked(font.italic())
- self.underlineAction.setChecked(font.underline())
+ self._font_combo.setCurrentFont(font)
+ self._font_size_combo.setEditText(str(font.pointSize()))
+ self._bold_action.setChecked(font.weight() == QFont.Bold)
+ self._italic_action.setChecked(font.italic())
+ self._underline_action.setChecked(font.underline())
+ @Slot()
def about(self):
- QtWidgets.QMessageBox.about(self, "About Diagram Scene",
- "The <b>Diagram Scene</b> example shows use of the graphics framework.")
-
- def createToolBox(self):
- self.buttonGroup = QtWidgets.QButtonGroup()
- self.buttonGroup.setExclusive(False)
- self.buttonGroup.buttonClicked[int].connect(self.buttonGroupClicked)
-
- layout = QtWidgets.QGridLayout()
- layout.addWidget(self.createCellWidget("Conditional", DiagramItem.Conditional),
- 0, 0)
- layout.addWidget(self.createCellWidget("Process", DiagramItem.Step), 0,
- 1)
- layout.addWidget(self.createCellWidget("Input/Output", DiagramItem.Io),
- 1, 0)
-
- textButton = QtWidgets.QToolButton()
- textButton.setCheckable(True)
- self.buttonGroup.addButton(textButton, self.InsertTextButton)
- textButton.setIcon(QtGui.QIcon(QtGui.QPixmap(':/images/textpointer.png')
+ QMessageBox.about(self, "About Diagram Scene",
+ "The <b>Diagram Scene</b> example shows use of the graphics framework.")
+
+ def create_tool_box(self):
+ self._button_group = QButtonGroup()
+ self._button_group.setExclusive(False)
+ self._button_group.idClicked.connect(self.button_group_clicked)
+
+ layout = QGridLayout()
+ layout.addWidget(self.create_cell_widget("Conditional", DiagramItem.Conditional), 0, 0)
+ layout.addWidget(self.create_cell_widget("Process", DiagramItem.Step), 0, 1)
+ layout.addWidget(self.create_cell_widget("Input/Output", DiagramItem.Io), 1, 0)
+
+ text_button = QToolButton()
+ text_button.setCheckable(True)
+ self._button_group.addButton(text_button, self.insert_text_button)
+ text_button.setIcon(QIcon(QPixmap(':/images/textpointer.png')
.scaled(30, 30)))
- textButton.setIconSize(QtCore.QSize(50, 50))
+ text_button.setIconSize(QSize(50, 50))
- textLayout = QtWidgets.QGridLayout()
- textLayout.addWidget(textButton, 0, 0, QtCore.Qt.AlignHCenter)
- textLayout.addWidget(QtWidgets.QLabel("Text"), 1, 0,
- QtCore.Qt.AlignCenter)
- textWidget = QtWidgets.QWidget()
- textWidget.setLayout(textLayout)
- layout.addWidget(textWidget, 1, 1)
+ text_layout = QGridLayout()
+ text_layout.addWidget(text_button, 0, 0, Qt.AlignHCenter)
+ text_layout.addWidget(QLabel("Text"), 1, 0, Qt.AlignCenter)
+ text_widget = QWidget()
+ text_widget.setLayout(text_layout)
+ layout.addWidget(text_widget, 1, 1)
layout.setRowStretch(3, 10)
layout.setColumnStretch(2, 10)
- itemWidget = QtWidgets.QWidget()
- itemWidget.setLayout(layout)
-
- self.backgroundButtonGroup = QtWidgets.QButtonGroup()
- self.backgroundButtonGroup.buttonClicked.connect(self.backgroundButtonGroupClicked)
-
- backgroundLayout = QtWidgets.QGridLayout()
- backgroundLayout.addWidget(self.createBackgroundCellWidget("Blue Grid",
- ':/images/background1.png'), 0, 0)
- backgroundLayout.addWidget(self.createBackgroundCellWidget("White Grid",
- ':/images/background2.png'), 0, 1)
- backgroundLayout.addWidget(self.createBackgroundCellWidget("Gray Grid",
- ':/images/background3.png'), 1, 0)
- backgroundLayout.addWidget(self.createBackgroundCellWidget("No Grid",
- ':/images/background4.png'), 1, 1)
-
- backgroundLayout.setRowStretch(2, 10)
- backgroundLayout.setColumnStretch(2, 10)
-
- backgroundWidget = QtWidgets.QWidget()
- backgroundWidget.setLayout(backgroundLayout)
-
- self.toolBox = QtWidgets.QToolBox()
- self.toolBox.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Ignored))
- self.toolBox.setMinimumWidth(itemWidget.sizeHint().width())
- self.toolBox.addItem(itemWidget, "Basic Flowchart Shapes")
- self.toolBox.addItem(backgroundWidget, "Backgrounds")
-
- def createActions(self):
- self.toFrontAction = QtWidgets.QAction(
- QtGui.QIcon(':/images/bringtofront.png'), "Bring to &Front",
- self, shortcut="Ctrl+F", statusTip="Bring item to front",
- triggered=self.bringToFront)
-
- self.sendBackAction = QtWidgets.QAction(
- QtGui.QIcon(':/images/sendtoback.png'), "Send to &Back", self,
- shortcut="Ctrl+B", statusTip="Send item to back",
- triggered=self.sendToBack)
-
- self.deleteAction = QtWidgets.QAction(QtGui.QIcon(':/images/delete.png'),
- "&Delete", self, shortcut="Delete",
- statusTip="Delete item from diagram",
- triggered=self.deleteItem)
-
- self.exitAction = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+X",
- statusTip="Quit Scenediagram example", triggered=self.close)
-
- self.boldAction = QtWidgets.QAction(QtGui.QIcon(':/images/bold.png'),
- "Bold", self, checkable=True, shortcut="Ctrl+B",
- triggered=self.handleFontChange)
-
- self.italicAction = QtWidgets.QAction(QtGui.QIcon(':/images/italic.png'),
- "Italic", self, checkable=True, shortcut="Ctrl+I",
- triggered=self.handleFontChange)
-
- self.underlineAction = QtWidgets.QAction(
- QtGui.QIcon(':/images/underline.png'), "Underline", self,
- checkable=True, shortcut="Ctrl+U",
- triggered=self.handleFontChange)
-
- self.aboutAction = QtWidgets.QAction("A&bout", self, shortcut="Ctrl+B",
- triggered=self.about)
-
- def createMenus(self):
- self.fileMenu = self.menuBar().addMenu("&File")
- self.fileMenu.addAction(self.exitAction)
-
- self.itemMenu = self.menuBar().addMenu("&Item")
- self.itemMenu.addAction(self.deleteAction)
- self.itemMenu.addSeparator()
- self.itemMenu.addAction(self.toFrontAction)
- self.itemMenu.addAction(self.sendBackAction)
-
- self.aboutMenu = self.menuBar().addMenu("&Help")
- self.aboutMenu.addAction(self.aboutAction)
-
- def createToolbars(self):
- self.editToolBar = self.addToolBar("Edit")
- self.editToolBar.addAction(self.deleteAction)
- self.editToolBar.addAction(self.toFrontAction)
- self.editToolBar.addAction(self.sendBackAction)
-
- self.fontCombo = QtWidgets.QFontComboBox()
- self.fontCombo.currentFontChanged.connect(self.currentFontChanged)
-
- self.fontSizeCombo = QtWidgets.QComboBox()
- self.fontSizeCombo.setEditable(True)
+ item_widget = QWidget()
+ item_widget.setLayout(layout)
+
+ self._background_button_group = QButtonGroup()
+ self._background_button_group.buttonClicked.connect(self.background_button_group_clicked)
+
+ background_layout = QGridLayout()
+ background_layout.addWidget(
+ self.create_background_cell_widget("Blue Grid", ':/images/background1.png'), 0, 0)
+ background_layout.addWidget(
+ self.create_background_cell_widget("White Grid", ':/images/background2.png'), 0, 1)
+ background_layout.addWidget(
+ self.create_background_cell_widget("Gray Grid", ':/images/background3.png'), 1, 0)
+ background_layout.addWidget(
+ self.create_background_cell_widget("No Grid", ':/images/background4.png'), 1, 1)
+
+ background_layout.setRowStretch(2, 10)
+ background_layout.setColumnStretch(2, 10)
+
+ background_widget = QWidget()
+ background_widget.setLayout(background_layout)
+
+ self._tool_box = QToolBox()
+ self._tool_box.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Ignored))
+ self._tool_box.setMinimumWidth(item_widget.sizeHint().width())
+ self._tool_box.addItem(item_widget, "Basic Flowchart Shapes")
+ self._tool_box.addItem(background_widget, "Backgrounds")
+
+ def create_actions(self):
+ self._to_front_action = QAction(
+ QIcon(':/images/bringtofront.png'), "Bring to &Front",
+ self, shortcut="Ctrl+F", statusTip="Bring item to front",
+ triggered=self.bring_to_front)
+
+ self._send_back_action = QAction(
+ QIcon(':/images/sendtoback.png'), "Send to &Back", self,
+ shortcut="Ctrl+B", statusTip="Send item to back",
+ triggered=self.send_to_back)
+
+ self._delete_action = QAction(QIcon(':/images/delete.png'),
+ "&Delete", self, shortcut="Delete",
+ statusTip="Delete item from diagram",
+ triggered=self.delete_item)
+
+ self._exit_action = QAction("E&xit", self, shortcut="Ctrl+X",
+ statusTip="Quit Scenediagram example", triggered=self.close)
+
+ self._bold_action = QAction(QIcon(':/images/bold.png'),
+ "Bold", self, checkable=True, shortcut="Ctrl+B",
+ triggered=self.handle_font_change)
+
+ self._italic_action = QAction(QIcon(':/images/italic.png'),
+ "Italic", self, checkable=True, shortcut="Ctrl+I",
+ triggered=self.handle_font_change)
+
+ self._underline_action = QAction(
+ QIcon(':/images/underline.png'), "Underline", self,
+ checkable=True, shortcut="Ctrl+U",
+ triggered=self.handle_font_change)
+
+ self._about_action = QAction("A&bout", self, shortcut="Ctrl+B", triggered=self.about)
+
+ def create_menus(self):
+ self._file_menu = self.menuBar().addMenu("&File")
+ self._file_menu.addAction(self._exit_action)
+
+ self._item_menu = self.menuBar().addMenu("&Item")
+ self._item_menu.addAction(self._delete_action)
+ self._item_menu.addSeparator()
+ self._item_menu.addAction(self._to_front_action)
+ self._item_menu.addAction(self._send_back_action)
+
+ self._about_menu = self.menuBar().addMenu("&Help")
+ self._about_menu.addAction(self._about_action)
+
+ def create_toolbars(self):
+ self._edit_tool_bar = self.addToolBar("Edit")
+ self._edit_tool_bar.addAction(self._delete_action)
+ self._edit_tool_bar.addAction(self._to_front_action)
+ self._edit_tool_bar.addAction(self._send_back_action)
+
+ self._font_combo = QFontComboBox()
+ self._font_combo.currentFontChanged.connect(self.current_font_changed)
+
+ self._font_size_combo = QComboBox()
+ self._font_size_combo.setEditable(True)
for i in range(8, 30, 2):
- self.fontSizeCombo.addItem(str(i))
- validator = QtGui.QIntValidator(2, 64, self)
- self.fontSizeCombo.setValidator(validator)
- self.fontSizeCombo.currentIndexChanged.connect(self.fontSizeChanged)
-
- self.fontColorToolButton = QtWidgets.QToolButton()
- self.fontColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup)
- self.fontColorToolButton.setMenu(
- self.createColorMenu(self.textColorChanged, QtCore.Qt.black))
- self.textAction = self.fontColorToolButton.menu().defaultAction()
- self.fontColorToolButton.setIcon(
- self.createColorToolButtonIcon(':/images/textpointer.png',
- QtCore.Qt.black))
- self.fontColorToolButton.setAutoFillBackground(True)
- self.fontColorToolButton.clicked.connect(self.textButtonTriggered)
-
- self.fillColorToolButton = QtWidgets.QToolButton()
- self.fillColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup)
- self.fillColorToolButton.setMenu(
- self.createColorMenu(self.itemColorChanged, QtCore.Qt.white))
- self.fillAction = self.fillColorToolButton.menu().defaultAction()
- self.fillColorToolButton.setIcon(
- self.createColorToolButtonIcon(':/images/floodfill.png',
- QtCore.Qt.white))
- self.fillColorToolButton.clicked.connect(self.fillButtonTriggered)
-
- self.lineColorToolButton = QtWidgets.QToolButton()
- self.lineColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup)
- self.lineColorToolButton.setMenu(
- self.createColorMenu(self.lineColorChanged, QtCore.Qt.black))
- self.lineAction = self.lineColorToolButton.menu().defaultAction()
- self.lineColorToolButton.setIcon(
- self.createColorToolButtonIcon(':/images/linecolor.png',
- QtCore.Qt.black))
- self.lineColorToolButton.clicked.connect(self.lineButtonTriggered)
-
- self.textToolBar = self.addToolBar("Font")
- self.textToolBar.addWidget(self.fontCombo)
- self.textToolBar.addWidget(self.fontSizeCombo)
- self.textToolBar.addAction(self.boldAction)
- self.textToolBar.addAction(self.italicAction)
- self.textToolBar.addAction(self.underlineAction)
-
- self.colorToolBar = self.addToolBar("Color")
- self.colorToolBar.addWidget(self.fontColorToolButton)
- self.colorToolBar.addWidget(self.fillColorToolButton)
- self.colorToolBar.addWidget(self.lineColorToolButton)
-
- pointerButton = QtWidgets.QToolButton()
- pointerButton.setCheckable(True)
- pointerButton.setChecked(True)
- pointerButton.setIcon(QtGui.QIcon(':/images/pointer.png'))
- linePointerButton = QtWidgets.QToolButton()
- linePointerButton.setCheckable(True)
- linePointerButton.setIcon(QtGui.QIcon(':/images/linepointer.png'))
-
- self.pointerTypeGroup = QtWidgets.QButtonGroup()
- self.pointerTypeGroup.addButton(pointerButton, DiagramScene.MoveItem)
- self.pointerTypeGroup.addButton(linePointerButton,
- DiagramScene.InsertLine)
- self.pointerTypeGroup.buttonClicked[int].connect(self.pointerGroupClicked)
-
- self.sceneScaleCombo = QtWidgets.QComboBox()
- self.sceneScaleCombo.addItems(["50%", "75%", "100%", "125%", "150%"])
- self.sceneScaleCombo.setCurrentIndex(2)
- self.sceneScaleCombo.currentIndexChanged[str].connect(self.sceneScaleChanged)
-
- self.pointerToolbar = self.addToolBar("Pointer type")
- self.pointerToolbar.addWidget(pointerButton)
- self.pointerToolbar.addWidget(linePointerButton)
- self.pointerToolbar.addWidget(self.sceneScaleCombo)
-
- def createBackgroundCellWidget(self, text, image):
- button = QtWidgets.QToolButton()
+ self._font_size_combo.addItem(str(i))
+ validator = QIntValidator(2, 64, self)
+ self._font_size_combo.setValidator(validator)
+ self._font_size_combo.currentIndexChanged.connect(self.font_size_changed)
+
+ self._font_color_tool_button = QToolButton()
+ self._font_color_tool_button.setPopupMode(QToolButton.MenuButtonPopup)
+ self._font_color_tool_button.setMenu(
+ self.create_color_menu(self.text_color_changed, Qt.black))
+ self._text_action = self._font_color_tool_button.menu().defaultAction()
+ self._font_color_tool_button.setIcon(
+ self.create_color_tool_button_icon(':/images/textpointer.png', Qt.black))
+ self._font_color_tool_button.setAutoFillBackground(True)
+ self._font_color_tool_button.clicked.connect(self.text_button_triggered)
+
+ self._fill_color_tool_button = QToolButton()
+ self._fill_color_tool_button.setPopupMode(QToolButton.MenuButtonPopup)
+ self._fill_color_tool_button.setMenu(
+ self.create_color_menu(self.item_color_changed, Qt.white))
+ self._fill_action = self._fill_color_tool_button.menu().defaultAction()
+ self._fill_color_tool_button.setIcon(
+ self.create_color_tool_button_icon(':/images/floodfill.png', Qt.white))
+ self._fill_color_tool_button.clicked.connect(self.fill_button_triggered)
+
+ self._line_color_tool_button = QToolButton()
+ self._line_color_tool_button.setPopupMode(QToolButton.MenuButtonPopup)
+ self._line_color_tool_button.setMenu(
+ self.create_color_menu(self.line_color_changed, Qt.black))
+ self._line_action = self._line_color_tool_button.menu().defaultAction()
+ self._line_color_tool_button.setIcon(
+ self.create_color_tool_button_icon(':/images/linecolor.png', Qt.black))
+ self._line_color_tool_button.clicked.connect(self.line_button_triggered)
+
+ self._text_tool_bar = self.addToolBar("Font")
+ self._text_tool_bar.addWidget(self._font_combo)
+ self._text_tool_bar.addWidget(self._font_size_combo)
+ self._text_tool_bar.addAction(self._bold_action)
+ self._text_tool_bar.addAction(self._italic_action)
+ self._text_tool_bar.addAction(self._underline_action)
+
+ self._color_tool_bar = self.addToolBar("Color")
+ self._color_tool_bar.addWidget(self._font_color_tool_button)
+ self._color_tool_bar.addWidget(self._fill_color_tool_button)
+ self._color_tool_bar.addWidget(self._line_color_tool_button)
+
+ pointer_button = QToolButton()
+ pointer_button.setCheckable(True)
+ pointer_button.setChecked(True)
+ pointer_button.setIcon(QIcon(':/images/pointer.png'))
+ line_pointer_button = QToolButton()
+ line_pointer_button.setCheckable(True)
+ line_pointer_button.setIcon(QIcon(':/images/linepointer.png'))
+
+ self._pointer_type_group = QButtonGroup()
+ self._pointer_type_group.addButton(pointer_button, DiagramScene.MoveItem)
+ self._pointer_type_group.addButton(line_pointer_button, DiagramScene.InsertLine)
+ self._pointer_type_group.idClicked.connect(self.pointer_group_clicked)
+
+ self._scene_scale_combo = QComboBox()
+ self._scene_scale_combo.addItems(["50%", "75%", "100%", "125%", "150%"])
+ self._scene_scale_combo.setCurrentIndex(2)
+ self._scene_scale_combo.currentTextChanged.connect(self.scene_scale_changed)
+
+ self._pointer_toolbar = self.addToolBar("Pointer type")
+ self._pointer_toolbar.addWidget(pointer_button)
+ self._pointer_toolbar.addWidget(line_pointer_button)
+ self._pointer_toolbar.addWidget(self._scene_scale_combo)
+
+ def create_background_cell_widget(self, text, image):
+ button = QToolButton()
button.setText(text)
- button.setIcon(QtGui.QIcon(image))
- button.setIconSize(QtCore.QSize(50, 50))
+ button.setIcon(QIcon(image))
+ button.setIconSize(QSize(50, 50))
button.setCheckable(True)
- self.backgroundButtonGroup.addButton(button)
+ self._background_button_group.addButton(button)
- layout = QtWidgets.QGridLayout()
- layout.addWidget(button, 0, 0, QtCore.Qt.AlignHCenter)
- layout.addWidget(QtWidgets.QLabel(text), 1, 0, QtCore.Qt.AlignCenter)
+ layout = QGridLayout()
+ layout.addWidget(button, 0, 0, Qt.AlignHCenter)
+ layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter)
- widget = QtWidgets.QWidget()
+ widget = QWidget()
widget.setLayout(layout)
return widget
- def createCellWidget(self, text, diagramType):
- item = DiagramItem(diagramType, self.itemMenu)
- icon = QtGui.QIcon(item.image())
+ def create_cell_widget(self, text, diagram_type):
+ item = DiagramItem(diagram_type, self._item_menu)
+ icon = QIcon(item.image())
- button = QtWidgets.QToolButton()
+ button = QToolButton()
button.setIcon(icon)
- button.setIconSize(QtCore.QSize(50, 50))
+ button.setIconSize(QSize(50, 50))
button.setCheckable(True)
- self.buttonGroup.addButton(button, diagramType)
+ self._button_group.addButton(button, diagram_type)
- layout = QtWidgets.QGridLayout()
- layout.addWidget(button, 0, 0, QtCore.Qt.AlignHCenter)
- layout.addWidget(QtWidgets.QLabel(text), 1, 0, QtCore.Qt.AlignCenter)
+ layout = QGridLayout()
+ layout.addWidget(button, 0, 0, Qt.AlignHCenter)
+ layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter)
- widget = QtWidgets.QWidget()
+ widget = QWidget()
widget.setLayout(layout)
return widget
- def createColorMenu(self, slot, defaultColor):
- colors = [QtCore.Qt.black, QtCore.Qt.white, QtCore.Qt.red, QtCore.Qt.blue, QtCore.Qt.yellow]
+ def create_color_menu(self, slot, defaultColor):
+ colors = [Qt.black, Qt.white, Qt.red, Qt.blue, Qt.yellow]
names = ["black", "white", "red", "blue", "yellow"]
- colorMenu = QtWidgets.QMenu(self)
+ color_menu = QMenu(self)
for color, name in zip(colors, names):
- action = QtWidgets.QAction(self.createColorIcon(color), name, self,
- triggered=slot)
- action.setData(QtGui.QColor(color))
- colorMenu.addAction(action)
+ action = QAction(self.create_color_icon(color), name, self, triggered=slot)
+ action.setData(QColor(color))
+ color_menu.addAction(action)
if color == defaultColor:
- colorMenu.setDefaultAction(action)
- return colorMenu
+ color_menu.setDefaultAction(action)
+ return color_menu
- def createColorToolButtonIcon(self, imageFile, color):
- pixmap = QtGui.QPixmap(50, 80)
- pixmap.fill(QtCore.Qt.transparent)
- painter = QtGui.QPainter(pixmap)
- image = QtGui.QPixmap(imageFile)
- target = QtCore.QRect(0, 0, 50, 60)
- source = QtCore.QRect(0, 0, 42, 42)
- painter.fillRect(QtCore.QRect(0, 60, 50, 80), color)
- painter.drawPixmap(target, image, source)
- painter.end()
+ def create_color_tool_button_icon(self, imageFile, color):
+ pixmap = QPixmap(50, 80)
+ pixmap.fill(Qt.transparent)
- return QtGui.QIcon(pixmap)
+ with QPainter(pixmap) as painter:
+ image = QPixmap(imageFile)
+ target = QRect(0, 0, 50, 60)
+ source = QRect(0, 0, 42, 42)
+ painter.fillRect(QRect(0, 60, 50, 80), color)
+ painter.drawPixmap(target, image, source)
- def createColorIcon(self, color):
- pixmap = QtGui.QPixmap(20, 20)
- painter = QtGui.QPainter(pixmap)
- painter.setPen(QtCore.Qt.NoPen)
- painter.fillRect(QtCore.QRect(0, 0, 20, 20), color)
- painter.end()
+ return QIcon(pixmap)
- return QtGui.QIcon(pixmap)
+ def create_color_icon(self, color):
+ pixmap = QPixmap(20, 20)
+ with QPainter(pixmap) as painter:
+ painter.setPen(Qt.NoPen)
+ painter.fillRect(QRect(0, 0, 20, 20), color)
-if __name__ == '__main__':
+ return QIcon(pixmap)
- import sys
- app = QtWidgets.QApplication(sys.argv)
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
- mainWindow = MainWindow()
- mainWindow.setGeometry(100, 100, 800, 500)
- mainWindow.show()
+ main_window = MainWindow()
+ main_window.setGeometry(100, 100, 800, 500)
+ main_window.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())