2009-04-21 9 views
2

Je suis en train de créer une application dans Qt/C++ avec Qt4.5 et que vous souhaitez les toutes les fenêtres actives pour changer l'opacité sur un événement ... mouseoversouris sur la transparence dans Qt

Si je comprends bien, il y a pas d'événement mouseover explicite dans Qt.

Cependant, j'ai eu un fonctionnement rudimentaire en réimplémentant mousemoveevent() de QWidget dans la classe qui déclare ma mainwindow. Mais le mousemoveevent de la fenêtre principale n'est pas appelé à chaque fois que la souris passe sur l'une des boîtes de groupe que j'ai créées dedans (de toute évidence, QGroupbox a sa propre réimplémentation de mousemoveevent). Donc, comme un travail bon marché, j'utilise toujours le mousemoveevent de ma mainwindow, mais une requête de la position globale de la souris et basée sur la position (x, y) de la mainwindow (obtenue par -> pos()) et la taille de la fenêtre (-> size -> rHeight et rWidth), je vérifie si la souris est dans les limites de la zone de la fenêtre principale et change ainsi l'opacité.

Cela a eu un succès très limité. La bordure droite fonctionne bien, la gauche change l'opacité 4 pixels plus tôt. Le haut ne fonctionne pas (probablement parce que la souris passe par la barre de menu et la barre de titre) et le bas change trop tôt. J'ai pensé à créer une classe QWidget de conteneur vide et ensuite y placer tout le reste, mais je pensais que cela ne résoudrait toujours pas le gros problème du widget de base ne recevant pas le mousemoveevent s'il a déjà été implémenté dans un widget enfant.

S'il vous plaît suggérer des corrections/erreurs que j'ai faites dans ma méthode ou d'autres méthodes pour y parvenir.

p.s. Je doute cette question est importante, mais je travaille Qt Creator IDE, l'intégration ne Qt dans VS2008 (ce sont les mêmes classes Anyways - compilateur différent si, MinGW)

Répondre

2

Installation des filtres d'événements pour chacun de vos widgets enfants pourrait faire l'affaire . Cela permettra à votre fenêtre principale de recevoir des événements enfants tels que ceux de votre groupe. Vous pouvez trouver l'exemple de code here.

1

Si je comprends ce que vous essayez de faire, je serais réimplémentez enterEvent() et leaveEvent() du widget. L'événement mouse enter déclencherait le fade-in et le leaveEvent déclencherait le fade-out.

EDIT: Après avoir relu plusieurs fois, je ne suis toujours pas sûr de ce que vous essayez d'accomplir. Désolé si ma suggestion n'aide pas. :-)

+0

ce que je veux est de changer la transparence sur un événement mousevoer .... mais puisque QGroupBox a déjà implémenté mousemoveevent() [reimp de QWidget] ma fenêtre principale n'a pas appelé mousemoveevent si la souris est au dessus de l'entrée et la sortie était seulement mon travail autour de cela .... mais ma façon maladroite ne tient pas compte de la barre de menu, etc ... si vous en avez autre moyen de le faire, je suis ouvert à lui .... – 147

+0

Vous dites que vous voulez changer la transparence, mais je ne peux pas dire ce que vous voulez changer la transparence de - du code ou un aperçu des widgets que vous avez et vouloir changer aiderait.L'événement filtre les autres suggérés pourrait être la bonne solution, mais ce n'est pas encore clair pour moi ce que vous voulez. – JimDaniel