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 :

Opacité, paintEvent et problèmes d'appels récursifs


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 477
    Par défaut
    Bonjour à tous,

    J'essaye de redessiner un QPushButton en gardant son aspect original mais changeant l'opacité. Après pas mal de recherche sur le web la solution qui m'a parue la plus correcte est celle qui consiste à faire dériver QPushButton et à redéfinir la méthode paintEvent().
    Malgré tout un problème d'appel récursif se pose (que je comprends bien, mais auquel je ne trouve pas d'alternative). Voici le code incriminé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void TranslucentButton::paintEvent(QPaintEvent **event)
    {
        QPainter painter(this);
        painter.setOpacity(0.5);
        this->render(&painter);
    }
    en sortie j'obtiens alors :
    QWidget::repaint: Recursive repaint detected
    Le résultat à l'écran est pourtant lui celui attendu.[EDIT] en fait non, pas du tout.
    Une suggestion ?

    PS : En fait, pour essayer d'expliquer un peu plus ce que je cherche à faire, j'aimerais mettre au point une classe générique "GenericTranslucentWidget" descendant de QWidget afin de pouvoir avoir tout les widgets héritant de cette classe translucides sans avoir à redéfinir constamment paintEvent()

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 26
    Par défaut
    Pt que je me trompe mais si dans le créateur tu met dans le css de ton widget principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    background: transparent;
    Tous ce qui sera en dessous (tous ce que ce widget contiendra) sera transparent par défaut.

  3. #3
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 477
    Par défaut
    Oui, mais le widget deviendra alors totalement transparent ( avec background-color: transparent; très exactement).
    Or je veux pouvoir régler l'opacité et aussi pouvoir appliquer une image sur certains widgets.

  4. #4
    Membre confirmé
    Avatar de bobti89
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Par défaut
    Et un simple QWidget::render à la place de this->render donne quoi ?

  5. #5
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 477
    Par défaut
    Même problème. Je donne le code de test pour ceux que ça intéresse. Ici dans le cas d'un bouton :

    translucentboutton.h
    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
     
     
    #ifndef TRANSLUCENTBUTTON_H
    #define TRANSLUCENTBUTTON_H
     
    #include <QPushButton>
     
    #define WIDGETS_OPACITY 0.8
     
    class TranslucentButton : public QPushButton
    {
    	Q_OBJECT
     
    public:
    	TranslucentButton(QWidget *parent);
    	~TranslucentButton();
     
    protected:
    	virtual void paintEvent (QPaintEvent  *event);
     
     
    };
     
    #endif // TRANSLUCENTBUTTON_H
    translucentboutton.cpp

    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
     
    #include "translucentbutton.h"
    #include <QPainter>
    #include <QPaintEvent>
     
     
    TranslucentButton::TranslucentButton(QWidget *parent)
    	: QPushButton(parent)
    {
    	setGeometry(50,50,120,120);
    }
     
     
    void TranslucentButton::paintEvent(QPaintEvent  *event)
    {
    	QPainter painter(this);
    	painter.setOpacity(WIDGETS_OPACITY);
    	QWidget::render(&painter);
     
    }

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Il y a une autre piste à explorer, c'est celle de la gestion des paintEvent() :
    updatesEnabled : bool

    This property holds whether updates are enabled.

    An updates enabled widget receives paint events and has a system background; a disabled widget does not. This also implies that calling update() and repaint() has no effect if updates are disabled.

    By default, this property is true.

    setUpdatesEnabled() is normally used to disable updates for a short period of time, for instance to avoid screen flicker during large changes. In Qt, widgets normally do not generate screen flicker, but on X11 the server might erase regions on the screen when widgets get hidden before they can be replaced by other widgets. Disabling updates solves this.

    Example:

    setUpdatesEnabled(false);
    bigVisualChanges();
    setUpdatesEnabled(true);
    Disabling a widget implicitly disables all its children. Enabling a widget enables all child widgets except top-level widgets or those that have been explicitly disabled. Re-enabling updates implicitly calls update() on the widget.

    Access functions:

    bool updatesEnabled () const
    void setUpdatesEnabled ( bool enable )
    See also paintEvent().
    Peut être qu'en redéfinissant le render(), update() ou repaint() dans ta classe, tu pourras faire ce que tu veux.

    C'est une solution un peu jetée au hasard, sans garantie.

    G.

Discussions similaires

  1. [Lex/Yacc] Problème de typage / appel récursif du parseur de yacc
    Par hitman981 dans le forum Autres langages
    Réponses: 0
    Dernier message: 14/11/2012, 12h01
  2. Problème d'appel de module.
    Par TomPad dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 10h24
  3. Autre contexte mais tjs problème d'appel fct interne
    Par Neilos dans le forum C++Builder
    Réponses: 1
    Dernier message: 28/08/2004, 13h51
  4. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  5. Réponses: 4
    Dernier message: 19/04/2004, 13h41

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