2010-11-25 5 views
8

J'ai besoin de créer un widget qt, qui agira comme parent pour d'autres widgets, et qui les ordonnera. Maintenant, la question est de savoir comment rendre son arrière-plan entièrement transparent?Un widget qt avec un fond entièrement transparent

Je pensais que de le faire comme ceci:

struct Imp 
{ 
    Imp(QWidget *parent) : thisWidget(new QWidget(parent)) 
    { 
    thisWidget->setAttribute(Qt::WA_TranslucentBackground, true); 
    } 

    QWidget *thisWidget; 
}; 

Pensez-vous que je dois définir l'attribut, ou est ce que ça va fonctionner très bien sans elle?

+0

Avez-vous vraiment besoin d'un arrière-plan _transparent_, ou est-il suffisant d'avoir _no_ fond? C'est une vraie différence: avec un fond transparent, le système d'exploitation dira à la fenêtre _underlying_ de peindre les pixels. Sans arrière-plan, le système d'exploitation s'attend simplement à ce que les enfants peignent toute la fenêtre. – MSalters

+0

@MSalters Ce widget est placé dans une fenêtre, et seuls les widgets enfants de ce widget doivent être visibles. Tout ce qui est derrière ce widget (s'il n'est pas couvert par un widget enfant) doit être vu. –

+0

Je ne suis pas sûr de comprendre cette question ... par défaut dans Qt4, un QWidget ne dessine rien pour son propre fond, et seuls ses enfants seront dessinés. –

Répondre

3

Par défaut dans Qt4, un QWidget ne dessine rien pour son propre arrière-plan, et seuls ses enfants seront dessinés. Si vous voulez surcharger cela, vous devez indiquer au widget de dessiner son arrière-plan via l'une de ses propriétés. Notez que certains widgets dérivés de QWidget dessinent automatiquement les arrière-plans.

+0

Que faire si je veux juste annuler l'arrière-plan précédemment défini ('backgroundRole'). –

+0

@ TomášZato: La manière la plus simple d'interroger et de mémoriser le paramètre précédent, et de l'utiliser pour le restaurer. L'un des moyens les plus difficiles serait d'interroger le widget pour son parent, obtenir le rôle de l'arrière-plan du parent, et définir cela sur le widget. Tout ceci est compliqué si vous devez laisser le reste de la palette tel quel. –

2

Vous devriez être en mesure de faire toute la personnalisation de dessin dont vous avez besoin en changeant le style de votre widget, je pense

MyWidget {background-color: none;}

devrait fonctionner, les feuilles de style peuvent très facilement être testés dans le concepteur

+0

Si vous faites cela sur un QLineEdit il change l'arrière-plan du transparent au blanc (j'utilise PyQt), même indésirable. Effet drôle. Mais je suis d'accord que l'utilisation de qss est assez confortable la plupart du temps. – Trilarion

0

Vous pouvez consulter:

setAttribute (Qt :: WA_NoSystemBackground, true);

et

setAttribute (Qt :: WA_OpaquePaintEvent, false);

0

La solution qui a fonctionné pour moi (je mettais un fond transparent pour une QTextEditor):

auto editorPalette = editorWidget->palette(); 
editorPalette.setColor(QPalette::Active, QPalette::Base, Qt::transparent); 
editorPalette.setColor(QPalette::Inactive, QPalette::Base, Qt::transparent); 
editorWidget->setPalette(editorPalette); 
Questions connexes