Auf dieser Seite

Textsuche

Dynamisches Laden von .ui-Dateien mithilfe von QUiLoader.

Das Beispiel „TextFinder“ zeigt, wie man eine „ .ui “-Datei mithilfe der Klasse „ QUiLoader “, die Teil der Qt UI Tools Bibliothek ist.

Das Programm ermöglicht es dem Benutzer, innerhalb eines Textes nach einem bestimmten Wort zu suchen. Die visuellen Elemente und das Layout der Benutzeroberfläche werden zur Laufzeit aus den Programmressourcen geladen.

TextFinder-Suchschaltfläche und EingabefeldTextFinder – Hervorgehobene Ergebnisse

Einrichten der Ressourcendatei

Die für das Beispiel erforderlichen Ressourcen sind:

textfinder.ui enthält alle erforderlichen „ QWidget “-Objekte für den Text Finder. Ein „ QLineEdit “ wird für die Benutzereingabe verwendet, ein „ QTextEdit “ dient zur Anzeige des Inhalts von „ input.txt “, ein „ QLabel “ wird zur Anzeige des Textes „Keyword“ verwendet und ein „ QPushButton “ dient für die Schaltfläche „ Find “. Beachten Sie, dass allen Widgets aussagekräftige „ objectName “ zugewiesen sind. Diese werden im Code zur Identifizierung der Widgets verwendet.

Der folgende Screenshot zeigt die Vorschau, die im „Qt Widgets Designer“ angezeigt wird.

Screenshot der TestFinder-Benutzeroberfläche

In diesem Beispiel speichern wir beide Ressourcen in der ausführbaren Datei der Anwendung, indem wir die Datei „ textfinder.qrc “ einbinden. Alternativ könnten die Dateien auch zur Laufzeit aus dem Dateisystem oder aus einer externen Binärressource („ .rcc “) geladen werden. Weitere Informationen zu Ressourcendateien finden Sie unter „Das Qt-Ressourcensystem“.

Die Datei „ textfinder.qrc “ listet alle Dateien auf, die als Ressource eingebunden werden sollen:

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>forms/textfinder.ui</file>
    <file>forms/input.txt</file>
</qresource>
</RCC>

Um ein Formular zur Laufzeit zu generieren, wird das Beispiel mit der Qt UI Tools -Bibliothek verknüpft. Dies erfolgt in der Datei „ textfinder.pro “:

QT += widgets uitools

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

Definition der Klasse „TextFinder“

Die Klasse „ TextFinder “ enthält die Hauptbenutzeroberfläche. Sie deklariert Zeiger auf die oben beschriebenen Elemente „ QPushButton “, „ QTextEdit “ und „ QLineEdit “. Das Element „ QLabel “ in der Benutzeroberfläche wird hier nicht deklariert, da wir im Code nicht darauf zugreifen müssen.

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

Der Slot „ on_findButton_clicked() “ ist ein Slot, dessen Name der von „ uic “ geforderten Namenskonvention für automatische Verbindungen entspricht.

Laden der Ressourcen

Wir verwenden „ QFile “, um die Daten zur Laufzeit aus den Programmressourcen zu laden. Der Code hierfür befindet sich in zwei Methoden oben in der Datei „ textfinder.cpp “: „ loadUiFile “ und „ loadTextFile “.

Die Funktion ` loadUiFile ` lädt die zuvor im „Qt Widgets Designer“ erstellte Benutzeroberflächendatei. Zunächst wird die Datei ` textfinder.ui ` im Ressourcensystem gesucht und geöffnet. Anschließend wird eine Instanz von ` QUiLoader ` erstellt und die Funktion ` QUiLoader::load()` aufgerufen, wobei das erste Argument die geöffnete Datei und das zweite Argument der Zeiger auf das Widget ist, das als übergeordnetes Element festgelegt werden soll. Das erstellte ` QWidget ` wird zurückgegeben.

static QWidget*loadUiFile(QWidget*parent)
{
    QFile file(u":/forms/textfinder.ui"_s);
    if (!file.open(QIODevice::ReadOnly))
        qFatal("Cannot open resource file");

   return QUiLoader().load(&file, parent);
}

In ähnlicher Weise sucht die Funktion „ loadTextFile “ die Datei „ input.txt “ aus den Ressourcen und öffnet sie. Anschließend gibt sie den Inhalt der Datei mithilfe der Funktion „ QTextStream::readAll()“ zurück.

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

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

Implementierung der Klasse „TextFinder“

Der Konstruktor der Klasse „ TextFinder “ instanziiert keine untergeordneten Widgets direkt. Stattdessen ruft er die Funktion „ loadUiFile() “ auf und ermittelt anschließend mithilfe von „ QObject::findChild()“ die erstellten „ QWidgets“ anhand ihres Objektnamens.

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");

Anschließend verwenden wir ` QMetaObject::connectSlotsByName()`, um den automatischen Aufruf des Slots ` on_findButton_clicked() ` zu ermöglichen.

    QMetaObject::connectSlotsByName(this);

Die Funktion ` loadTextFile ` wird aufgerufen, um den Text abzurufen, der im ` QTextEdit` angezeigt werden soll.

    ui_textEdit->setText(loadTextFile());

Die dynamisch geladene Benutzeroberfläche unter formWidget ist nun korrekt eingerichtet. Wir binden nun formWidget über einen QVBoxLayout ein.

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

Am Ende des Konstruktors legen wir einen Fenstertitel fest.

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

Die Funktion „ on_findButton_clicked() “ ist ein Slot, der mit dem Signal „ clicked() “ von „ ui_findButton “ verbunden ist. Die „ searchString “ wird aus „ ui_lineEdit “ extrahiert und die „ document “ aus „ ui_textEdit “. Ist „ searchString “ leer, wird ein „ QMessageBox “ verwendet, der den Benutzer zur Eingabe eines Wortes auffordert. Andernfalls durchlaufen wir die Wörter in ui_textEdit und markieren alle Vorkommen von searchString. Dabei werden zwei QTextCursor-Objekte verwendet: eines zum Durchlaufen der Wörter in line und ein weiteres zum Verfolgen der Bearbeitungsblöcke.

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();

Das Flag „ found “ gibt an, ob das „ searchString “ im Inhalt von „ ui_textEdit “ gefunden wurde. Wurde es nicht gefunden, wird ein „ QMessageBox “ verwendet, um den Benutzer darüber zu informieren.

        if (found == false) {
            QMessageBox::information(this, tr("Word Not Found"),
                                     tr("Sorry, the word cannot be found."));
        }
    }
}

main() Funktion

Die Funktion „ main() “ instanziiert und zeigt „ TextFinder “ an.

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    TextFinder textFinder;
    textFinder.show();

    return app.exec();
}

Es gibt verschiedene Ansätze, um Formulare in Anwendungen einzubinden. Die Verwendung von „ QUiLoader “ ist nur einer davon. Weitere Informationen zu den anderen verfügbaren Ansätzen finden Sie unter „Verwenden einer Qt Widgets -Designer-UI-Datei in Ihrer Anwendung “.

Beispielprojekt @ code.qt.io

Siehe auch „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.