Participation de gbdivers
Commentaires :
Le widget fonctionne correctement avec l'affichage de l'intégralité des nuances de gris d'une couleur ainsi qu'une sélection précise et correcte de la couleur pointée. Utilisation d'une méthode de calcul de l'ensemble des pixels avec la fonction QColor::fromHsvF().
Le seul bémol est l'utilisation de la fonction setMouseTracking(true) et d'un booléen m_tracking pour savoir si le bouton de la souris est pressé ou non pour sélectionner la couleur dans mouseMoveEvent à ce moment-là. Lorsque setMouseTracking est désactivé (comportement par défaut), la fonction mouseMoveEvent est cependant appelée lorsqu'un bouton de la souris est pressé. Un test pour savoir quel bouton de la souris est pressé dans la fonction mouseMoveEvent suffirait largement et éviterait d'appeler cette fonction chaque fois que la souris se déplace sur le widget (même si la condition sur m_tracking fait qu'il ne ce passe rien).
La sélection de la couleur s'arrête lorsqu'on sort du widget et recommence à l'endroit ou l'on rentre de nouveau provoquant un saut du curseur. Il serait intéressant de permettre de continuer la selection en dehors du widget. De plus l'erreur QImage::pixel: coordinate (693,-4) out of range est affichée sur la sortie standard lorsque la souris est pressé et déplacé en dehors du widget (corrigé par le participant après coup).
Très bonne participation dans l'ensemble !
Les plus :
- réalisation d'un document PDF expliquant les choix de conception ;
- changement du point de sélection d'une couleur (blanc ou noir) en fonction de la zone pointée pour un meilleure contraste ;
- utilisation des signaux et des slots pour la communication entre widgets ;
- utilisation d'une sous classe de QWidget permettant de réimplémenter les gestionnaires événementiels afin de dessiner et de sélectionner la couleur dans le gradient ;
- utilisation d'une simple ellipse pour dessiner le point actuellement selectionné ;
- personnalisation du point de sélection possible ;
- code C++ de bonne qualité.
Les moins :
- peu d'originalité dans le design du widget, forme rectangulaire ;
- aucun commentaire dans le code notamment sur le calcul HSV ;
- utilisation de setMouseTracking(true) ;
- pas de changement de curseur permettant de savoir qu'on est en mode sélection ;
- arrêt de la sélection de la couleur quand on sort du widget.
Capture d'écran :
http://qt.developpez.com/exercices/0...ture_ecran.png
Sources :
Archive
Participation de abdelite
Commentaires :
L'indentation n'est pas toujours des meilleures. Par exemple, un return aligné sur l'initialisation de la variable retournée : sémantiquement, on peut comprendre qu'on fasse tout ce qui concerne une variable dans un bloc. La retourner, c'est plus du niveau de la fonction que de la variable. Ne pas hésiter à aérer le code : parfois un retour à la ligne entre les initialisations et le traitement, parfois pas.
Peu d'explication sur les choix et les valeurs des variables. Le nombre 21 se balade dans le code... Si il s'agit d'une constante de taille par exemple, le définir dans le header, un namespace anonyme ou n'importe quoi mais ne pas l'utiliser directement dans le code. Si tu veux changer la hauteur de ton widget tu dois ensuite la modifier partout. Pour 255, ça peut se comprendre car c'est une valeur universelle qui ne changera jamais.
Le nom du widget, GradientValue, me paraît très mal choisi : il correspond à une valeur, pas à un widget ou à quelque contrôle permettant de choisir une couleur. Son nom indique un helper, pas un élément graphique. Un nom comme ColorChooser aurait été bien plus explicite.
Il n'y pas de sélection a proprement parler avec un clique de la souris et un symbole permettant de voir le point sélectionné, l'utilisation de setMouseTracking(true) est très étrange pour un widget de la sorte mais implémenté correctement par rapport aux autres participations.
Comportement très étrange à mon goût, le widget ne fait pas la même taille en fonction de la couleur sélectionné. Je n'ai jamais vu un widget de sélection de gradient changer de taille. Ton calcul de la largeur du widget est fait à l'aide de la valeur de la saturation. Tu peux nous expliquer pourquoi ?
Les valeurs choisis ne sont pas correctes quand on sélectionne une autre couleur que le blanc par contre la pixmap affiché est bonne :
http://qt.developpez.com/exercices/0...te_erreurs.png
Si j'ai bien compris dans ton message ta participation n'était pas totalement fini et prore, mais je me permet de faire quelques commentaires sur le code, cela peut t'aider ainsi que n'importe quel lecteur.
Classe Window :
Code inutile ->
La fonction paintEvent n'a aucune utilité ici et n'est absolument pas virtuelle pure donc obligatoire.
Code:
1 2 3 4 5
| void Window::paintEvent(QPaintEvent* argPaintEvent)
{
Q_UNUSED(argPaintEvent);
} |
Améliorations ->
Lorsqu'on veut sélectionner une couleur on repars toujours de la couleur blanche à cause de cette ligne de code :
Code:
m_color = QColorDialog::getColor(Qt::white, this);
Il serait plus logique de repartir de la couleur précédemment sélectionné avec :
Code:
m_color = QColorDialog::getColor(m_color, this);
Classe GradientValue :
Qu'elle est l'intérêt d'avoir tes attributs en protected alors qu'ils ont soit un accesseur/modificateur public, soit uniquement interne au widget. A mettre tout en private.
L'idée d'utiliser QPixmapCache pour stocker les pixmap générés est super coté optimisation mais ne fonctionne que dans le cas d'un widget de taille fixe (ce qui est ton cas).
Du code de test dans une projet rendu ça ne le fait pas trop...
Code:
QMessageBox::information(this, "test", QColor::fromHsl(65, 98, 255).name());
Au final participation un peu trop brouillon, il faudrait essayer de rendre un projet plus propre. La sélection de la valeur dans le gradient est à revoir car incorrecte par rapport à la pixmap affichée.
Les plus :
- utilisation des signaux et des slots pour la communication entre widgets ;
- utilisation d'une sous classe de QWidget permettant de réimplémenter les gestionnaires événementiels afin de dessiner et de sélectionner la couleur dans le gradient ;
- utilisation de QPixmapCache pour mettre en cache la pixmap calculé ;
- code C++ correct.
Les moins :
- peu d'originalité dans le design du widget, forme rectangulaire ;
- aucun commentaire dans le code notamment sur la création de la pixmap generatePixmap() ;
- utilisation de setMouseTracking(true) peu utile mais bien utilisé ;
- pas de changement de curseur permettant de savoir qu'on est en mode sélection ;
- pas de sélection avec clique de souris ;
- widget changeant de taille en fonction de la couleur choisis ;
- la couleur affiché lors du survol de la souris est incorrecte malgré une pixmap correcte à l'écran.
Capture d'écran :
http://qt.developpez.com/exercices/0...ture_ecran.png
Sources :
Archive