Créer une fenêtre semi-transparente
Qt 4.5 introduit les fenêtres transparentes. Cette page présente comment rendre le fond d'une fenêtre semi-transparent à l'aide de Qt.
Qt gérait déjà la transparence à l'intérieur des fenêtres, mais créer une fenêtre qui est elle-même transparente était jusque ici plus difficile.
Qt 4.5 amène cette fonctionnalité grâce à l'attribut Qt::WA_TranslucentBackground. En utilisant cet attribut, tout le fond de la fenêtre devient transparent, aucun background n'est dessiné.
Voici un exemple:
#include <QtGui>
class Widget : public QWidget{
public:
Widget(){
setAttribute(Qt::WA_TranslucentBackground, true);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(new QLineEdit());
QPushButton *quitButton = new QPushButton("Quit");
connect(quitButton, SIGNAL(clicked(bool)), qApp, SLOT(quit()));
layout->addWidget(quitButton);
}
};
int main(int argc, char **argv){
QApplication app(argc, argv);
Widget widget;
widget.show();
return app.exec();
}
et voici ce que ça donne à l'écran:

On voit maintenant complètement à travers la fenêtre. Activer la transparence c'est bien mais il faudrait ajouter un background semi-transparent pour que le résultat soit joli. Pour ce faire, on va implémenter la méthode paintEvent() et dessiner une couleur semi-transparente sur tout le fond de la fenêtre:
#include <QtGui>
class Widget : public QWidget{
public:
Widget(){
setAttribute(Qt::WA_TranslucentBackground, true);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(new QLineEdit());
QPushButton *quitButton = new QPushButton("Quit");
connect(quitButton, SIGNAL(clicked(bool)), qApp, SLOT(quit()));
layout->addWidget(quitButton);
}
protected:
void paintEvent(QPaintEvent * event){
QPainter painter(this);
QColor black = Qt::black;
black.setAlpha(150);
painter.fillRect(event->rect(), black);
}
};
int main(int argc, char **argv){
QApplication app(argc, argv);
Widget widget;
widget.show();
return app.exec();
}
Et voilà le résultat:

Quelques remarques
Qt a rendu l'utilisation des fenêtre transparente un peu trop facile. Réfléchissez bien avant de faire des fenêtres transparentes, si ça n'apporte rien à votre programme, inutile de l'ajouter. Si vous prenez les logiciels récent de Apple par exemple, ils ont tellement abusé sur la transparence que certaines fenêtre sont devenues inutilisable. Pensez donc à rester raisonnable, et à utiliser un fond qui permet d'avoir une fenêtre utilisable quel que soit la couleur qui se trouve derrière.
Sur Linux, cette fonctionnalité n'est possible que si le bureau utilise un gestionnaire de fenêtre composite, et si ARGB32 visual est utilisé. Ces deux conditions sont généralement respecté sur n'importe quel distribution récente.
Sur certains Windows, activer la transparence requiert l'utilisation du flag Qt::FramelessWindowHint. Il s'agit d'une limitation du gestionnaire de fenêtre de Windows.
Sur Mac OS X, je pense que la transparence des fenêtres est géré sur n'importe quel version.

