CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] Enlever une image existante

Quadrakill
Quadrakill
Niveau 11
27 avril 2013 à 16:10:50

Bonjour à tous :)

Alors voilà, dans le cadre de notre projet de programmation, on doit réaliser un programme. Avec mon binôme, nous avons choisi de faire une reproduction du démineur.

Seulement j'ai un petit problème :

:d) Dans le cas où une case est déjà marquée, si on refait clic droit, ça la démarque. Seulement, je ne sais pas comment faire pour enlever l'image qu'il y a sur le bouton.

Je vous joins le code de mon fichier case.cpp pour y voir plus clair, le problème dont je vous parle ce situe tout en bas de la page.
http://pastebin.com/VAcYV4gt

Si ça se trouve la solution est toute bête, auquel cas je m'excuse... :noel:

PS : Je travaille avec l'environnement Qt.

Merci d'avance.

vive_cod4
vive_cod4
Niveau 9
27 avril 2013 à 18:00:18

Tout simplement tu ne rajoutes pas de label où tu en créer un nouveau vide). Pour cela il faudrait quand ta variable soit un attribut de la classe et que tu fasses :

afficher drapeau -> tu fais setPixmap machin
enlever drapeau -> drapeau = new QLabel...

Sinon tu as des fuites mémoires, n'oublis pas d'utiliser ce que Qt propose (passer le parent dans les constructeurs de QLabel)

vive_cod4
vive_cod4
Niveau 9
27 avril 2013 à 18:06:46

je tiens quand même à faire une remarque :

Quand tu fais des comparaisons, du style if(true==this->estMinee) (ça peut être autre chose que true hein) généralement on met la variable à gauche puis la valeur à laquelle on compare à droite.

Et pour les booléens, mettre ==true est inutile et pour le cas du false tu peux faire if(!variable).

Ensuite pour les ressources de ton jeu, je te conseille fortement d'utiliser qrc que Qt propose (Qt Ressource file), ça évite de mettre des paths dans ton code et tu utilises plutôt des alias à la place. Dans le cas où tu veux ajouter/modifier/supprimer une image, tu le fais à un endroit.

Pour finir, même si c'est personnel, je trouve que faire ça :

if(..)
{...}
else
{
//S'il clique sur un case déjà ouverte, on ne fait rien du tout.
}

n'est pas très utile, enfin c'est mon avis

Pseudo supprimé
Pseudo supprimé 27 avril 2013 à 18:09:56

Visiblement ta classe Case dérive de QPushButton.

Pourquoi ne pas dériver de QToolButton et utiliser la méthode setIcon ?

C'est peut-être plus léger que d'employer un QLabel.

Comme l'a dit vive_cod4, tu crées un QLabel à chaque fois appel de ouvrirCase(void), et surtout sans le rajouter au bouton que constitue Case (il faudrait passer par un layout).

PocoIo
PocoIo
Niveau 10
27 avril 2013 à 18:13:18

Utiliser Qt pour ça c'est un peu de l'overkill et ça complique les choses à mon avis.

Quadrakill
Quadrakill
Niveau 11
27 avril 2013 à 23:24:59

Bonsoir,

Avant tout merci de vos réponses.
Merci de l'astuce de rajouter un Label vide.

Oui j'ai des choses qui peuvent paraître stupides dans mon code mais nos profs de programmation nous ont demandés d'écrire le maximum de détails dans les commentaires pour faciliter la lecture quand ils corrigeront.

J'ai jamais utilisé le qrc de Qt, j'y jetterais un œil si j'ai le temps de finir le projet à temps. Un pote m'a aussi conseillé d'utiliser le setIcon, j'essaierai demain si ça peut simplifier les choses, merci beaucoup.

Et pour finir, qu'est ce que tu appelles de l'overkill ? C'est nos profs qui nous ont dit d'utiliser l'environnement Qt.

Et CoD4 > all CoD :ok:

Encore merci de vos réponses.

vive_cod4
vive_cod4
Niveau 9
28 avril 2013 à 11:12:02

Quadrakill, ce que Pocolo veut dire c'est du style prendre une trançonneuse pour couper du beurre, ça marche mais il y a mieux.

Sinon comme le dit yuser, QToolButton est une bonne alternative

caelacanthe
caelacanthe
Niveau 10
28 avril 2013 à 13:05:17

"généralement on met la variable à gauche puis la valeur à laquelle on compare à droite. "

:d) certes, mais alors tu as le risque de taper if(maVariable = maValeur ) et de t'arracher les cheveux pendant des heures à chercher l'origine d'un comportement aberrant... :hap:

vive_cod4
vive_cod4
Niveau 9
28 avril 2013 à 13:39:26

caelacanthe -> dans la plupart des IDEs, ce genre d'erreur est notifié (par une erreur ou un warning), en tout cas avec eclipse ou visual studio.

Après c'est clair que si tu commence à bosser à 3h du mat sans avoir dormi depuis 20 h, c'est une autre chose. Tout ça pour dire que c'est la première fois que je vois une condition sous cette forme et moi ça me choque.

Pseudo supprimé
Pseudo supprimé 28 avril 2013 à 22:57:29

caelacanthe
Posté le 28 avril 2013 à 13:05:17
certes, mais alors tu as le risque de taper if(maVariable = maValeur ) et de t'arracher les cheveux pendant des heures à chercher l'origine d'un comportement aberrant... :hap:

---------------------

:d) certes, mais c'est un peu stupide pour les booléens, tu peux faire un truc normal du style

if (estOuverte())...

et tu te retrouves avec un truc tout moche si tu utilises le "false == ..." :hap:

Penses-y à l'avenir, c'est sans aucun doute mieux d'avoir du code "parlant", où on situe en un coup d’œil ce que va faire le programme :ok:

Quadrakill
Quadrakill
Niveau 11
29 avril 2013 à 23:28:21

Bonsoir, je up ce sujet car j'ai une erreur que je n'arrive pas à résoudre.

Je vous joins le code :

grille = new QGridLayout;
grille->addWidget(QWidget * LCDMines, 1,1);
grille->addWidget(QWidget * tempsEcoule, 1,2);
grille->addWidget(QWidget * restartBouton, 1,3);
grille->addWidget(QWidget * LCDTime, 2, 1, 1, 3);

Message d'erreur :

erreur : no matching function for call to 'QGridLayout::addWidget(QTimer*&, int, int)'

J'arrive pas à m'en défaire, si vous pouviez m'aider s'il vous plaît. :-(

Quadrakill
Quadrakill
Niveau 11
29 avril 2013 à 23:29:01

Pardon j'ai changé le code en fait, c'était pas le bon :

grille = new QGridLayout;
grille->addWidget(LCDMines, 1,1);
grille->addWidget(tempsEcoule, 1,2);
grille->addWidget(restartBouton, 1,3);
grille->addWidget(LCDTime, 2, 1, 1, 3);

C'est celui là.

Pseudo supprimé
Pseudo supprimé 30 avril 2013 à 20:43:42

Quand tu as une erreur, si tu as QtCreator (et même avec juste g++), tu as le numéro de la ligne, pense à le préciser, c'est toujours mieux.

Comme ça, je dirais que tu tentes d'ajouter un QTimer à un layout. Chose impossible vu qu'un QTimer hérite directement de QObject (et non de QWidget), ce n'est donc pas un widget :ok: :
http://qt-project.org/doc/qt-4.8/qtimer.html

Qu'est ce que 'LCDTime' ?

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment