Recherche de texte
Chargement dynamique de fichiers .ui à l'aide de QUiLoader.
L'exemple TextFinder montre comment charger et configurer dynamiquement un fichier .ui à l'aide de la classe QUiLoader, qui fait partie de la Qt UI Tools bibliothèque.
Le programme permet à l'utilisateur de rechercher un mot particulier dans le contenu d'un texte. Les éléments visuels et la mise en page de l'interface utilisateur sont chargés lors de l'exécution, à partir des ressources du programme.
![]() | ![]() |
Configuration du fichier de ressources
Les ressources nécessaires à cet exemple sont les suivantes :
textfinder.ui- le fichier d’interface utilisateur créé dans Qt Widgets Designerinput.txt- un fichier texte contenant du texte à afficher dans un QTextEdit
textfinder.ui contient tous les objets « QWidget » nécessaires au « Text Finder ». Un « QLineEdit » est utilisé pour la saisie utilisateur, un « QTextEdit » sert à afficher le contenu de input.txt, un « QLabel » affiche le texte « Keyword », et un « QPushButton » est utilisé pour le bouton « Find ». Notez que tous les widgets se sont vu attribuer des identifiants « objectName » pertinents. Ceux-ci sont utilisés dans le code pour les identifier.
La capture d’écran ci-dessous montre l’aperçu obtenu dans le Concepteur d’Qt Widgets .

Dans cet exemple, nous stockons les deux ressources dans l’exécutable de l’application en incluant le fichier ` textfinder.qrc `. Il est également possible de charger ces fichiers à l’exécution à partir du système de fichiers ou d’un fichier binaire externe de gestion des ressources ( .rcc ). Pour plus d’informations sur les fichiers de ressources, consultez la section « Le système de ressources Qt ».
Le fichier textfinder.qrc répertorie tous les fichiers qui doivent être inclus en tant que ressources :
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>forms/textfinder.ui</file>
<file>forms/input.txt</file>
</qresource>
</RCC>Pour générer un formulaire à l’exécution, l’exemple est lié à la bibliothèque Qt UI Tools. Cette opération s’effectue dans le fichier ` textfinder.pro ` :
QT += widgets uitools
HEADERS = textfinder.h
SOURCES = textfinder.cpp main.cpp
RESOURCES = textfinder.qrcDéfinition de la classe TextFinder
La classe ` TextFinder ` contient l'interface utilisateur principale. Elle déclare des pointeurs vers les éléments ` QPushButton`, ` QTextEdit ` et ` QLineEdit ` décrits ci-dessus. L'élément ` QLabel ` de l'interface utilisateur n'est pas déclaré ici, car nous n'avons pas besoin d'y accéder depuis le code.
class TextFinder : public QWidget
{
Q_OBJECT
public:
explicit TextFinder(QWidget *parent = nullptr);
private slots:
void on_findButton_clicked();
private:
QPushButton *ui_findButton;
QTextEdit *ui_textEdit;
QLineEdit *ui_lineEdit;
};Le slot on_findButton_clicked() est un slot nommé conformément à la convention de nommage « Automatic Connection » requise par uic.
Chargement des ressources
Nous utilisons QFile pour charger les données à partir des ressources du programme lors de l'exécution. Le code correspondant se trouve dans deux méthodes situées au début du fichier textfinder.cpp: loadUiFile et loadTextFile.
La fonction loadUiFile charge le fichier d’interface utilisateur précédemment créé dans Qt Widgets Designer. Tout d’abord, le fichier textfinder.ui est localisé et ouvert à partir du système de ressources. Ensuite, une instance de QUiLoader est créée, et la fonction QUiLoader::load() est appelée, le premier argument étant le fichier ouvert et le second argument le pointeur du widget qui doit être défini comme parent. L’ QWidget ainsi créé est renvoyé.
static QWidget*loadUiFile(QWidget*parent)
{
QFile file(u":/forms/textfinder.ui"_s);
if (!file.open(QIODevice::ReadOnly))
qFatal("Cannot open resource file");
retour QUiLoader().load(&file, parent);
}De la même manière, la fonction loadTextFile localise et ouvre le fichier input.txt à partir des ressources. Elle renvoie ensuite le contenu du fichier à l'aide de la fonction QTextStream::readAll().
static QString loadTextFile()
{
QFile inputFile(u":/forms/input.txt"_s);
if (!inputFile.open(QIODevice::ReadOnly))
qFatal("Cannot open resource file");
return QTextStream(&inputFile).readAll();
}Implémentation de la classe TextFinder
Le constructeur de la classe TextFinder n’instancie directement aucun widget enfant. Il appelle plutôt la fonction loadUiFile(), puis utilise QObject::findChild() pour localiser les objets QWidgetcréés à l’aide de leur nom d’objet.
TextFinder::TextFinder(QWidget *parent)
: QWidget(parent)
{
QWidget *formWidget = loadUiFile(this);
ui_findButton = findChild<QPushButton*>("findButton");
ui_textEdit = findChild<QTextEdit*>("textEdit");
ui_lineEdit = findChild<QLineEdit*>("lineEdit");Nous utilisons ensuite ` QMetaObject::connectSlotsByName()` pour activer l’appel automatique du slot ` on_findButton_clicked() `.
QMetaObject::connectSlotsByName(this);La fonction loadTextFile est appelée pour récupérer le texte à afficher dans l’ QTextEdit.
ui_textEdit->setText(loadTextFile());L'interface utilisateur chargée dynamiquement dans ` formWidget ` est désormais correctement configurée. Nous intégrons désormais ` formWidget ` via un ` QVBoxLayout`.
auto *layout = new QVBoxLayout(this);
layout->addWidget(formWidget);À la fin du constructeur, nous définissons le titre de la fenêtre.
setWindowTitle(tr("Text Finder"));
}La fonction « on_findButton_clicked() » est un slot relié au signal « clicked() » de « ui_findButton ». L’« searchString » est extrait de « ui_lineEdit » et l’« document » est extrait de « ui_textEdit ». Si « searchString » est vide, un « QMessageBox » est utilisé pour demander à l’utilisateur de saisir un mot. Sinon, nous parcourons les mots de ui_textEdit et mettons en surbrillance toutes les occurrences de searchString. Deux objets QTextCursor sont utilisés : l’un pour parcourir les mots de line et l’autre pour suivre les blocs d’édition.
void TextFinder::on_findButton_clicked()
{
QString searchString = ui_lineEdit->text();
QTextDocument *document = ui_textEdit->document();
bool found = false;
// undo previous change (if any)
document->undo();
if (searchString.isEmpty()) {
QMessageBox::information(this, tr("Empty Search Field"),
tr("The search field is empty. "
"Please enter a word and click Find."));
} else {
QTextCursor highlightCursor(document);
QTextCursor cursor(document);
cursor.beginEditBlock();
QTextCharFormat plainFormat(highlightCursor.charFormat());
QTextCharFormat colorFormat = plainFormat;
colorFormat.setForeground(Qt::red);
while (!highlightCursor.isNull() && !highlightCursor.atEnd()) {
highlightCursor = document->find(searchString, highlightCursor,
QTextDocument::FindWholeWords);
if (!highlightCursor.isNull()) {
found = true;
highlightCursor.movePosition(QTextCursor::WordRight,
QTextCursor::KeepAnchor);
highlightCursor.mergeCharFormat(colorFormat);
}
}
cursor.endEditBlock();Le drapeau « found » sert à indiquer si le mot « searchString » a été trouvé dans le contenu de ui_textEdit. S’il n’a pas été trouvé, un message d’erreur « QMessageBox » est affiché pour en informer l’utilisateur.
if (found == false) {
QMessageBox::information(this, tr("Word Not Found"),
tr("Sorry, the word cannot be found."));
}
}
}main() Fonction
La fonction main() instancie et affiche TextFinder.
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
TextFinder textFinder;
textFinder.show();
return app.exec();
}Il existe différentes méthodes pour intégrer des formulaires dans des applications. L’utilisation de ` QUiLoader ` n’est qu’une d’entre elles. Reportez-vous à la section Utilisation d’un fichier d’interface utilisateur du concepteur de formulaires Qt Widgets dans votre application pour plus d’informations sur les autres méthodes disponibles.
Voir également Calculator Builder.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.

