Les Événements et le Dessin dans les Applications Qt

Les Événements dans Qt

Présentation

Les programmes Qt sont pilotés par des événements, où chaque interaction est initiée par un événement interne. La génération et le traitement des événements forment le cycle d'exécution principal, présents tout au long de l'application. Les types courents incluent :

  • Événements de temporisation, clavier, souris, dessin
  • Événements de glisser-déposer, molette, focus, entrée/sortie
  • Événements de déplacement, redimensionnement, affichage, fenêtre

Qt convertit les messages système en événements Qt, encapsulés en objets héritant de la classe abstraite QEvent. Tout QObject peut traiter ces événements.

Origine des Événements

Événements système d'exploitation : Immédiatement envoyés à l'objet QWidget correspondant, traités via la fonction virtuelle event(QEvent*), qui appelle des gestionnaires spécifiques émettant des signaux prédéfinis.

Événements générés par l'application : Utilisation de QApplication::postEvent() pour un envoi asynchrone (ex: QWidget::update()) et QApplication::sendEvent() pour un envoi synchrone (ex: QWidget::repaint()).

Traitement des Événements

Pour personnaliser le traitement, on redéfinit les fnoctions virtuelles dans des sous-classes de QWidget. Par exemple :

  • mousePressEvent(QMouseEvent*) pour les clics souris
  • paintEvent(QPaintEvent*) pour le dessin

Événements de Temporisation

Qt offre deux mécanismes : événements de timer via QObject et signaux via QTimer.

Exemple avec QObject :

int QObject::startTimer(int interval); // Lance le timer, retourne son ID
void QObject::timerEvent(QTimerEvent*); // Gestionnaire d'événement
void QObject::killTimer(int id); // Arrête le timer

Horloge et Chronomètre

Conception de l'interface utilisateur avec des composants tels que des afficheurs LCD et boutons.

Implémentation de l'horloge en utilisant un QTimer :

#include <QTimer>
#include <QTime>

private slots:
    void on_timerHorloge_timeout();
private:
    QTimer m_horloge;

Connexion du signal timeout à la fonction slot pour mettre à jour l'affichgae chaque seconde.

Pour le chronomètre, redéfinition de timerEvent avec un intervalle d'une milliseconde :

void ChronometreDialog::timerEvent(QTimerEvent *) {
    m_chrono = m_chrono.addMSecs(1);
    ui->affichageTemps->display(m_chrono.toString("HH:mm:ss.zzz"));
}

Événements Souris

Surcharge des fonctions virtuelles pour gérer les interactions souris :

  • mousePressEvent pour les appuis
  • mouseMoveEvent pour les mouvements
  • mouseReleaseEvent pour les relâchements

Exemple de déplacement d'un label par glisser-déposer :

void SourisDialog::mousePressEvent(QMouseEvent *e) {
    if (e->button() == Qt::LeftButton) {
        QRect zoneLabel = ui->blocMobile->geometry();
        if (zoneLabel.contains(e->pos())) {
            m_glissement = true;
            m_decalage = ui->blocMobile->pos() - e->pos();
        }
    }
}

void SourisDialog::mouseMoveEvent(QMouseEvent *e) {
    if (m_glissement) {
        QPoint nouvellePosition = e->pos() + m_decalage;
        // Limitation à la zone de la fenêtre
        QSize tailleFenetre = this->size();
        int xMin = 0, xMax = tailleFenetre.width() - ui->blocMobile->width();
        int yMin = 0, yMax = tailleFenetre.height() - ui->blocMobile->height();
        nouvellePosition.setX(qBound(xMin, nouvellePosition.x(), xMax));
        nouvellePosition.setY(qBound(yMin, nouvellePosition.y(), yMax));
        ui->blocMobile->move(nouvellePosition);
    }
}

Événements Clavier

Fonctions virtuelles pour les touches : keyPressEvent et keyReleaseEvent, similaire aux événements souris.

Événements de Dessin

Déclenchement de paintEvent lors de l'affichage initial, du changement de visibilité, du redimensionnement, ou des appels à update()/repaint().

Exemple de visionneuse d'images :

#include <QPainter>

void Visionneuse::paintEvent(QPaintEvent *) {
    QPainter peintre(this);
    QRect zoneImage = ui->cadreImage->frameRect();
    zoneImage.translate(ui->cadreImage->pos());
    QImage image(":/images/" + QString::number(m_indexImage) + ".jpg");
    peintre.drawImage(zoneImage, image);
}

Dessin dans Qt

Stylo (QPen)

Configuration des lignes : couleur, largeur, style, etc.

Fonction Description
void setColor(const QColor &c) Définit la couleur du stylo
void setWidth(int l) Épaisseur de la ligne
void setStyle(Qt::PenStyle s) Style de la ligne (pointillé, etc.)

Pinceau (QBrush)

Paramétrage du remplissage des zones.

Fonction Description
void setColor(const QColor &c) Couleur de remplissage
void setStyle(Qt::BrushStyle s) Style de remplissage (plein, hachuré, etc.)
void setTexture(const QPixmap &p) Utilise une image comme texture

Police (QFont)

Gestion du texte : gras, italique, taille, etc.

Fonction Description
void setBold(bool activer) Active le style gras
void setFamily(const QString &famille) Définit le nom de la police
void setPointSize(int taille) Taille en points

Système de Dessin

QPainter pour les opérations graphiques, QPaintDevice comme surface cible (QWidget, QPixmap, QImage).

Exemple de dessin avec stylo et pinceau :

void DessinDialog::paintEvent(QPaintEvent *) {
    QPainter artiste(this);
    QPen stylo;
    stylo.setColor(Qt::red);
    stylo.setWidth(5);
    stylo.setStyle(Qt::DashDotLine);
    artiste.setPen(stylo);

    QBrush pinceau;
    pinceau.setColor(Qt::yellow);
    pinceau.setStyle(Qt::SolidPattern);
    artiste.setBrush(pinceau);

    int largeur = width(), hauteur = height();
    artiste.drawRect(QRect(QPoint(largeur/5, hauteur/5), QPoint(4*largeur/5, 4*hauteur/5)));

    stylo.setColor(Qt::blue);
    stylo.setWidth(3);
    stylo.setStyle(Qt::SolidLine);
    artiste.setPen(stylo);

    pinceau.setTextureImage(QImage(":/images/texture.png"));
    pinceau.setStyle(Qt::TexturePattern);
    artiste.setBrush(pinceau);
    artiste.drawRect(QRect(QPoint(2*largeur/5, 2*hauteur/5), QPoint(3*largeur/5, 3*hauteur/5)));
}

Étiquettes: Qt événements Dessin QTimer QPen

Publié le 4 juin à 17h19