Sur cette page

Recherche de texte

Chargement dynamique de fichiers .ui à l'aide de QUiLoader.

L'exemple TextFinder montre comment charger et configurer un fichier .ui de manière dynamique à l'aide de la classe QUiLoader qui fait partie de la bibliothèque Qt UI Tools de la bibliothèque.

Le programme permet à l'utilisateur de rechercher un mot particulier dans le contenu d'un texte. Les éléments visuels et la présentation de l'interface utilisateur sont chargés au moment de l'exécution, à partir des ressources du programme.

Bouton de recherche et saisie de TextFinderTextFinder Résultats surlignés

Configuration du fichier de ressources

Les ressources requises pour l'exemple sont les suivantes

  • textfinder.ui - le fichier d'interface utilisateur créé en Qt Widgets Designer
  • input.txt - un fichier texte contenant du texte à afficher dans une fenêtre de l'interface utilisateur. QTextEdit

textfinder.ui contient tous les objets QWidget nécessaires à l'explorateur de texte. Un objet QLineEdit est utilisé pour la saisie de l'utilisateur, un objet QTextEdit est utilisé pour afficher le contenu de input.txt, un objet QLabel est utilisé pour afficher le texte "Mot-clé" et un objet QPushButton est utilisé pour le bouton Find. Notez que tous les widgets sont dotés de objectName sensibles. Ils sont utilisés dans le code pour les identifier.

La capture d'écran ci-dessous montre l'aperçu obtenu dans Qt Widgets Designer.

Capture d'écran de l'interface utilisateur de TestFinder

Dans cet exemple, nous stockons les deux ressources dans l'exécutable de l'application en incluant le fichier textfinder.qrc. Les fichiers peuvent également être chargés au moment de l'exécution à partir du système de fichiers ou d'un fichier de ressources binaires externe .rcc. Pour plus d'informations sur les fichiers de ressources, voir 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 au moment de l'exécution, l'exemple est lié à la bibliothèque Qt UI Tools. Cette opération est effectuée dans le fichier textfinder.pro:

QT += widgets uitools

HEADERS = textfinder.h
SOURCES = textfinder.cpp main.cpp
RESOURCES = textfinder.qrc

Dé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 à partir du 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é selon la convention de nommage Automatic Connection requise par uic.

Chargement des ressources

Nous utilisons QFile pour charger les données des ressources du programme au moment de l'exécution. Le code correspondant se trouve dans deux méthodes situées au-dessus de textfinder.cpp: loadUiFile et loadTextFile.

La fonction loadUiFile charge le fichier d'interface utilisateur créé précédemment dans le fichier Qt Widgets Designer. Tout d'abord, le fichier textfinder.ui est localisé et ouvert à partir du système de ressources. Ensuite, une instance QUiLoader est créée et la fonction QUiLoader::load() est appelée, avec comme premier argument le fichier ouvert et comme second argument le pointeur du widget qui doit être défini comme parent. L'instance QWidget créée est renvoyée.

statique 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) ; }

Dans le même ordre d'idées, la fonction loadTextFile localise et ouvre input.txt à partir des ressources. Elle renvoie ensuite le contenu du fichier à l'aide de la fonction QTextStream::readAll().

statique QString loadTextFile() { QFile inputFile(u":/forms/input.txt"_s) ; if (!inputFile.open(QIODevice::ReadOnly))        qFatal("Cannot open resource file");

   retour QTextStream(&inputFile).readAll() ; }

Mise en œuvre de la classe TextFinder

Le constructeur de la classe TextFinder n'instancie pas directement les widgets enfants. Au lieu de cela, il appelle la fonction loadUiFile(), puis utilise QObject::findChild() pour localiser les QWidgetcréés par 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 permettre l'appel automatique de l'emplacement on_findButton_clicked().

    QMetaObject::connectSlotsByName(this);

La fonction loadTextFile est appelée pour obtenir le texte à afficher dans l'emplacement QTextEdit.

    ui_textEdit->setText(loadTextFile());

L'interface utilisateur chargée dynamiquement dans formWidget est maintenant correctement configurée. Nous intégrons maintenant formWidget par l'intermédiaire de QVBoxLayout.

    auto *layout = new QVBoxLayout(this);
    layout->addWidget(formWidget);

À la fin du constructeur, nous définissons un titre de fenêtre.

    setWindowTitle(tr("Text Finder"));
}

La fonction on_findButton_clicked() est un slot connecté au signal clicked() de ui_findButton. Le searchString est extrait du ui_lineEdit et le document est extrait du ui_textEdit. S'il existe un searchString vide, un QMessageBox est utilisé, demandant à l'utilisateur d'entrer un mot. Sinon, nous parcourons les mots de ui_textEdit et mettons en évidence toutes les occurrences de searchString. Deux objets QTextCursor sont utilisés : L'un pour parcourir les mots dans line et l'autre pour garder la trace des 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 est utilisé pour indiquer si le site searchString a été trouvé dans le contenu du site ui_textEdit. S'il n'a pas été trouvé, un QMessageBox est utilisé pour 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 plusieurs approches pour inclure des formulaires dans les applications. L'utilisation de QUiLoader n'est que l'une d'entre elles. Voir Utilisation d'un fichier Designer UI dans votre application pour plus d'informations sur les autres approches disponibles.

Exemple de projet @ code.qt.io

Voir aussi 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.