FAQ Qt
FAQ QtConsultez toutes les FAQ
Nombre d'auteurs : 26, nombre de questions : 298, dernière mise à jour : 15 juin 2021
- Comment ajouter un lien vers une page HTML ?
- Comment créer un écran de démarrage ?
- Comment valider des entrées de l'utilisateur dans une zone d'édition ?
- Comment manipuler du texte sélectionné avec QTextCursor ?
- Comment obtenir et modifier la position de la souris à l'écran ?
- Comment récupérer l'identifiant système d'une fenêtre ou d'un widget ?
- Comment afficher un widget dans une zone MDI ?
- Comment créer des onglets ?
- Comment réaliser une fenêtre avec une barre de progression ?
La façon la plus simple est d'utiliser un QLabel et ses possibilités de Rich text. Pour cela il suffit :
- d'autoriser l'ouverture vers une page Web ;
- d'attribuer au texte du label une portion de code contenant le lien HTML : <a href='site référencé'>XXXXX</a>,
où XXX peut être :
- une phrase simple,
- une phrase en HTML : <font size='S' family='...' color='C'> ... </font>, avec :
- size : taille de la police (facultatif),
- family : police à utiliser, dans l'ordre de préférence (facultatif),
- color : couleur du texte,
- il est possible de compléter la phrase en utilisant les balises de formatage de texte comme gras (<b>...<\b>), italique (<i>...</i>)… ;
- une image en HTML : <img src='MON_IMAGE' height='H' width='W'>, avec :
- src : path de l'image à afficher (peut se situer dans les ressources),
- height : hauteur de l'image (facultatif),
- width : largeur de l'image (facultatif).
Qt propose la classe QSplashScreen pour simplifier la gestion des écrans de démarrage. Un écran de démarrage est une image affichée lors du démarrage d'un programme, pour faire patienter l'utilisateur durant le démarrage lent de l'application et/ou par intérêt commercial, informatif ou esthétique.
Remarque :
- QSplashScreen est lancé avant la boucle d'événement de l'application, il est donc préférable d'appeler QApplication::processEvents() de temps en temps pour traiter les événements en cours.
Qt fournit un mécanisme de gestion de la validation et de vérification des entrées utilisateur dans une zone d'édition. La classe de base est la classe QValidator, dont dérivent les classes QDoubleValidator, QIntValidator, et QRegExpValidator. L'utilisation de ces classes est très simple, au moins pour les deux premières.
Voici un exemple d'utilisation. On veut limiter l'entrée dans une zone d'édition aux seuls nombres entiers compris entre 0 et 100.
// On définit un objet de type QIntValidator acceptant uniquement des nombre entiers entre 0 et 100
QIntValidator
*
validator =
new
QIntValidator
(0
, 100
, this
);
// Création d'une zone d'édition : ici une QLineEdit
QLineEdit
*
edit=
new
QLineEdit
(this
);
// On applique l'objet QIntValidator à la zone d'édition
edit->
setValidator(validator);
Le même principe est utilisable pour contrôler par exemple une valeur double avec QDoubleValidator. Si l'on souhaite un motif spécifique par exemple une adresse IP, un numéro de téléphone ou autre, il faut utiliser la classe QRegExpValidator ou créer soi-même un validateur à partir d'une classe dérivant de QValidator.
Les curseurs sont très utilisés dans les classes pouvant les accueillir (comme l'autorisent par défaut QTextEdit, QTextBrowser et d'autres classes encore).
Pour retrouver la sélection courante qu'a faite l'utilisateur d'un programme, il suffit d'utiliser la fonction selectedText() de la manière qui suit :
// QString QTextCursor::selectedText () const
widget->
textCursor().selectedText();
Note : cette fonction, retournant un QString, peut parfaitement être vide (empty, en anglais).
Il est de même possible de supprimer la sélection courante à l'aide de removeSelectedText() :
// void QTextCursor::removeSelectedText ()
widget->
textCursor().removeSelectedText();
Note : la suppression ne se produira que si du texte a effectivement été sélectionné.
L'insertion de texte avec l'assistance des curseurs s'effectue avec insertText() qui entre du texte à partir de la position du curseur.
// void QTextCursor::insertText ( const QString & text, const QTextCharFormat & format )
widget->
textCursor().insertText("Chaîne de type QString"
);
Voici un exemple, reprenant ce qui est inscrit ci-dessus, permettant d'effectuer une modification sur un texte sélectionné sans pour autant modifier plusieurs chaînes identiques :
// ...
zoneTexte =
new
QTextEdit
(this
);
connect
(zoneTexte, SIGNAL
(selectionChanged()), this
, SLOT
(transformer()));
// ...
void
XXXXXXXX::
transformer()
{
// On garde en mémoire le texte sélectionné
QString
selectionTexte(zoneTexte->
textCursor().selectedText());
// On supprime celui-ci sans pour autant supprimer les chaînes identiques
zoneTexte->
textCursor().removeSelectedText();
// Et on effectue l'opération voulue au départ
zoneTexte->
textCursor().insertText("<italique>"
+
selectionTexte +
"</italique>"
);
}
- QPointQCursor::pos () : retourne la position de la souris ;
- void QCursor::setPos ( const QPoint & ) : prend en paramètre la nouvelle position de la souris.
Il peut parfois être nécessaire de vouloir récupérer l'identifiant système d'une fenêtre ou d'un widget, notamment si l'on souhaite utiliser Qt avec les API spécifiques à chaque système. Pour cela, Qt fournit la méthode WId QWidget::winId () const.
#include
<windows.h>
//...
HWND hwnd =
monWidget->
winId();
#include
<X11/X.h>
//...
Window window =
reinterpret_cast
<
Window>
(monWidget->
winId());
#include
<Carbon/Carbon.h>
//...
HIViewRef view =
reinterpret_cast
<
HIViewRef>
(monWidget->
winId());
#include
<Cocoa/Cocoa.h>
//...
NSView *
view =
reinterpret_cast
<
NSView*>
(monWidget->
winId());
La zone MDI est une sorte d'émulation d'un bureau qui va permettre d'afficher un ou plusieurs widgets avec une décoration. Lors de l'ajout d'un widget, son affichage n'est pas automatique.
- l'ajout après construction : si les widgets sont ajoutés juste après la construction du QMDIArea, ils seront automatiquement affichés ;
- l'ajout dynamique : un widget ajouté à un QMDIArea possède les mêmes propriétés qu'un widget sans parent et doit donc être explicitement affiché par show() ou équivalent.
Qt fournit avec la classe QTabWidget un moyen très simple pour créer et gérer les onglets. Celle-ci permet d'empiler sous la forme d'onglets les QWidget les uns sur les autres à l'aide de la fonction addTab().
Un petit exemple ci-dessous :
Lorsque le nombre d'onglets est important, la barre d'onglets reste sur une seule ligne et des flèches de navigation apparaissent. Il n'est pas possible, à l'aide du framework Qt, d'avoir une barre d'onglets sur plusieurs lignes. Avoir un nombre important d'onglets est considéré comme un choix d'interface graphique à éviter par les développeurs de Qt.
Qt fournit la classe QProgressDialog, qui sert justement à afficher une fenêtre agrémentée d'une barre de progression.
Commençons par en créer une simple.
QProgressDialog
progress("Copying files..."
, "Abort Copy"
, 0
, numFiles, this
);
Cet exemple tiré de la documentation prend cinq paramètres.
- Le premier est le texte qui sera affiché près de la barre pour rappeler à l'utilisateur quelle opération est en cours ;
- Le second est le texte du bouton Annuler ;
- Les troisième et quatrième arguments sont les bornes minimale et maximale, respectivement, de la barre de progression ;
- Le cinquième est le parent de la boîte de dialogue, comme d'habitude.
Le concept des bornes est expliqué dans le détail ci-dessous.
Premièrement, vous pouvez utiliser le slot setValue(int) pour définir l'avancement de la tâche, tandis que value() permet de lire cette valeur. Comme il s'agit d'un slot, vous pouvez l'utiliser dans le cadre du système de slots et de signaux de Qt, mais aussi comme une fonction basique du C++.
L'avancement de la tâche doit être compris entre les bornes inférieure (minimum) et supérieure (maximum). Elle est typiquement initialisée à zéro et incrémentée lorsqu'une tâche est effectuée, de manière à atteindre le maximum (le nombre de tâches) lorsque toutes les tâches sont accomplies. Par exemple, si vous avez 15 tâches à effectuer, vous mettrez le maximum à 15, et chaque tâche incrémentera la valeur de la barre de progression.
Un exemple pour le téléchargement d'un fichier :
QNetworkAccessManager
*
manager =
new
QNetworkAccessManager
;
QNetworkReply
*
reply =
manager->
get(QNetworkRequest
(QUrl
("http://jcourtois.fr/uploads/cv/CV_Jonathan_Courtois_fr.pdf"
)));
QProgressDialog
*
progress =
new
QProgressDialog
("Téléchargement..."
, "Annuler"
, 0
, 0
, parent);
connect
(reply, SIGNAL
(downloadProgress(qint64
, qint64
)), this
, SLOT
(requestDownloadProgress(qint64
, qint64
)));
connect
(reply, SIGNAL
(finished()), this
, SLOT
(requestFinished()));
connect
(progress, SIGNAL
(canceled()), this
, SLOT
(requestCanceled()));
// Les slots de réception
void
requestDownloadProgress(qint64
bytesReceived, qint64
bytesTotal)
{
if
(progress->
maximum() ==
0
)
progress->
setMaximum(bytesTotal);
progress->
setValue(bytesReceived);
}
void
requestFinished()
{
progress->
setValue(progress->
maximum());
}
void
requestCanceled()
{
reply->
abort();
}