FAQ Qt
FAQ QtConsultez toutes les FAQ
Nombre d'auteurs : 26, nombre de questions : 298, dernière mise à jour : 15 juin 2021
Les QObject possèdent un système d'événements.
Ceci leur permet de définir des actions en fonction de certains types d'événements qu'ils reçoivent.
Par exemple, à la fin d'un timer ou lors d'un paint sur un widget.
Il est donc très important de pouvoir les manipuler. Pour cela, il existe deux méthodes.
1 - La surcharge de fonction
Lorsqu'un QObject reçoit un événement,
celui-ci passe par la fonction bool QObject::event(QEvent *).
C'est le point d'entrée lorsqu'un événement arrive sur un QObject.
Cette fonction va ensuite vérifier le type de l'événement et appeler une sous-fonction liée à ce type.
Toutes ces fonctions ont pour signature void XXXEvent(QXXXEvent *) et sont principalement définies
dans QObject
et QWidget.
Par exemple, si l'événement est un QPaintEvent,
la fonction paintEvent() sera appelée. Il suffit donc de choisir la méthode à surcharger
suivant l'événement avec lequel on veut interagir.
Par exemple, comment tracer une courbe en fonction des clics de souris ?
2 - Event filter
Cette méthode consiste à installer un filtre d'événements sur un QObject.
Ce filtre d'événements est en réalité un QObject.
Cette méthode a l'avantage d'éviter des héritages inutiles et de pouvoir manipuler les événements d'un ou plusieurs
autres QObject.
Pour qu'un QObject puisse être utilisé comme filtre, il doit surcharger la méthode bool QObject::eventFilter(QObject *obj, QEvent *event). Cette méthode prend en paramètres un QObject correspondant au QObject à filtrer et un QEvent, son événement. Si la fonction retourne vrai, le traitement de l'événement par QObject est interrompu. Si la fonction retourne faux, l'événement sera traité par le QObject.
Ensuite, il suffit d'appeler la méthode installEventFilter(QObject *) du QObject à filtrer avec pour paramètre le QObject servant de filtre.
la méthode par la surcharge de fonctions est utilisée pour manipuler les événements du QObject par lui-même. Tandis que la méthode avec les filtres d'événements est surtout utilisée pour filtrer et interagir avec les événements d'un autre QObject.
Si une action longue est exécutée (comme un parcours récursif de répertoire, une copie de plusieurs fichiers…) par l'IHM, celle-ci va se geler et ne plus répondre… Pour remédier à cela, il est souvent préférable d'utiliser un thread.
Mais il existe une alternative intéressante lorsque ce traitement n'a vraiment aucun intérêt à être mis dans un thread : QCoreApplication (et donc QApplication ) possède la méthode statique processevents() permettant l'exécution d'une partie ou de tous les événements de la boucle d'événements.
Qt propose un moyen d'écouter les événements clavier (appuis sur une touche du clavier) simplement grâce à la surcharge de méthodes pour tout objet dérivant de QWidget.
- utiliser un dérivé de QWidget, afin de pouvoir surcharger les méthodes keyPressEvent et keyReleaseEvent. C'est ces méthodes qui seront appelées à chaque appui et relâchement d'une touche, et c'est elles qui permettront de décider de l'action à effectuer ;
- paramétrer le dérivé de QWidget pour qu'il accepte le focus (voir QWidget::setFocusPolicy). Ce widget doit avoir le focus au moment où vous souhaitez écouter l'événement clavier (pour une fenêtre, par exemple, celle-ci doit être active).
Nous allons créer la classe MonWidget qui proposera la détection d'événements clavier et qui pourra afficher un message en fonction de la touche relâchée.
#include
<QWidget>
#include
<QKeyEvent>
class
MonWidget : public
QWidget
{
Q_OBJECT
public
:
void
MonWidget(QWidget *
parent =
0
);
protected
:
void
keyReleaseEvent(QKeyEvent *
e);
}
;
#include
<QMessageBox>
MonWidget::
MonWidget(QWidget *
parent) : MonWidget(parent)
{}
//Cette méthode est appelée à chaque relâchement d'une touche clavier
void
MonWidget::
keyReleaseEvent(QKeyEvent *
e)
{
//L'argument e contient entre autres le nom de la touche relâchée
if
(e->
key() ==
Qt::
Key_Space) //Si la touche relâchée est espace
{
QMessageBox msgBox;
msgBox.setText("La touche espace a été relâchée !"
);
msgBox.exec();
}
}
- Il est aussi possible de surcharger keyPressEvent. Cette méthode fonctionne de la même manière que keyReleaseEvent, à la différence qu'elle est appelée lorsque la touche clavier est pressée.
- Voir Qt::Key pour le listing des touches supportées par Qt.
- Il est possible de repérer des combinaisons de touches avec Ctrl, Alt, etc. moyennant QKeyEvent::modifiers. Le listing des modifiers est présent dans l'énumération Qt::KeyboardModifier. Il est aussi possible de récupérer ceci via QApplication::keyboardModifiers. Cette méthode statique est accessible de n'importe où dans votre application Qt.
- utilisation de l'API de votre OS ;
- utilisation de la classe QxtGlobalShortcut de la librairie Qxt.
L'avantage principal de ces alternatives, c'est qu'il est possible de détecter les événements clavier sans focus particulier dans votre application.