QT-widget de niveau supérieur avec le clavier et la souris de transparence d'événement?

je veux une application fenêtre principale pour ignorer les événements de la souris et du clavier, en les passant à des applications en dessous dans le gestionnaire de fenêtres Z-order.

je vois comment faire enfant les widgets ignorent les évènements clavier ou souris, mais qu'en est-il de la fenêtre principale?

j'essaie de faire un widget de bureau qui se trouve toujours juste au-dessus de l'arrière-plan et qui est totalement invisible aux évènements clavier et souris. (Passer à travers)

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?

y a-t-il une façon OS-agnostique d'être transparent aux évènements de clavier?

EDIT:

le mot clé ici est transparence.

je ne veux pas manger événements de souris et de clavier, je veux que le gestionnaire de fenêtres sache que je ne les veux pas du tout. Ceux les événements doivent être dirigés à n'importe quelle application est sous moi dans le zorder.

par exemple, je veux pouvoir cliquer sur des icônes de bureau qui sont couvertes par mon widget et interagir avec eux comme si le widget n'était pas là.

38
demandé sur darron 2009-06-12 18:45:43

6 réponses

sur Windows vous pouvez définir WS_EX_TRANSPARENT

pour ce faire dans Qt 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
11
répondu JProgrammer 2013-01-15 23:04:43

Peut-être ce que vous voulez, 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 clavier, Un QWidget ne reçoit aucun événement clavier à moins qu'il n'ait défini lui-même une politique de focus().

setFocusPolicy( Qt::NoFocus );

devrait donc s'occuper des évènements clavier.

8
répondu Marc Mutz - mmutz 2009-07-10 11:27:22

j'ai trouvé la solution suivante (Testée sur Linux, fonctionne aussi sur Windows selon @TheSHEEEP):

setWindowFlags(windowFlags() | Qt::WindowTransparentForInput);

il a été ajouté dans la version plus récente de qt (Je n'ai pas trouvé quand) voir http://doc.qt.io/qt-5/qt.html

6
répondu mxttie 2017-02-22 18:25:13

peut-être que je manque quelque chose ici, mais avez-vous essayé de sous-titrer la classe QMainWindow et d'Outrepasser le QWidget:: event () méthode retourne toujours faux? Si vous avez besoin de gérer certains événements, vous pouvez ajouter cette intelligence ici aussi.

cette technique devrait vous permettre d'inspecter les événements entrant dans l'application et de les ignorer si vous le souhaitez sans avoir à les manger en utilisant 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 au widget de bureau obtenu 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.

2
répondu Joe Corkery 2009-06-19 17:20:50

je pense que la surcharge est censé fonctionner:

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

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

cette fonction retourne true si le l'événement a été reconnu, sinon il renvoie la valeur false. Si l'événement reconnu a été acceptée (voir QEvent:: acceptée), tout autre traitement tel que l'événement propagation vers le widget parent arrêter.

1
répondu Maleev 2009-06-16 18:52:25

Utilisez Qt filtres d'événement: ils permettront à votre application de manger les événements que vous spécifiez (c.-à-d. les événements clavier et souris) mais traiteront tout de même d'autres événements tels que les événements paint.

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);
}
1
répondu Krsna 2009-06-18 14:08:42