40 votes

Qt - widget de niveau supérieur avec transparence des événements clavier et souris?

Je veux une application de la fenêtre principale d'ignorer la souris et le clavier événements, en les passant à des applications en dessous, dans la fenêtre du gestionnaire de Z-ordre.

Je vois comment faire de l'enfant widgets ignorer les événements de clavier ou souris, mais comment sur la fenêtre principale?

Je suis en train de faire un widget de bureau qui se trouve toujours un peu plus l'arrière-plan et est totalement invisible pour les évènements souris et clavier. (Passer)

Qt::X11BypassWindowManagerHint me met clavier passer à travers (bien que malheureusement X11 spécifique, mais bien pour le moment), alors comment sur les événements de souris?

Est-il un OS de façon agnostique à être transparent pour les événements de clavier?

EDIT:

Le mot clé ici est la transparence.

Je ne veux pas MANGER de la souris et du clavier événements, je veux le gestionnaire de fenêtre de savoir que je ne veux pas du tout. Ces événements doivent être adressées à ce que l'application est en dessous de moi dans le zorder.

Par exemple, je veux être en mesure de cliquer sur les icônes du bureau qui sont couverts par mon widget et d'interagir avec eux comme si le widget n'était pas là.

11voto

JProgrammer Points 1345

Sous Windows, vous pouvez définir WS_EX_TRANSPARENT

Pour ce faire, utilisez le code suivant:

Inclure l'en-tête,

 #if _WIN32
    #include <windows.h>
#endif
 

et mettez le code suivant dans le constructeur.

 #if _WIN32
    HWND hwnd = (HWND) winId();
    LONG styles = GetWindowLong(hwnd, GWL_EXSTYLE);
    SetWindowLong(hwnd, GWL_EXSTYLE, styles | WS_EX_TRANSPARENT);
#endif
 

8voto

Marc Mutz - mmutz Points 10367

Peut-être que ce que tu veux c'est

 widget->setAttribute(Qt::WA_TransparentForMouseEvents)
 

? C'est ce que QRubberBand utilise pour laisser son parent gérer les événements de la souris. En ce qui concerne les événements de clavier, un QWidget n’obtient aucun événement de clavier à moins qu’il se soit lui-même défini un focusPolicy ().

 setFocusPolicy( Qt::NoFocus );
 

devrait donc prendre en charge les événements de clavier.

2voto

Joe Corkery Points 906

Peut-être que je suis absent quelque chose ici, mais avez-vous essayé de sous-classer la classe QMainWindow et en remplaçant la QWidget::event() la méthode retourne toujours faux? Si vous avez besoin pour gérer certains événements, vous pourriez ajouter que l'intelligence ici.

Cette technique devrait vous permettre d'inspecter les événements à venir dans l'application et de les ignorer, si désiré sans avoir à manger à l'aide d'un filtre d'événement.

Si cela ne fonctionne pas, vous pouvez tenter de rediriger les événements sur le bureau en appelant QCoreApplication::notify() et en passant à l'événement pour le widget de bureau obtenus en appelant QApplication::desktop(). Je n'ai aucune idée si cela fonctionnerait, mais il semblait qu'il pourrait être utile de donner un essai.

1voto

Maleev Points 420

Je pense que le dépassement est censé fonctionner:

 bool YourMainWindow::event( QEvent *event )
{
   event ->accept();
   return true;
}
 

c'est ce que dit la documentation de la classe QWidget à propos de la fonction membre event ():

Cette fonction renvoie true si l'événement a été reconnu, sinon elle renvoie false. Si l'événement reconnu a été accepté (voir QEvent :: Accepté), tout traitement ultérieur, tel que la propagation d'événement vers le widget parent, s'arrête.

1voto

Krsna Points 424

Utilisez les filtres d'événement de Qt: ils permettront à votre application de manger quels que soient les événements que vous spécifiez (par exemple, les événements de clavier et de souris), tout en traitant d'autres événements tels que les événements de peinture.

 bool FilterObject::eventFilter(QObject* object, QEvent* event)
{
    QKeyEvent* pKeyEvent = qobject_cast<QKeyEvent*>(event);
    QMouseEvent* pMouseEvent = qobject_cast<QMouseEvent*>(event);

    if (pKeyEvent || pMouseEvent)
    {
        // eat all keyboard and mouse events
        return true;
    }

    return FilterObjectParent::eventFilter(object, event);
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X