IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Débuter dans la création d'interfaces graphiques avec PyQt 4

Image non disponible


précédentsommairesuivant

VI. Soyons widgets

Image non disponible

Cet exemple montre comment on peut créer un widget personnalisé et en contrôler les tailles minimale et maximale

 
Sélectionnez
#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    setFixedSize(200, 120);

    QPushButton *quit = new QPushButton(tr("Quit"), this);
    quit->setGeometry(62, 40, 75, 30);
    quit->setFont(QFont("Times", 18, QFont::Bold));

    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

VI-A. Analyse du code ligne par ligne

 
Sélectionnez
class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

Ici nous créons une nouvelle classe. Comme cette classe hérite de QWidget, cette nouvelle classe est un widget et peut être, soit une "fenêtre de premier plan", soit un widget enfant (comme le QPushButton du chapitre précédent).

Cette classe possède un seul membre, un constructeur (en plus des membres qu'elle hérite de QWidget). Le constructeur est un constructeur d'un widget standard de Qt ; vous devez toujours inclure un constructeur similaire quand vous créez des widgets.

L'argument est son widget parent. Pour créer une fenêtre de premier plan, vous devez spécifier un pointeur NULL comme parent. Comme vous pouvez le voir, ce widget est une fenêtre de premier plan par défaut.

 
Sélectionnez
MyWidget::MyWidget(QWidget *parent)

L'implémentation du constructeur commence ici. Comme pour la plupart des widgets, ce constructeur ne fait que transmettre le parent au constructeur de QWidget.

 
Sélectionnez
	: QWidget(parent)
{
    setFixedSize(200, 120);

Comme ce widget ne sait pas comment gérer le redimensionnement, nous fixons sa taille. Dans le prochain chapitre, nous verrons comment un widget peut répondre à un événement de redimensionnement déclenché par l'utilisateur.

 
Sélectionnez
    QPushButton *quit = new QPushButton(tr("Quit"), this);
    quit->setGeometry(62, 40, 75, 30);
    quit->setFont(QFont("Times", 18, QFont::Bold));

Ici, nous créons et configurons un nouveau widget, enfant de ce widget (le parent de ce nouveau widget est this, c'est-à-dire l'instance de MyWidget).

L'appel à la fonction tr() pour le texte "Quit" désigne ce texte comme "destiné à être traduit", rendant ainsi possible son remplacement ultérieur à l'exécution à partir du contenu d'un fichier de traduction. C'est une bonne habitude, au cas où vous décideriez plus tard de traduire votre application dans d'autres langues, que d'utiliser tr() pour tous les textes visibles par l'utilisateur.

Notez que quit est une variable locale dans le constructeur. MyWidget ne conserve aucune trace d'elle : Qt, lui, le fait mais la supprimera automatiquement quand l'objet MyWidget sera supprimé. C'est pourquoi MyWidget n'a pas besoin de destructeur (par ailleurs, il n'y a aucun risque à supprimer un enfant quand vous le décidez : l'enfant informe automatiquement Qt de sa mort imminente).

L'appel à QWidget::setGeometry() définit à la fois la position du widget à l'écran et sa taille. Cela revient à appeler QWidget::move() suivi de QWidget::resize().

 
Sélectionnez
    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
}

Le pointeur qApp est une variable globale déclarée dans le fichier d'en-tête QApplication. Il pointe vers l'instance unique QApplication de l'application.

 
Sélectionnez
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

Ici nous instancions notre nouvel enfant, nous l'affichons et nous lançons l'application.

VI-B. Lancer l'application

Ce programme a un comportement similaire au précédent. La différence réside dans la manière dont nous l'avons implémenté. Aussi, il réagit un peu différemment. Essayez juste de le redimmensionner pour voir.

VI-C. Exercices

Essayez de créer un autre objet MyWidget dans la fonction main(). Que se passe-t-il ?

Essayez d'ajouter plus de boutons ou mettez d'autres widgets que QPushButton.


précédentsommairesuivant

Copyright © 2009 - 2021 Developpez.com LLC Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.