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 :

Widget avec arrière-plan transparent


Sujet :

Qt

  1. #1
    Invité
    Invité(e)
    Par défaut Widget avec arrière-plan transparent
    Bonjour a tous

    Pour une application perso, j'avais essaye de jouer un peu avec les styles sous Qt4.

    Puis j'ai eu envie de voir si la transparence fonctionnait correctement.
    Un setWindowOpacity(0.8) par exemple me donne bien le resultat escompte, donc j'en deduis que mon systeme est OK (win7 64bits, ainsi qu'une Archlinux 32b avec compositing active).

    Apres, histoire de faire un tout petit peu plus complexe, je decide de rendre uniquement le background de mon widget transparent, tout en laissant ses enfants opaques.

    Je regarde un peu la documentation, et tombe sur l'option WA_TranslucentBackground, qui semble faire ce que je veux.
    Probleme : elle necessite l'activation de FramelessWindowHint, qui retire a ma fenetre sa barre de controle, et la frame principale.
    Par consequent, si je clique entre mes widgets-enfants, mon application en arriere plan est selectionnee (firefox, eclipse, peu importe).

    Je tente une approche plus bourrine, et finalement essaye d'associer Qt::transparent comme couleur dans ma palette, mais je me retrouve avec un background completement noir.

    Existe-t-il un moyen d'avoir le background de mon widget transparent, tout en conservant l'integrite de ma fenetre ? (pas de Frameless), avec barre de controle, etc... gardant leur opacite ?

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    Jusqu'à Qt 4.6, ce que vous demandez n'était pas aisément possible. Aujourd'hui, il existe un moyen bien plus simple de le réaliser, et ce moyen, si j'ai bien compris votre question, s'appelle QGraphicsEffect, ou plus précisément QGraphicsOpacityEffect. Pour effectuer une application d'effet, rien de plus simple, la fonction de QWidget setGraphicsEffect ( QGraphicsEffect * effect ) (lien vers la documentation en français) est utilisable.

    Un petit exemple improvisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Le widget qu'on va rendre transparent (avec parent, le widget parent) :
    QTextEdit *_widget = new QTextEdit(parent);
     
    // Création de l'effet et sélection de l'opacité à 0.5 (par défaut à 0.7) :
    QGraphicsOpacityEffect *_effect = new QGraphicsOpacityEffect;
    _effect->setOpacity(0.5);
     
    // Application de l'effet :
    _widget->setGraphicsEffect(_effect);
    Après, cela reste un exemple très simple. QGraphicsEffect propose de nombreuses autres choses qui s'avèrent être également utiles, selon la nécessité. Il reste bon de savoir qu'il y a une propagation sur les widgets enfants (mais comme on peut appliquer un effet à chaque widget - et par widget -, cela ne devrait pas poser problème).

    Bonne continuation,
    Amnell.

  3. #3
    Invité
    Invité(e)
    Par défaut
    C'est bizarre, je continue d'avoir ces masques noirs partout dans mon widget. Je me demande si je n'ai pas un probleme quelque part au niveau de la gestion du composite sur ma machine ?
    Il faudrait que j'essaie sur mon poste Linux en rentrant !

  4. #4
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Apparemment, QTextEdit n'était pas un bon exemple (sauf à appliquer l'effet sur son viewport() avec _widget->viewport()->setGraphicsEffect(_effect) au lieu de _widget->setGraphicsEffect(_effect)).

    Voici un petit code permettant de tester tout ça :

    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
    #include <QtGui>
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
     
        QWidget _w;
        QVBoxLayout _l;
        QLabel _widget;
        QGraphicsOpacityEffect _effect;
     
        _widget.setText("Test permettant de savoir si cela fonctionne.");
        _l.addWidget(&_widget);
        _w.setLayout(&_l);
        _w.show();
        _w.resize(400, 200);
        _effect.setOpacity(0.5);
        _widget.setGraphicsEffect(&_effect);
     
        return a.exec();
    }
    Théoriquement, cela devrait afficher un texte d'opacité 0.5 (donc plus clair que d'habitude).

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bon, de ce que je peux en voir, ca fonctionne sur les widget "simples", a savoir les Label, les PushButton, mais ca commence a etre bizarre avec les ListWidget et compagnie, ainsi que les widgets de haut niveau.

    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
    #include"widget.h"
    
     #include"ui_widget.h"
    
     #include<QtGui>
    
      Widget::Widget(QWidget*parent):
    
     QWidget(parent),
    
     ui(newUi::Widget)
    
     
    {
    
     ui->setupUi(this);
    
     QGraphicsOpacityEffect*effect=newQGraphicsOpacityEffect;
    
     effect->setOpacity(0.3);
    
     setGraphicsEffect(effect);
    
     }
    
      Widget::~Widget()
    
     {
    
     deleteui;
    
     }
    
    
    avec QtCreator et un projet tout neuf (sans rien dans l'ui a part
    un widget vierge), j'obtiens un bel ecran noir.

  6. #6
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bon, de ce que je peux en voir, ca fonctionne sur les widget "simples", a savoir les Label, les PushButton, mais ca commence a etre bizarre avec les ListWidget et compagnie, ainsi que les widgets de haut niveau.
    Logique, puisque ces widgets ont chacun un viewport. Ainsi, au lieu d'appliquer l'effet au widget lui-même, il faut l'appliquer sur son viewport.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QListWidget *_widget = new QListWidget;
    //...
    _widget->viewport()->setGraphicsEffect(_effect);
    Après, l'effet n'est plus nécessairement l'effet originellement voulu.

  7. #7
    Invité
    Invité(e)
    Par défaut
    je me trompe peut etre, mais de ce que je vois de la documentation Qt4, seul un QWidget ou un QGraphicsItem dispose d'une fonction setGraphicsEffect
    De plus, il ne semble y avoir aucune methode viewport pour les QWidget ???

  8. #8
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Citation Envoyé par Bibi218 Voir le message
    je me trompe peut etre, mais de ce que je vois de la documentation Qt4, seul un QWidget ou un QGraphicsItem dispose d'une fonction setGraphicsEffect
    Ce qui est suffisant, théoriquement. Avec l'héritage, toutes les classes héritant de QWidget directement ou non vont pouvoir utiliser les graphicsEffects. Les QGraphicsItem (sans doute la classe réellement instigatrice de l'ajout des effects) forment la base de tout ce qui est 2D côté scènes/views, ce qui fait que de nombreux éléments utilisables en corrélation avec QGraphicsScene vont pouvoir en profiter. Théoriquement, il n'y a pas de manque de fonctions, juste de performances pour les widgets avec viewport, semble-t-il.

    Citation Envoyé par Bibi218 Voir le message
    De plus, il ne semble y avoir aucune methode viewport pour les QWidget ?
    Seuls certains widgets (QTextEdit, QListView, etc... - bref, les widgets qu'on peut dire "composés") ont une méthode viewport.

  9. #9
    Invité
    Invité(e)
    Par défaut
    mea culpa, viewport est une methode de QAbstractScrollArea, donc ca va mieux ^^

    par contre, je ne comprends pas pourquoi sur mon bout de code ca ne marchait pas, vu que j'applique l'effet a un simple widget (sans viewport donc ?)

    est-ce que j'ai loupe quelque chose ?

  10. #10
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Citation Envoyé par Bibi218 Voir le message
    par contre, je ne comprends pas pourquoi sur mon bout de code ca ne marchait pas, vu que j'applique l'effet a un simple widget (sans viewport donc ?)
    Semble-t-il que ce soit parce que vous tentez d'appliquer l'effet sur le widget de plus haut niveau, soit la fenêtre et non un de ses enfants. De là, à savoir pourquoi cela donne un tel résultat, je n'en sais rien. Dans le pire des cas, il est toujours possible de réimplémenter la fonction draw() de l'effect.

Discussions similaires

  1. Image avec arrière plan transparent
    Par katsuo49 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 13/08/2014, 11h18
  2. Texte avec arrière plan transparent
    Par papyxy dans le forum VBScript
    Réponses: 2
    Dernier message: 23/05/2013, 17h07
  3. Composant dessiner arrière-plan transparent
    Par blinkseb dans le forum Composants VCL
    Réponses: 9
    Dernier message: 18/09/2009, 09h47
  4. Réponses: 3
    Dernier message: 27/11/2008, 16h50

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