IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Couleur QPushButton juste au survole


Sujet :

Qt

  1. #1
    Membre averti Avatar de Vespasien
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    383
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 383
    Points : 434
    Points
    434
    Par défaut Couleur QPushButton juste au survole
    J'ai 2 classes:
    MM_Test qui contient ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    MM_Test::MM_Test(QWidget *parent) : QDialog(parent) {
            mmw = new MM_Widget(this);
    	but = new QPushButton(this);
    	this->resize(300, 50);
    	connect(but, SIGNAL(clicked()), this, SLOT(setColor()));
    }
     
    void MM_Test::setColor() {
    	QColor *col = new QColor(255, 0, 0, 0);
    	mmw->setColor(col);
     
    }
    MM_Widget qui dérive de QWidget
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void MM_Widget::setColor(QColor *col) {
    	if(col->isValid()) {
    		*mm_color = *col;
    		QPalette pal = colorButton->palette();
    		pal.setColor(QPalette::Button, *mm_color);
    		colorButton->setPalette(pal);
    	}
    }
    La nouvelle couleur de colorButton n'apparait que lorsque je le survole avec ma souris. Si je clic sut but
    Lorsque je clic sur mon bouton (colorButton), j'appelle ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void MM_Widget::updateColor() {
    	QColor col = QColorDialog::getColor(*mm_color, this);
    	if(col.isValid()) {
    		*mm_color = col;
    		QPalette pal = colorButton->palette();
    		pal.setColor(QPalette::Button, *mm_color);
    		colorButton->setPalette(pal);
    	}
    }
    et là, aucun soucis.

    Où ai-je pêché?

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    dsl,
    mais j'ai rien compris.....

  3. #3
    Membre averti Avatar de Vespasien
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    383
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 383
    Points : 434
    Points
    434
    Par défaut
    MM_Test contient un bouton but et un widget mmw
    Le Widget contient lui-même un bouton colorButton et d'autres trucs.

    Si je clic sur but, j'appelle mmw->setColor(QColor *col). Là, çà marche pas bien.

    Si je clic sur colorButton, j'appelle updateColor(). Là, çà marche bien.

    Dysfonctionnement:
    La couleur du bouton n'est pas changée. Elle ne change que lorsque je survole le bouton avec ma souris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include "mm_test.h"
    #include <QPushButton>
     
    MM_Test::MM_Test(QWidget *parent) : QDialog(parent) {
    	QVBoxLayout layout(this);
     
    	mmw = new MM_Widget(this);
    	but = new QPushButton(this);
    	layout.addWidget(mmw);
    	layout.addWidget(but);
    	this->resize(300, 50);
    	connect(but, SIGNAL(clicked()), this, SLOT(setColor()));
    }
     
    void MM_Test::setColor() {
    	QColor *col = new QColor(255, 0, 0, 0);
    	mmw->setColor(col);
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <QtGui>
    #include "MM_Widget.h"
     
    MM_Widget::MM_Widget(QWidget *parent) : QWidget(parent) {
    	mm_value = 0;
    	mm_color = new QColor(255, 0, 0, 0);
    	horizontalLayout = new QHBoxLayout(this);
    	horizontalLayout->setContentsMargins(2, 2, 2, 2);
    	checkBox = new QCheckBox("lalala", this);
    	horizontalLayout->addWidget(checkBox);
    	spinBox = new QSpinBox(this);
    	spinBox->setMaximum(500);
    	horizontalLayout->addWidget(spinBox);
    	colorButton = new QPushButton("", this);
    	horizontalLayout->addWidget(colorButton);
    	colorButton->setMaximumHeight(20);
    	spinBox->setEnabled(false);
    	colorButton->setEnabled(false);
     
    	// connections
    	connect(colorButton, SIGNAL(clicked()), this, SLOT(updateColor()));
    }
     
    void MM_Widget::updateColor() {
    	QColor col = QColorDialog::getColor(*mm_color, this);
    	if(col.isValid()) {
    		*mm_color = col;
    		QPalette pal = colorButton->palette();
    		pal.setColor(QPalette::Button, *mm_color);
    		colorButton->setPalette(pal);
    	}
    }
     
     
    void MM_Widget::setColor(QColor *col) {
    	if(col->isValid()) {
    		*mm_color = *col;
    		QPalette pal = colorButton->palette();
    		pal.setColor(QPalette::Button, *mm_color);
    		colorButton->setPalette(pal);
    	}
    }
    ]

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    De ce que j'ai compris,
    quand tu appuie sur but, tu change la palette d'un element d'une autre widget.
    Seulement, ca ne semble pas appeler un update de cette widget.
    Ajoute colorButton->update() http://qt.developpez.com/doc/latest/qwidget.html#update
    a la fin de setColor(QColor *col)

  5. #5
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    salut, pourquoi tu n'utilise pas betement les feuilles de styles ? surtout que le QPushButton supporte le 'box model'

    http://qt.developpez.com/doc/latest/...ng-qpushbutton

    tu utilises hover pour changer la couleur lors du survol du bouton, puis pressed lorsqu'il est appuye et d'autres ...
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  6. #6
    Membre averti Avatar de Vespasien
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    383
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 383
    Points : 434
    Points
    434
    Par défaut
    J'ai bien essayé d'ajouter colorButton->update() mais le comportement est toujours aussi déconcertant.

    Capture du widget jointe:
    MM_Widget contient: checkBox, spinBox et 'colorButton'
    MM_Test est la fenêtre contenant MM_Widget + but

    Pourquoi je n'utilise pas CSS?
    Cette appli est un programme perso. Je refais en C++ une application que j'avais réalisé en JAVA il y a quelques années. Le but: dérouiller mon C++ et avoir de la programmation interessante à faire (au boulot, c'est pas souvent le cas).
    CSS, je ne connais pas et çà ne m'intéresse pas. Mais, ici, la problématique est ailleurs de toute façon.
    Images attachées Images attachées  

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Vespasien Voir le message
    J'ai bien essayé d'ajouter colorButton->update() mais le comportement est toujours aussi déconcertant.
    et si tu ne met juste update()??

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Kao,

    Quand on connecte un signal et un slot, il faut que qu'ils aient le même nombre de paramètres, et de même type.

    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	connect(but, SIGNAL(clicked()), this, SLOT(setColor()));
    pour appeler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void MM_Widget::setColor(QColor *col)
    ne marche pas correctement, car en fait setColor utilise un pointeur qui n'est pas passé par le signal, et qui contient donc n'importe quoi.
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Membre averti Avatar de Vespasien
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    383
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 383
    Points : 434
    Points
    434
    Par défaut
    Quand on connecte un signal et un slot, il faut que qu'ils aient le même nombre de paramètres, et de même type.
    Ils ont le même nombre de paramètres, c'est à dire aucun. Puisque mon appel setColor() renvoi sur une fonction qui elle crée une QColor et appelle ensuite setColor(QColor *) de l'autre classe.

    De toute façon, la couleur est bien transmise puisqu'au survole par la souris, elle s'affiche.

    Surprenant:
    Je choisi une couleur avec colorButton en cliquant dessus (bleu).
    Je clic sur but et colorButton perd la couleur que je viens de lui donner (reprend la couleur grise initiale). Au survole, bien entendu, je trouve la nouvelle couleur (rouge).

    Tous les update() n'ont rien changés.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Es ce que tu pourrai faire un petit exemple compilable avec ton problème?
    Pour tester.
    C'est vraiment curieux.

    C'est quel version de Qt? tu compile avec quoi?

  11. #11
    Membre averti Avatar de Vespasien
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    383
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 383
    Points : 434
    Points
    434
    Par défaut
    Justement, je compile actuellement la version 4.4.1 de Qt. Je travaillais avec Qt-4.4.0.
    Environnement: Linux Slamd64

    Puisque apparament, le bug n'est pas face au clavier c'est peut-être un bug mineur corrigé entre les 2 versions.

    C-joint un zip contenant les 5 fichiers sources (main.cpp, MM_Test.cpp, MM_Test.h, MM_Widget.cpp, MM_Widget.h). Modifier BUTTON_HEIGHT, c'est une variable globale située dans un autre fichier .h.
    Fichiers attachés Fichiers attachés

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    bon en faite, j'en suis au même point que toi.
    En cherchant un peu sur internet, j'ai trouvé que le problème est dû au style. Mais ce n'est pas un bug...

    Il faut donc utiliser un stylesheet.
    http://qt.developpez.com/doc/latest/...ng-qpushbutton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QString style ="background-color: "+col.name ();
    colorButton->setStyleSheet(style);
    Par contre, pourquoi tu utiliser des pointeurs sur QColor?????

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Hao,
    Citation Envoyé par Vespasien Voir le message
    Quand on connecte un signal et un slot, il faut que qu'ils aient le même nombre de paramètres, et de même type.
    Ils ont le même nombre de paramètres, c'est à dire aucun. Puisque mon appel setColor() renvoi sur une fonction qui elle crée une QColor et appelle ensuite setColor(QColor *) de l'autre classe.
    Désolé, j'avais lu un peu trop en diagonale.
    Si les cons volaient, il ferait nuit à midi.

  14. #14
    Membre averti Avatar de Vespasien
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    383
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 383
    Points : 434
    Points
    434
    Par défaut
    Désolé, j'avais lu un peu trop en diagonale.
    Je l'avais compris.

    Citation Envoyé par Mongaulois
    Par contre, pourquoi tu utiliser des pointeurs sur QColor?????
    J'ai pas trop chercher, dans tous les cas le résultat est aussi surprenant.

    J'ai tenté le coup avec les feuilles de style, çà fonctionne bien mais je me demandais comment faire pour la retrouver au lancement de l'application. Du coup, j'ai pas creusé. Effectivement name() satisfait parfaitement.

    Je considère la chose comme résolue, bien que nous ayons contournés le mur et que cette surprise me laisse un gout bizarre.

    MERCI à tous (même ceux qui ont lus en diagonale ).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Couleur du dernier lien survolé en Css ?
    Par islogged dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 11/10/2012, 23h16
  2. Afficher couleur et infos au survol qui reste persistant après avoir survolé l'élément
    Par majo59 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 15/06/2011, 11h56
  3. Changer la couleur de fond au survol de la souris
    Par sebac dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 02/06/2009, 10h15
  4. Changer la couleur de fond au survol de la souris
    Par sebac dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 29/05/2009, 12h51
  5. Changer de couleur un tr en survol
    Par bubulemaster dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/02/2008, 08h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo