class MainWindow(QMainWindow): InsertTextButton = 10 def __init__(self): super(MainWindow, self).__init__() self.createActions() self.createMenus() self.createToolBox() self.scene = DiagramScene(self.itemMenu) self.scene.setSceneRect(QRectF(0, 0, 5000, 5000)) self.scene.itemInserted.connect(self.itemInserted) self.scene.textInserted.connect(self.textInserted) self.scene.itemSelected.connect(self.itemSelected) self.createToolbars() layout = QHBoxLayout() layout.addWidget(self.toolBox) self.view = QGraphicsView(self.scene) layout.addWidget(self.view) self.widget = QWidget() self.widget.setLayout(layout) self.setCentralWidget(self.widget) self.setWindowTitle("Diagramscene") def backgroundButtonGroupClicked(self, button): buttons = self.backgroundButtonGroup.buttons() for myButton in buttons: if myButton != button: button.setChecked(False) text = button.text() if text == "Blue Grid": self.scene.setBackgroundBrush( QBrush(QPixmap(':/images/background1.png'))) elif text == "White Grid": self.scene.setBackgroundBrush( QBrush(QPixmap(':/images/background2.png'))) elif text == "Gray Grid": self.scene.setBackgroundBrush( QBrush(QPixmap(':/images/background3.png'))) else: self.scene.setBackgroundBrush( QBrush(QPixmap(':/images/background4.png'))) self.scene.update() self.view.update() def buttonGroupClicked(self, id): buttons = self.buttonGroup.buttons() for button in buttons: if self.buttonGroup.button(id) != button: button.setChecked(False) if id == self.InsertTextButton: self.scene.setMode(DiagramScene.InsertText) else: self.scene.setItemType(id) self.scene.setMode(DiagramScene.InsertItem) def deleteItem(self): for item in self.scene.selectedItems(): if isinstance(item, DiagramItem): item.removeArrows() self.scene.removeItem(item) def pointerGroupClicked(self, i): self.scene.setMode(self.pointerTypeGroup.checkedId()) def bringToFront(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 sendToBack(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 = scale.left(scale.indexOf("%")).toDouble()[0] / 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', QColor(self.textAction.data()))) self.textButtonTriggered() def itemColorChanged(self): self.fillAction = self.sender() self.fillColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/floodfill.png', QColor(self.fillAction.data()))) self.fillButtonTriggered() def lineColorChanged(self): self.lineAction = self.sender() self.lineColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/linecolor.png', QColor(self.lineAction.data()))) self.lineButtonTriggered() def textButtonTriggered(self): self.scene.setTextColor(QColor(self.textAction.data())) def fillButtonTriggered(self): self.scene.setItemColor(QColor(self.fillAction.data())) def lineButtonTriggered(self): self.scene.setLineColor(QColor(self.lineAction.data())) def handleFontChange(self): font = self.fontCombo.currentFont() font.setPointSize(self.fontSizeCombo.currentText().toInt()[0]) if self.boldAction.isChecked(): font.setWeight(QFont.Bold) else: font.setWeight(QFont.Normal) font.setItalic(self.italicAction.isChecked()) font.setUnderline(self.underlineAction.isChecked()) self.scene.setFont(font) def itemSelected(self, item): font = item.font() color = item.defaultTextColor() self.fontCombo.setCurrentFont(font) self.fontSizeCombo.setEditText(str(font.pointSize())) self.boldAction.setChecked(font.weight() == QFont.Bold) self.italicAction.setChecked(font.italic()) self.underlineAction.setChecked(font.underline()) def about(self): QMessageBox.about( self, "About Diagram Scene", "The <b>Diagram Scene</b> example shows use of the graphics framework." ) def createToolBox(self): self.buttonGroup = QButtonGroup() self.buttonGroup.setExclusive(False) self.buttonGroup.buttonClicked[int].connect(self.buttonGroupClicked) layout = 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 = QToolButton() textButton.setCheckable(True) self.buttonGroup.addButton(textButton, self.InsertTextButton) textButton.setIcon( QIcon(QPixmap(':/images/textpointer.png').scaled(30, 30))) textButton.setIconSize(QSize(50, 50)) textLayout = QGridLayout() textLayout.addWidget(textButton, 0, 0, Qt.AlignHCenter) textLayout.addWidget(QLabel("Text"), 1, 0, Qt.AlignCenter) textWidget = QWidget() textWidget.setLayout(textLayout) layout.addWidget(textWidget, 1, 1) layout.setRowStretch(3, 10) layout.setColumnStretch(2, 10) itemWidget = QWidget() itemWidget.setLayout(layout) self.backgroundButtonGroup = QButtonGroup() self.backgroundButtonGroup.buttonClicked.connect( self.backgroundButtonGroupClicked) backgroundLayout = 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 = QWidget() backgroundWidget.setLayout(backgroundLayout) self.toolBox = QToolBox() self.toolBox.setSizePolicy( QSizePolicy(QSizePolicy.Maximum, 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 = QAction(QIcon(':/images/bringtofront.png'), "Bring to &Front", self, shortcut="Ctrl+F", statusTip="Bring item to front", triggered=self.bringToFront) self.sendBackAction = QAction(QIcon(':/images/sendtoback.png'), "Send to &Back", self, shortcut="Ctrl+B", statusTip="Send item to back", triggered=self.sendToBack) self.deleteAction = QAction(QIcon(':/images/delete.png'), "&Delete", self, shortcut="Delete", statusTip="Delete item from diagram", triggered=self.deleteItem) self.exitAction = QAction("E&xit", self, shortcut="Ctrl+X", statusTip="Quit Scenediagram example", triggered=self.close) self.boldAction = QAction(QIcon(':/images/bold.png'), "Bold", self, checkable=True, shortcut="Ctrl+B", triggered=self.handleFontChange) self.italicAction = QAction(QIcon(':/images/italic.png'), "Italic", self, checkable=True, shortcut="Ctrl+I", triggered=self.handleFontChange) self.underlineAction = QAction(QIcon(':/images/underline.png'), "Underline", self, checkable=True, shortcut="Ctrl+U", triggered=self.handleFontChange) self.aboutAction = 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 = QFontComboBox() self.fontCombo.currentFontChanged.connect(self.currentFontChanged) self.fontSizeCombo = QComboBox() self.fontSizeCombo.setEditable(True) for i in range(8, 30, 2): self.fontSizeCombo.addItem(str(i)) validator = QIntValidator(2, 64, self) self.fontSizeCombo.setValidator(validator) self.fontSizeCombo.currentIndexChanged.connect(self.fontSizeChanged) self.fontColorToolButton = QToolButton() self.fontColorToolButton.setPopupMode(QToolButton.MenuButtonPopup) self.fontColorToolButton.setMenu( self.createColorMenu(self.textColorChanged, Qt.black)) self.textAction = self.fontColorToolButton.menu().defaultAction() self.fontColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/textpointer.png', Qt.black)) self.fontColorToolButton.setAutoFillBackground(True) self.fontColorToolButton.clicked.connect(self.textButtonTriggered) self.fillColorToolButton = QToolButton() self.fillColorToolButton.setPopupMode(QToolButton.MenuButtonPopup) self.fillColorToolButton.setMenu( self.createColorMenu(self.itemColorChanged, Qt.white)) self.fillAction = self.fillColorToolButton.menu().defaultAction() self.fillColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/floodfill.png', Qt.white)) self.fillColorToolButton.clicked.connect(self.fillButtonTriggered) self.lineColorToolButton = QToolButton() self.lineColorToolButton.setPopupMode(QToolButton.MenuButtonPopup) self.lineColorToolButton.setMenu( self.createColorMenu(self.lineColorChanged, Qt.black)) self.lineAction = self.lineColorToolButton.menu().defaultAction() self.lineColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/linecolor.png', 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 = QToolButton() pointerButton.setCheckable(True) pointerButton.setChecked(True) pointerButton.setIcon(QIcon(':/images/pointer.png')) linePointerButton = QToolButton() linePointerButton.setCheckable(True) linePointerButton.setIcon(QIcon(':/images/linepointer.png')) self.pointerTypeGroup = QButtonGroup() self.pointerTypeGroup.addButton(pointerButton, DiagramScene.MoveItem) self.pointerTypeGroup.addButton(linePointerButton, DiagramScene.InsertLine) self.pointerTypeGroup.buttonClicked[int].connect( self.pointerGroupClicked) self.sceneScaleCombo = 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 = QToolButton() button.setText(text) button.setIcon(QIcon(image)) button.setIconSize(QSize(50, 50)) button.setCheckable(True) self.backgroundButtonGroup.addButton(button) layout = QGridLayout() layout.addWidget(button, 0, 0, Qt.AlignHCenter) layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter) widget = QWidget() widget.setLayout(layout) return widget def createCellWidget(self, text, diagramType): item = DiagramItem(diagramType, self.itemMenu) icon = QIcon(item.image()) button = QToolButton() button.setIcon(icon) button.setIconSize(QSize(50, 50)) button.setCheckable(True) self.buttonGroup.addButton(button, diagramType) layout = QGridLayout() layout.addWidget(button, 0, 0, Qt.AlignHCenter) layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter) widget = QWidget() widget.setLayout(layout) return widget def createColorMenu(self, slot, defaultColor): colors = [Qt.black, Qt.white, Qt.red, Qt.blue, Qt.yellow] names = ["black", "white", "red", "blue", "yellow"] colorMenu = QMenu(self) for color, name in zip(colors, names): action = QAction(self.createColorIcon(color), name, self, triggered=slot) action.setData(QColor(color)) colorMenu.addAction(action) if color == defaultColor: colorMenu.setDefaultAction(action) return colorMenu def createColorToolButtonIcon(self, imageFile, color): pixmap = QPixmap(50, 80) pixmap.fill(Qt.transparent) painter = QPainter(pixmap) 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) painter.end() return QIcon(pixmap) def createColorIcon(self, color): pixmap = QPixmap(20, 20) painter = QPainter(pixmap) painter.setPen(Qt.NoPen) painter.fillRect(QRect(0, 0, 20, 20), color) painter.end() return QIcon(pixmap)
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.createActions() self.createMenus() self.createToolBox() self.createStatusBar() self.scene = ITGScene(self.itemMenu) self.scene.setSceneRect(QRectF(0, 0, 5000, 5000)) self.scene.itemInserted.connect(self.itemInserted) self.scene.itemSelected.connect(self.itemSelected) # ================================================================ # THIS IS THE PROBLEM SECTION # THIS CAUSES TypeError: native Qt signal is not callable # To reproduce the error, run the program, click on one of the # shapes, then click on the scene area # ================================================================ self.scene.selectionChanged.connect(self.print_item_info) # this one doesn't work self.createToolbars() layout = QHBoxLayout() layout.addWidget(self.toolBox) self.view = QGraphicsView(self.scene) # view and scene established together layout.addWidget(self.view) self.widget = QWidget() self.widget.setLayout(layout) self.setCentralWidget(self.widget) self.setWindowTitle("ITG: Illegitimate Template Generator") #@pyqtSlot() # Adding this does not change the error def print_item_info(self): for item in self.scene.selectedItems(): print(item) def buttonGroupClicked(self, id): buttons = self.buttonGroup.buttons() for button in buttons: if self.buttonGroup.button(id) != button: button.setChecked(False) self.scene.setItemType(id) self.scene.setMode(ITGScene.InsertItem) self.updateStatusBar() def deleteItem(self): for item in self.scene.selectedItems(): self.scene.removeItem(item) def pointerGroupClicked(self, i): self.scene.setMode(self.pointerTypeGroup.checkedId()) self.updateStatusBar() def bringToFront(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, ITGItem)): zValue = item.zValue() + 0.1 selectedItem.setZValue(zValue) def sendToBack(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, ITGItem)): zValue = item.zValue() - 0.1 selectedItem.setZValue(zValue) def itemInserted(self, item): self.pointerTypeGroup.button(ITGScene.MoveItem).setChecked(True) self.scene.setMode(self.pointerTypeGroup.checkedId()) self.updateStatusBar() self.buttonGroup.button(item.ITGType).setChecked(False) def sceneScaleChanged(self, scale): newScale = scale.left(scale.indexOf("%")).toDouble()[0] / 100.0 oldMatrix = self.view.matrix() self.view.resetMatrix() self.view.translate(oldMatrix.dx(), oldMatrix.dy()) self.view.scale(newScale, newScale) def itemColorChanged(self): self.fillAction = self.sender() self.fillColorToolButton.setIcon( self.createColorToolButtonIcon( ':/images/floodfill.png', QColor(self.fillAction.data()))) self.fillButtonTriggered() def fillButtonTriggered(self): self.scene.setItemColor(QColor(self.fillAction.data())) def itemSelected(self, item): font = item.font() color = item.defaultTextColor() self.fontCombo.setCurrentFont(font) self.fontSizeCombo.setEditText(str(font.pointSize())) self.boldAction.setChecked(font.weight() == QFont.Bold) self.italicAction.setChecked(font.italic()) self.underlineAction.setChecked(font.underline()) def about(self): QMessageBox.about(self, "About ITG Scene", "The <b>ITG Scene</b> example shows use of the graphics framework.") def createToolBox(self): self.buttonGroup = QButtonGroup() self.buttonGroup.setExclusive(False) self.buttonGroup.buttonClicked[int].connect(self.buttonGroupClicked) layout = QGridLayout() layout.addWidget(self.createCellWidget("Diamond", ITGItem.Diamond), 0, 0) layout.addWidget(self.createCellWidget("Square", ITGItem.Square), 0, 1) layout.addWidget(self.createCellWidget("Parallelogram", ITGItem.Parallelogram), 1, 0) layout.setRowStretch(3, 10) layout.setColumnStretch(2, 10) itemWidget = QWidget() itemWidget.setLayout(layout) self.backgroundButtonGroup = QButtonGroup() self.toolBox = QToolBox() self.toolBox.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Ignored)) self.toolBox.setMinimumWidth(itemWidget.sizeHint().width()) self.toolBox.addItem(itemWidget, "Basic Components") def createActions(self): self.toFrontAction = QAction( QIcon(':/images/bringtofront.png'), "Bring to &Front", self, shortcut="Ctrl+F", statusTip="Bring item to front", triggered=self.bringToFront) self.sendBackAction = QAction( QIcon(':/images/sendtoback.png'), "Send to &Back", self, shortcut="Ctrl+B", statusTip="Send item to back", triggered=self.sendToBack) self.deleteAction = QAction(QIcon(':/images/delete.png'), "&Delete", self, shortcut="Delete", statusTip="Delete item from ITG", triggered=self.deleteItem) self.exitAction = QAction("E&xit", self, shortcut="Ctrl+X", statusTip="Quit SceneITG example", triggered=self.close) self.aboutAction = 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.fillColorToolButton = QToolButton() self.fillColorToolButton.setPopupMode(QToolButton.MenuButtonPopup) self.fillColorToolButton.setMenu( self.createColorMenu(self.itemColorChanged, Qt.red)) self.fillAction = self.fillColorToolButton.menu().defaultAction() self.fillColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/floodfill.png', Qt.red)) self.fillColorToolButton.clicked.connect(self.fillButtonTriggered) self.colorToolBar = self.addToolBar("Color") self.colorToolBar.addWidget(self.fillColorToolButton) pointerButton = QToolButton() pointerButton.setCheckable(True) pointerButton.setChecked(True) pointerButton.setIcon(QIcon(':/images/pointer.png')) self.pointerTypeGroup = QButtonGroup() self.pointerTypeGroup.addButton(pointerButton, ITGScene.MoveItem) self.pointerTypeGroup.buttonClicked[int].connect(self.pointerGroupClicked) self.sceneScaleCombo = 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(self.sceneScaleCombo) def createBackgroundCellWidget(self, text, image): button = QToolButton() button.setText(text) button.setIcon(QIcon(image)) button.setIconSize(QSize(50, 50)) button.setCheckable(True) self.backgroundButtonGroup.addButton(button) layout = QGridLayout() layout.addWidget(button, 0, 0, Qt.AlignHCenter) layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter) widget = QWidget() widget.setLayout(layout) return widget def createCellWidget(self, text, ITGType): item = ITGItem(ITGType, self.itemMenu) icon = QIcon(item.image()) button = QToolButton() button.setIcon(icon) button.setIconSize(QSize(50, 50)) button.setCheckable(True) self.buttonGroup.addButton(button, ITGType) layout = QGridLayout() layout.addWidget(button, 0, 0, Qt.AlignHCenter) layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter) widget = QWidget() widget.setLayout(layout) return widget def createColorMenu(self, slot, defaultColor): colors = [Qt.black, Qt.white, Qt.red, Qt.blue, Qt.yellow] names = ["black", "white", "red", "blue", "yellow"] colorMenu = QMenu(self) for color, name in zip(colors, names): action = QAction(self.createColorIcon(color), name, self, triggered=slot) action.setData(QColor(color)) colorMenu.addAction(action) if color == defaultColor: colorMenu.setDefaultAction(action) return colorMenu def createColorToolButtonIcon(self, imageFile, color): pixmap = QPixmap(50, 80) pixmap.fill(Qt.transparent) painter = QPainter(pixmap) 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) painter.end() return QIcon(pixmap) def createColorIcon(self, color): pixmap = QPixmap(20, 20) painter = QPainter(pixmap) painter.setPen(Qt.NoPen) painter.fillRect(QRect(0, 0, 20, 20), color) painter.end() return QIcon(pixmap) def createStatusBar(self): self.sbar = self.statusBar() self.lbl_mode = QLabel('Mode: not set') self.sbar.addPermanentWidget(self.lbl_mode) self.lbl_selection = QLabel('Sel: none') self.sbar.addPermanentWidget(self.lbl_selection) def updateStatusBar(self): self.lbl_mode.setText('Mode: ' + self.scene.getMode()) #! This section is not working!!! if len(self.scene.selectedItems()) == 0: self.lbl_selection.setText('Sel: none') elif len(self.scene.selectedItems()) == 1: self.lbl_selection.setText('Sel: ' + self.scene.selectedItems()[0].get_ITGType_as_str()) elif len(self.scene.selectedItems()) > 1: self.lbl_selection.setText('Sel: <multiple>')
class MainWindow(QMainWindow): InsertTextButton = 10 def __init__(self): super(MainWindow, self).__init__() self.createActions() self.createMenus() self.createToolBox() self.scene = DiagramScene(self.itemMenu) self.scene.setSceneRect(QRectF(0, 0, 5000, 5000)) self.scene.itemInserted.connect(self.itemInserted) self.scene.textInserted.connect(self.textInserted) self.scene.itemSelected.connect(self.itemSelected) self.createToolbars() layout = QHBoxLayout() layout.addWidget(self.toolBox) self.view = QGraphicsView(self.scene) layout.addWidget(self.view) self.widget = QWidget() self.widget.setLayout(layout) self.setCentralWidget(self.widget) self.setWindowTitle("Diagramscene") def backgroundButtonGroupClicked(self, button): buttons = self.backgroundButtonGroup.buttons() for myButton in buttons: if myButton != button: button.setChecked(False) text = button.text() if text == "Blue Grid": self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background1.png'))) elif text == "White Grid": self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background2.png'))) elif text == "Gray Grid": self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background3.png'))) else: self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background4.png'))) self.scene.update() self.view.update() def buttonGroupClicked(self, id): buttons = self.buttonGroup.buttons() for button in buttons: if self.buttonGroup.button(id) != button: button.setChecked(False) if id == self.InsertTextButton: self.scene.setMode(DiagramScene.InsertText) else: self.scene.setItemType(id) self.scene.setMode(DiagramScene.InsertItem) def deleteItem(self): for item in self.scene.selectedItems(): if isinstance(item, DiagramItem): item.removeArrows() self.scene.removeItem(item) def pointerGroupClicked(self, i): self.scene.setMode(self.pointerTypeGroup.checkedId()) def bringToFront(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 sendToBack(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 = scale.left(scale.indexOf("%")).toDouble()[0] / 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', QColor(self.textAction.data()))) self.textButtonTriggered() def itemColorChanged(self): self.fillAction = self.sender() self.fillColorToolButton.setIcon( self.createColorToolButtonIcon( ':/images/floodfill.png', QColor(self.fillAction.data()))) self.fillButtonTriggered() def lineColorChanged(self): self.lineAction = self.sender() self.lineColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/linecolor.png', QColor(self.lineAction.data()))) self.lineButtonTriggered() def textButtonTriggered(self): self.scene.setTextColor(QColor(self.textAction.data())) def fillButtonTriggered(self): self.scene.setItemColor(QColor(self.fillAction.data())) def lineButtonTriggered(self): self.scene.setLineColor(QColor(self.lineAction.data())) def handleFontChange(self): font = self.fontCombo.currentFont() font.setPointSize(self.fontSizeCombo.currentText().toInt()[0]) if self.boldAction.isChecked(): font.setWeight(QFont.Bold) else: font.setWeight(QFont.Normal) font.setItalic(self.italicAction.isChecked()) font.setUnderline(self.underlineAction.isChecked()) self.scene.setFont(font) def itemSelected(self, item): font = item.font() color = item.defaultTextColor() self.fontCombo.setCurrentFont(font) self.fontSizeCombo.setEditText(str(font.pointSize())) self.boldAction.setChecked(font.weight() == QFont.Bold) self.italicAction.setChecked(font.italic()) self.underlineAction.setChecked(font.underline()) def about(self): QMessageBox.about(self, "About Diagram Scene", "The <b>Diagram Scene</b> example shows use of the graphics framework.") def createToolBox(self): self.buttonGroup = QButtonGroup() self.buttonGroup.setExclusive(False) self.buttonGroup.buttonClicked[int].connect(self.buttonGroupClicked) layout = 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 = QToolButton() textButton.setCheckable(True) self.buttonGroup.addButton(textButton, self.InsertTextButton) textButton.setIcon(QIcon(QPixmap(':/images/textpointer.png').scaled(30, 30))) textButton.setIconSize(QSize(50, 50)) textLayout = QGridLayout() textLayout.addWidget(textButton, 0, 0, Qt.AlignHCenter) textLayout.addWidget(QLabel("Text"), 1, 0, Qt.AlignCenter) textWidget = QWidget() textWidget.setLayout(textLayout) layout.addWidget(textWidget, 1, 1) layout.setRowStretch(3, 10) layout.setColumnStretch(2, 10) itemWidget = QWidget() itemWidget.setLayout(layout) self.backgroundButtonGroup = QButtonGroup() self.backgroundButtonGroup.buttonClicked.connect(self.backgroundButtonGroupClicked) backgroundLayout = 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 = QWidget() backgroundWidget.setLayout(backgroundLayout) self.toolBox = QToolBox() self.toolBox.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, 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 = QAction( QIcon(':/images/bringtofront.png'), "Bring to &Front", self, shortcut="Ctrl+F", statusTip="Bring item to front", triggered=self.bringToFront) self.sendBackAction = QAction( QIcon(':/images/sendtoback.png'), "Send to &Back", self, shortcut="Ctrl+B", statusTip="Send item to back", triggered=self.sendToBack) self.deleteAction = QAction(QIcon(':/images/delete.png'), "&Delete", self, shortcut="Delete", statusTip="Delete item from diagram", triggered=self.deleteItem) self.exitAction = QAction("E&xit", self, shortcut="Ctrl+X", statusTip="Quit Scenediagram example", triggered=self.close) self.boldAction = QAction(QIcon(':/images/bold.png'), "Bold", self, checkable=True, shortcut="Ctrl+B", triggered=self.handleFontChange) self.italicAction = QAction(QIcon(':/images/italic.png'), "Italic", self, checkable=True, shortcut="Ctrl+I", triggered=self.handleFontChange) self.underlineAction = QAction( QIcon(':/images/underline.png'), "Underline", self, checkable=True, shortcut="Ctrl+U", triggered=self.handleFontChange) self.aboutAction = 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 = QFontComboBox() self.fontCombo.currentFontChanged.connect(self.currentFontChanged) self.fontSizeCombo = QComboBox() self.fontSizeCombo.setEditable(True) for i in range(8, 30, 2): self.fontSizeCombo.addItem(str(i)) validator = QIntValidator(2, 64, self) self.fontSizeCombo.setValidator(validator) self.fontSizeCombo.currentIndexChanged.connect(self.fontSizeChanged) self.fontColorToolButton = QToolButton() self.fontColorToolButton.setPopupMode(QToolButton.MenuButtonPopup) self.fontColorToolButton.setMenu( self.createColorMenu(self.textColorChanged, Qt.black)) self.textAction = self.fontColorToolButton.menu().defaultAction() self.fontColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/textpointer.png', Qt.black)) self.fontColorToolButton.setAutoFillBackground(True) self.fontColorToolButton.clicked.connect(self.textButtonTriggered) self.fillColorToolButton = QToolButton() self.fillColorToolButton.setPopupMode(QToolButton.MenuButtonPopup) self.fillColorToolButton.setMenu( self.createColorMenu(self.itemColorChanged, Qt.white)) self.fillAction = self.fillColorToolButton.menu().defaultAction() self.fillColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/floodfill.png', Qt.white)) self.fillColorToolButton.clicked.connect(self.fillButtonTriggered) self.lineColorToolButton = QToolButton() self.lineColorToolButton.setPopupMode(QToolButton.MenuButtonPopup) self.lineColorToolButton.setMenu( self.createColorMenu(self.lineColorChanged, Qt.black)) self.lineAction = self.lineColorToolButton.menu().defaultAction() self.lineColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/linecolor.png', 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 = QToolButton() pointerButton.setCheckable(True) pointerButton.setChecked(True) pointerButton.setIcon(QIcon(':/images/pointer.png')) linePointerButton = QToolButton() linePointerButton.setCheckable(True) linePointerButton.setIcon(QIcon(':/images/linepointer.png')) self.pointerTypeGroup = QButtonGroup() self.pointerTypeGroup.addButton(pointerButton, DiagramScene.MoveItem) self.pointerTypeGroup.addButton(linePointerButton, DiagramScene.InsertLine) self.pointerTypeGroup.buttonClicked[int].connect(self.pointerGroupClicked) self.sceneScaleCombo = 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 = QToolButton() button.setText(text) button.setIcon(QIcon(image)) button.setIconSize(QSize(50, 50)) button.setCheckable(True) self.backgroundButtonGroup.addButton(button) layout = QGridLayout() layout.addWidget(button, 0, 0, Qt.AlignHCenter) layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter) widget = QWidget() widget.setLayout(layout) return widget def createCellWidget(self, text, diagramType): item = DiagramItem(diagramType, self.itemMenu) icon = QIcon(item.image()) button = QToolButton() button.setIcon(icon) button.setIconSize(QSize(50, 50)) button.setCheckable(True) self.buttonGroup.addButton(button, diagramType) layout = QGridLayout() layout.addWidget(button, 0, 0, Qt.AlignHCenter) layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter) widget = QWidget() widget.setLayout(layout) return widget def createColorMenu(self, slot, defaultColor): colors = [Qt.black, Qt.white, Qt.red, Qt.blue, Qt.yellow] names = ["black", "white", "red", "blue", "yellow"] colorMenu = QMenu(self) for color, name in zip(colors, names): action = QAction(self.createColorIcon(color), name, self, triggered=slot) action.setData(QColor(color)) colorMenu.addAction(action) if color == defaultColor: colorMenu.setDefaultAction(action) return colorMenu def createColorToolButtonIcon(self, imageFile, color): pixmap = QPixmap(50, 80) pixmap.fill(Qt.transparent) painter = QPainter(pixmap) 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) painter.end() return QIcon(pixmap) def createColorIcon(self, color): pixmap = QPixmap(20, 20) painter = QPainter(pixmap) painter.setPen(Qt.NoPen) painter.fillRect(QRect(0, 0, 20, 20), color) painter.end() return QIcon(pixmap)
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.createActions() self.createMenus() self.createToolBox() self.createStatusBar() self.scene = ITGScene(self.itemMenu) self.scene.setSceneRect(QRectF(0, 0, 5000, 5000)) self.scene.itemInserted.connect(self.itemInserted) self.scene.itemSelected.connect(self.itemSelected) # ================================================================ # THIS IS THE PROBLEM SECTION # THIS CAUSES TypeError: native Qt signal is not callable # To reproduce the error, run the program, click on one of the # shapes, then click on the scene area # ================================================================ self.scene.selectionChanged.connect( self.print_item_info) # this one doesn't work self.createToolbars() layout = QHBoxLayout() layout.addWidget(self.toolBox) self.view = QGraphicsView( self.scene) # view and scene established together layout.addWidget(self.view) self.widget = QWidget() self.widget.setLayout(layout) self.setCentralWidget(self.widget) self.setWindowTitle("ITG: Illegitimate Template Generator") #@pyqtSlot() # Adding this does not change the error def print_item_info(self): for item in self.scene.selectedItems(): print(item) def buttonGroupClicked(self, id): buttons = self.buttonGroup.buttons() for button in buttons: if self.buttonGroup.button(id) != button: button.setChecked(False) self.scene.setItemType(id) self.scene.setMode(ITGScene.InsertItem) self.updateStatusBar() def deleteItem(self): for item in self.scene.selectedItems(): self.scene.removeItem(item) def pointerGroupClicked(self, i): self.scene.setMode(self.pointerTypeGroup.checkedId()) self.updateStatusBar() def bringToFront(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, ITGItem)): zValue = item.zValue() + 0.1 selectedItem.setZValue(zValue) def sendToBack(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, ITGItem)): zValue = item.zValue() - 0.1 selectedItem.setZValue(zValue) def itemInserted(self, item): self.pointerTypeGroup.button(ITGScene.MoveItem).setChecked(True) self.scene.setMode(self.pointerTypeGroup.checkedId()) self.updateStatusBar() self.buttonGroup.button(item.ITGType).setChecked(False) def sceneScaleChanged(self, scale): newScale = scale.left(scale.indexOf("%")).toDouble()[0] / 100.0 oldMatrix = self.view.matrix() self.view.resetMatrix() self.view.translate(oldMatrix.dx(), oldMatrix.dy()) self.view.scale(newScale, newScale) def itemColorChanged(self): self.fillAction = self.sender() self.fillColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/floodfill.png', QColor(self.fillAction.data()))) self.fillButtonTriggered() def fillButtonTriggered(self): self.scene.setItemColor(QColor(self.fillAction.data())) def itemSelected(self, item): font = item.font() color = item.defaultTextColor() self.fontCombo.setCurrentFont(font) self.fontSizeCombo.setEditText(str(font.pointSize())) self.boldAction.setChecked(font.weight() == QFont.Bold) self.italicAction.setChecked(font.italic()) self.underlineAction.setChecked(font.underline()) def about(self): QMessageBox.about( self, "About ITG Scene", "The <b>ITG Scene</b> example shows use of the graphics framework." ) def createToolBox(self): self.buttonGroup = QButtonGroup() self.buttonGroup.setExclusive(False) self.buttonGroup.buttonClicked[int].connect(self.buttonGroupClicked) layout = QGridLayout() layout.addWidget(self.createCellWidget("Diamond", ITGItem.Diamond), 0, 0) layout.addWidget(self.createCellWidget("Square", ITGItem.Square), 0, 1) layout.addWidget( self.createCellWidget("Parallelogram", ITGItem.Parallelogram), 1, 0) layout.setRowStretch(3, 10) layout.setColumnStretch(2, 10) itemWidget = QWidget() itemWidget.setLayout(layout) self.backgroundButtonGroup = QButtonGroup() self.toolBox = QToolBox() self.toolBox.setSizePolicy( QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Ignored)) self.toolBox.setMinimumWidth(itemWidget.sizeHint().width()) self.toolBox.addItem(itemWidget, "Basic Components") def createActions(self): self.toFrontAction = QAction(QIcon(':/images/bringtofront.png'), "Bring to &Front", self, shortcut="Ctrl+F", statusTip="Bring item to front", triggered=self.bringToFront) self.sendBackAction = QAction(QIcon(':/images/sendtoback.png'), "Send to &Back", self, shortcut="Ctrl+B", statusTip="Send item to back", triggered=self.sendToBack) self.deleteAction = QAction(QIcon(':/images/delete.png'), "&Delete", self, shortcut="Delete", statusTip="Delete item from ITG", triggered=self.deleteItem) self.exitAction = QAction("E&xit", self, shortcut="Ctrl+X", statusTip="Quit SceneITG example", triggered=self.close) self.aboutAction = 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.fillColorToolButton = QToolButton() self.fillColorToolButton.setPopupMode(QToolButton.MenuButtonPopup) self.fillColorToolButton.setMenu( self.createColorMenu(self.itemColorChanged, Qt.red)) self.fillAction = self.fillColorToolButton.menu().defaultAction() self.fillColorToolButton.setIcon( self.createColorToolButtonIcon(':/images/floodfill.png', Qt.red)) self.fillColorToolButton.clicked.connect(self.fillButtonTriggered) self.colorToolBar = self.addToolBar("Color") self.colorToolBar.addWidget(self.fillColorToolButton) pointerButton = QToolButton() pointerButton.setCheckable(True) pointerButton.setChecked(True) pointerButton.setIcon(QIcon(':/images/pointer.png')) self.pointerTypeGroup = QButtonGroup() self.pointerTypeGroup.addButton(pointerButton, ITGScene.MoveItem) self.pointerTypeGroup.buttonClicked[int].connect( self.pointerGroupClicked) self.sceneScaleCombo = 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(self.sceneScaleCombo) def createBackgroundCellWidget(self, text, image): button = QToolButton() button.setText(text) button.setIcon(QIcon(image)) button.setIconSize(QSize(50, 50)) button.setCheckable(True) self.backgroundButtonGroup.addButton(button) layout = QGridLayout() layout.addWidget(button, 0, 0, Qt.AlignHCenter) layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter) widget = QWidget() widget.setLayout(layout) return widget def createCellWidget(self, text, ITGType): item = ITGItem(ITGType, self.itemMenu) icon = QIcon(item.image()) button = QToolButton() button.setIcon(icon) button.setIconSize(QSize(50, 50)) button.setCheckable(True) self.buttonGroup.addButton(button, ITGType) layout = QGridLayout() layout.addWidget(button, 0, 0, Qt.AlignHCenter) layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter) widget = QWidget() widget.setLayout(layout) return widget def createColorMenu(self, slot, defaultColor): colors = [Qt.black, Qt.white, Qt.red, Qt.blue, Qt.yellow] names = ["black", "white", "red", "blue", "yellow"] colorMenu = QMenu(self) for color, name in zip(colors, names): action = QAction(self.createColorIcon(color), name, self, triggered=slot) action.setData(QColor(color)) colorMenu.addAction(action) if color == defaultColor: colorMenu.setDefaultAction(action) return colorMenu def createColorToolButtonIcon(self, imageFile, color): pixmap = QPixmap(50, 80) pixmap.fill(Qt.transparent) painter = QPainter(pixmap) 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) painter.end() return QIcon(pixmap) def createColorIcon(self, color): pixmap = QPixmap(20, 20) painter = QPainter(pixmap) painter.setPen(Qt.NoPen) painter.fillRect(QRect(0, 0, 20, 20), color) painter.end() return QIcon(pixmap) def createStatusBar(self): self.sbar = self.statusBar() self.lbl_mode = QLabel('Mode: not set') self.sbar.addPermanentWidget(self.lbl_mode) self.lbl_selection = QLabel('Sel: none') self.sbar.addPermanentWidget(self.lbl_selection) def updateStatusBar(self): self.lbl_mode.setText('Mode: ' + self.scene.getMode()) #! This section is not working!!! if len(self.scene.selectedItems()) == 0: self.lbl_selection.setText('Sel: none') elif len(self.scene.selectedItems()) == 1: self.lbl_selection.setText( 'Sel: ' + self.scene.selectedItems()[0].get_ITGType_as_str()) elif len(self.scene.selectedItems()) > 1: self.lbl_selection.setText('Sel: <multiple>')