1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
import sys
import os
from PyQt5.QtWidgets import QApplication, QComboBox, QMainWindow, QToolBar, QToolButton, QLabel, QGraphicsEllipseItem, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsTextItem, QInputDialog
from PyQt5.QtCore import Qt, QPoint, QCoreApplication
from PyQt5.QtGui import QIcon, QPen, QBrush, QCursor, QTransform
class App(QMainWindow):
def __init__(self):
super().__init__()
self.setMouseTracking(True)
self.title = 'Glisser-Deposer'
self.left = 10
self.top = 40
self.width = 640
self.height = 480
self.drawing_line = None
self.start_circle = None
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
# Créez un QToolBar
self.toolbar = QToolBar(self)
self.addToolBar(Qt.LeftToolBarArea, self.toolbar)
# Catégorie "Construction"
constructionLabel = QLabel("Construction")
self.toolbar.addWidget(constructionLabel)
groupeButton = QToolButton(self)
groupeButton.setText("Groupe")
groupeButton.clicked.connect(self.showConstantDialogForGroupe)
self.toolbar.addWidget(groupeButton)
# Catégorie "Analyse"
analyseLabel = QLabel("Analyse")
self.toolbar.addWidget(analyseLabel)
self.indisComboBox = QComboBox(self)
self.indisComboBox.addItems(["indis", "MAma", "Rfr", "Sssd"]) # Ajoutez une option vide au début pour la valeur par défaut
self.indisComboBox.activated.connect(self.showConstantDialogForIndis)
self.toolbar.addWidget(self.indisComboBox)
# Zone de travail principale
self.scene = QGraphicsScene()
self.view = QGraphicsView(self.scene, self)
self.setCentralWidget(self.view)
self.show()
def showConstantDialogForGroupe(self):
constant, ok = QInputDialog.getInt(self, 'Modifier les constantes', 'Entrez la constante pour Groupe:')
if ok:
# Obtenez la position actuelle du curseur
cursor_pos = self.mapFromGlobal(QCursor.pos())
x, y = cursor_pos.x(), cursor_pos.y()
# Créez l'élément graphique à la position du curseur
item = QGraphicsRectItem(x, y, 100, 40) # Créez un rectangle de taille 100x40 pour avoir de l'espace pour le texte
item.setBrush(QBrush(Qt.blue)) # Définissez la couleur à bleu
item.setFlag(QGraphicsRectItem.ItemIsMovable) # Rendez l'élément déplaçable
# Utilisez la sous-classe HoverableEllipse pour créer les cercles
top_circle = HoverableEllipse(x + 45, y - 10, 10, 10, item) # Le dernier argument "item" lie le cercle au rectangle
bottom_circle = HoverableEllipse(x + 45, y + 40, 10, 10, item)
# Créez les cercles au-dessus et en dessous du rectangle
top_circle = QGraphicsEllipseItem(x + 45, y - 10, 10, 10, item) # Le dernier argument "rect" lie le cercle au rectangle
top_circle.setAcceptHoverEvents(True) # Activez le suivi de la souris pour le cercle supérieur
bottom_circle = QGraphicsEllipseItem(x + 45, y + 40, 10, 10, item)
bottom_circle.setAcceptHoverEvents(True) # Activez le suivi de la souris pour le cercle inférieur
# Ajoutez le nom "Groupe" à l'intérieur du rectangle
text = QGraphicsTextItem("Groupe", item) # Associez le texte à l'élément rectangulaire
text.setDefaultTextColor(Qt.white) # Définissez la couleur du texte à blanc
text.setPos(x + 10, y + 10) # Positionnez le texte à l'intérieur du rectangle
# Ajoutez le groupe (rectangle + cercles) à la scène
self.scene.addItem(item)
def showConstantDialogForIndis(self, index):
if index == 0: # Si l'option vide est sélectionnée, ne faites rien
return
indir = self.indisComboBox.currentText()
constant, ok = QInputDialog.getInt(self, 'Modifier les constantes', f'Entrez la constante pour {indir}:')
if ok:
# Obtenez la position actuelle du curseur
cursor_pos = self.mapFromGlobal(QCursor.pos())
x, y = cursor_pos.x(), cursor_pos.y()
# Créez le rectangle à la position du curseur
item = QGraphicsRectItem(x, y, 100, 40)
item.setBrush(QBrush(Qt.blue))
item.setFlag(QGraphicsRectItem.ItemIsMovable)
# Utilisez la sous-classe HoverableEllipse pour créer les cercles
top_circle = HoverableEllipse(x + 45, y - 10, 10, 10, item) # Le dernier argument "item" lie le cercle au rectangle
bottom_circle = HoverableEllipse(x + 45, y + 40, 10, 10, item)
# Créez les cercles au-dessus et en dessous du rectangle
top_circle = QGraphicsEllipseItem(x + 45, y - 10, 10, 10, item) # Le dernier argument "rect" lie le cercle au rectangle
top_circle.setAcceptHoverEvents(True) # Activez le suivi de la souris pour le cercle supérieur
bottom_circle = QGraphicsEllipseItem(x + 45, y + 40, 10, 10, item)
bottom_circle.setAcceptHoverEvents(True) # Activez le suivi de la souris pour le cercle inférieur
# Ajoutez le nom de l'indicateur à l'intérieur du rectangle
text = QGraphicsTextItem(indir, item)
text.setDefaultTextColor(Qt.white)
text.setPos(x + 10, y + 10)
# Ajoutez le groupe (rectangle + cercles) à la scène
self.scene.addItem(item)
# Réinitialisez la valeur du QComboBox
self.indisComboBox.setCurrentIndex(0)
def mousePressEvent(self, event):
print("mousePressEvent appelé")
# Détectez si le clic est sur un cercle
item = self.scene.itemAt(event.pos(), QTransform())
print(type(item))
if isinstance(item, QGraphicsEllipseItem):
if not self.drawing_line:
# Commencez à dessiner une ligne à partir de ce cercle
start_point = item.scenePos()
self.drawing_line = QGraphicsLineItem(start_point.x(), start_point.y(), start_point.x(), start_point.y())
self.scene.addItem(self.drawing_line)
self.start_circle = item
else:
# Terminez le dessin de la ligne en cliquant sur un autre cercle
end_point = item.scenePos()
self.drawing_line.setLine(self.start_circle.scenePos().x(), self.start_circle.scenePos().y(), end_point.x(), end_point.y())
self.drawing_line = None
self.start_circle = None
def mouseMoveEvent(self, event):
print("mouseMoveEvent appelé")
super().mouseMoveEvent(event)
if self.drawing_line:
line = self.drawing_line.line()
self.drawing_line.setLine(line.x1(), line.y1(), event.pos().x(), event.pos().y())
def closeEvent(self, event):
super(App, self).closeEvent(event)
QCoreApplication.instance().quit()
class HoverableEllipse(QGraphicsEllipseItem):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setAcceptHoverEvents(True)
def hoverEnterEvent(self, event):
# Ce code sera exécuté lorsque la souris entrera dans l'ellipse
self.setBrush(QBrush(Qt.green)) # Changez la couleur en vert lors de la survol
def hoverLeaveEvent(self, event):
# Ce code sera exécuté lorsque la souris quittera l'ellipse
self.setBrush(QBrush(Qt.blue)) # Changez la couleur en bleu lors de la sortie
if __name__ == '__main__':
app = QApplication([])
ex = App()
ex.show()
sys.exit(app.exec_()) |
Partager