En esta página

Buscador de textos

Carga dinámica de archivos .ui mediante QUiLoader.

El ejemplo TextFinder muestra cómo cargar y configurar un archivo .ui de forma dinámica utilizando la clase QUiLoader que forma parte de la biblioteca Qt UI Tools biblioteca.

El programa permite al usuario buscar una palabra determinada dentro del contenido de un texto. Los elementos visuales y el diseño de la interfaz de usuario se cargan en tiempo de ejecución, a partir de los recursos del programa.

Botón de búsqueda y entrada de TextFinderTextFinder Resultados destacados

Configuración del archivo de recursos

Los recursos necesarios para el ejemplo son:

  • textfinder.ui - el archivo de interfaz de usuario creado en Qt Widgets Designer
  • input.txt - un archivo de texto que contenga el texto que se mostrará en un QTextEdit

textfinder.ui contiene todos los objetos QWidget necesarios para el buscador de texto. Un QLineEdit se utiliza para la entrada del usuario, un QTextEdit se utiliza para mostrar el contenido de input.txt, un QLabel se utiliza para mostrar el texto "Keyword", y un QPushButton se utiliza para el botón Find. Tenga en cuenta que todos los widgets tienen asignados sensibles objectName's. Éstos se utilizan en el código para identificarlos.

La siguiente captura de pantalla muestra la vista previa obtenida en Qt Widgets Designer.

Captura de pantalla de la interfaz de usuario de TestFinder

En este ejemplo, almacenamos ambos recursos en el ejecutable de la aplicación incluyendo el archivo textfinder.qrc. Alternativamente, los archivos también podrían cargarse en tiempo de ejecución desde el sistema de archivos, o desde un archivo binario externo de recursos .rcc. Para más información sobre archivos de recursos, ver El Sistema de Recursos Qt.

El archivo textfinder.qrc enumera todos los archivos que deben incluirse como recurso:

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

Para generar un formulario en tiempo de ejecución, el ejemplo se enlaza con la librería Qt UI Tools. Esto se hace en el archivo textfinder.pro:

QT += widgets uitools

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

Definición de la clase TextFinder

La clase TextFinder contiene la interfaz de usuario principal. Declara punteros a los elementos QPushButton, QTextEdit y QLineEdit descritos anteriormente. El QLabel de la interfaz de usuario no se declara aquí ya que no necesitamos acceder a él desde código.

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

La ranura on_findButton_clicked() es una ranura nombrada de acuerdo con la convención de nomenclatura de conexión automática requerida por uic.

Carga de los recursos

Utilizamos QFile para cargar los datos de los recursos del programa en tiempo de ejecución. El código para esto se encuentra en dos métodos encima de textfinder.cpp: loadUiFile y loadTextFile.

La función loadUiFile carga el archivo de interfaz de usuario creado previamente en Qt Widgets Designer. En primer lugar, se localiza el archivo textfinder.ui y se abre desde el sistema de recursos. A continuación, se crea una instancia de QUiLoader y se llama a la función QUiLoader::load(), siendo el primer argumento el archivo abierto y el segundo el puntero del widget que debe establecerse como padre. Se devuelve el QWidget creado.

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

   devolver QUiLoader().load(&archivo, padre); }

De forma similar, la función loadTextFile localiza y abre input.txt desde los recursos. A continuación, devuelve el contenido del archivo mediante la función QTextStream::readAll().

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

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

Implementación de la clase TextFinder

El constructor de la clase TextFinder no instancia ningún widget hijo directamente. En su lugar, llama a la función loadUiFile(), y luego utiliza QObject::findChild() para localizar los QWidgets creados por nombre de objeto.

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

A continuación, utilizamos QMetaObject::connectSlotsByName() para activar la llamada automática de la ranura on_findButton_clicked().

    QMetaObject::connectSlotsByName(this);

Se llama a la función loadTextFile para obtener el texto que se mostrará en QTextEdit.

    ui_textEdit->setText(loadTextFile());

La interfaz de usuario cargada dinámicamente en formWidget está ahora correctamente configurada. Ahora incrustamos formWidget a través de un QVBoxLayout.

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

Al final del constructor establecemos un título de ventana.

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

La función on_findButton_clicked() es una ranura que se conecta a la señal ui_findButton's clicked(). El searchString se extrae del ui_lineEdit y el document se extrae del ui_textEdit. Si hay un searchString vacío, se utiliza un QMessageBox, solicitando al usuario que introduzca una palabra. En caso contrario, se recorren las palabras de ui_textEdit y se resaltan todas las ocurrencias de searchString. Se utilizan dos objetos QTextCursor: Uno para recorrer las palabras de line y otro para seguir los bloques de edición.

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

La bandera found se utiliza para indicar si el searchString se encontró dentro del contenido de ui_textEdit. Si no se encontró, se utiliza un QMessageBox para informar al usuario.

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

main() Función

La función main() instancia y muestra TextFinder.

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

    TextFinder textFinder;
    textFinder.show();

    return app.exec();
}

Existen varios enfoques para incluir formularios en las aplicaciones. El uso de QUiLoader es sólo uno de ellos. Consulte Uso de un archivo Designer UI en su aplicación para obtener más información sobre los otros enfoques disponibles.

Proyecto de ejemplo @ code.qt.io

Ver también 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.