Bonjour,
J'ai commencé il y a peu à m'autoformer sur Qt.
Après avoir achevé la lecture de tutoriel Qt, j'ai décidé de commencer à créer un logiciel de traitement d'image.
Le but étant d'apprendre à créer une IHM avec Qt et d'allier ce projet avec ma spécialité : l'Imagerie Numérique.
Ce logiciel n'a pas de valeur commercial, je copie donc chaque mécanique du logiciel d'Adobe afin de m'entrainer et également car cela me donne un résultat à comparer avec mon propre logiciel.
J'ai commencé par créer mon IHM avec Qt Designer, j'ai ajouté un menu, une ToolBar, deux dockWidget (Outils dessin à gauche et Calques à droite).
Au centre de ma fenêtre, j'ai ajouté une mdiArea pour pouvoir afficher plusieurs images (QVector).
Lorsque l'utilisateur clique sur nouveau, une boite de dialogue s'ouvre et l'on peut choisir la taille de son image.
Voici à quoi ça ressemble:
Je gère la partie graphique avec les classes "QGraphicsScene", "QGraphicsView" que j'ajoute dans un container (QMdiSubWindow)
Pour l'instant, trois outils sont disponible (Cercle/Ellipse, Carré et Zoom).
Je récupère la position du curseur lors du clic et je place un cercle ou un carré à l'endroit souhaité. Pour le zoom, j'utilise la fonction "scale()".
Malheureusement deux problèmes se posent à moi.
1-Seul le clic droit est détecté par Qt
j'ai évident surchargé les méthodes "mousePressEvent" et "mouseReleaseEvent"
2-Le cercle/carré n'est pas du tout positionné au bon endroit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void MainWindow::mousePressEvent(QMouseEvent* _event) { m_bClick = true; m_pCursorPoint = _event->globalPos(); emit MouseClick(); } void MainWindow::mouseReleaseEvent(QMouseEvent*) { m_bClick = false; }
J'ai bien tenté de calibrer en soustrayant par la taille de mon image mais ça ne marche pas sur toutes les dimensions d'image (400 par 400 : OK, 800 par 800 : PAS OK)...
Comme vous pouvez le constater, les events souris sont traités dans ma MainWindow et le this du connect est donc ma MainWindow elle même. J'ai pensé que ce serait une bonne idée de déplacé ses évents dans la classe drawing mais malheureusement, je ne détecte plus aucun clic à présent...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void Drawing::DrawEllipse(QPoint _pCursorPoint, QColor _color) { int h = 50, w = 50; QPen pen(_color, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); this->m_graphicsScene->addEllipse(_pCursorPoint.x()-m_width, _pCursorPoint.y()-m_height+h, w, h,pen); }
j'ai déjà arpenté le web de long en large et demandé de l'aide sur les forums, mais personne n'a trouvé de solution à mon problème.
J'espère donc trouver ici quelqu'un à même de m'aider.
Bon weekend à tous.
Partager