Bonjour tout le monde,
je reviens suite à un petit problème que j'avais rencontré lorsque j'essayais de rendre transparente une fenêtre afin que l'on puisse voir ce qu'il y a en arrière-plan tout en gardant la main sur la fenêtre.
Pour préciser mon objectif, je souhaite pouvoir intégrer un widget transparent avec une vue à une fenêtre windows.
J'avais alors rencontré les problèmes suivants :
- Malgré l'appel de certains paramètres qui rendaient mon widget principal et ma vue intérieure transparentes, j'avais la possibilité de cliquer sur des boutons de mon widget sans pour autant avoir la possibilité de dessiner mes figures dans ma vue (un clic sur la vue se répercutait en fait sur l'arrière plan, par exemple, si je lance l'appli sur mon bureau, un clic dans la vue entraîne par exemple la sélection d'un icône de mon bureau..)
- Ensuite, j'ai regardé du côté d'un paramètre d'opacité pour la fenêtre. Je peux alors lui passer un certain taux pour la rendre transparente tout en pouvant garder la main sur la fenêtre et la vue. Cependant, cette fois-ci, les dessins dans la vue sont eux aussi influencés par la condition d'opacité (ils sont transparents alors que je voudrais qu'ils apparaissent très clairement, contrairement à la vue et à la fenêtre contenant la vue).
- Ne trouvant pas de solutions, je suis parti sur l'idée d'utiliser QWinHost en utilisant la méthode setWindow() avec le HWND de la fenêtre windows dans laquelle je souhaite intégrer une vue transparente. Jusqu'ici, pas de soucis. J'ai récupéré le code suivant :
J'ai donc ici par exemple le handle de QtCreator. Le setVisible que je fais sur l'host fonctionne alors et QtCreator n'apparaît plus dans le layout.
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 int main(int argc, char **argv) { QApplication a(argc, argv); HWND hFore = GetForegroundWindow(); printf("le handle de la fenêtre au premier plan est : 0x%X", hFore); QMainWindow mw; mw.menuBar()->addMenu("&File")->addAction("&Exit", &a, SLOT(quit())); QWidget central(&mw); QLineEdit edit(¢ral); HostWindow host(¢ral); QObject::connect(&host, SIGNAL(message(const QString&,int)), mw.statusBar(), SLOT(showMessage(const QString&,int))); QObject::connect(&edit, SIGNAL(returnPressed()), &host, SLOT(returnPressed())); QVBoxLayout vbox(¢ral); vbox.addWidget(&edit); vbox.addWidget(&host); host.setWindow(hFore); host.setVisible(false); QVBoxLayout *box = new QVBoxLayout; QLineEdit *edit1 = new QLineEdit("coucou"); box->addWidget(edit1); QLineEdit *edit2 = new QLineEdit("salut"); box->addWidget(edit2); host.setLayout(box); mw.setCentralWidget(¢ral); mw.show(); return a.exec(); }
Seulement, quand j'essaie de créer un layout que j'attribue à mon host dans lequel j'ajoute (avant de tester une vue transparente) par exemple des QLineEdit, je ne les vois pas apparaître dans la fenêtre QtCreator passée à mon HostWindow à l'exécution. Ce dernier n'agit pas vraiment comme un widget ? Y a-t-il une subtilité qui m'échappe ?
Merci beaucoup![]()
Partager