テキストファインダー

QUiLoader を使って .ui ファイルを動的にロードする。

TextFinderの例では、ライブラリの一部であるQUiLoader クラスを使用して、.ui ファイルを動的にロードしてセットアップする方法を示しています。 Qt UI Toolsライブラリの一部です。

このプログラムでは、ユーザーがテキストの内容から特定の単語を検索することができます。ユーザー・インターフェースの視覚的要素とレイアウトは、プログラム・リソースから実行時にロードされます。

リソース・ファイルのセットアップ

この例で必要なリソースは以下のとおりである:

  • textfinder.ui -Qt Widgets Designerで作成されたユーザーインターフェイスファイル。
  • input.txt - に表示されるテキストを含むテキストファイル。QTextEdit

textfinder.ui テキスト・ファインダーに必要なすべての オブジェクトが含まれています。 はユーザー入力に使われ、 は の内容を表示するのに使われ、 は「キーワード」というテキストを表示するのに使われ、 は ボタンに使われます。すべてのウィジェットには、 'が割り当てられています。これらはコード内でウィジェットを識別するために使用されます。QWidget QLineEdit QTextEdit input.txt QLabel QPushButton Find objectName

下のスクリーンショットは、Qt Widgets Designerで得られたプレビューです。

この例では、textfinder.qrc ファイルをインクルードすることで、両方のリソースをアプリケーションの実行ファイルに格納します。あるいは、ファイルはファイルシステムから、または外部のバイナリリソース.rcc ファイルから実行時にロードすることもできます。リソースファイルの詳細については、Qt Resource Systemを参照してください。

textfinder.qrc ファイルには、リソースとして含めるべきすべてのファイルがリストされています:

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

実行時にフォームを生成するために、サンプルはQt UI Toolsライブラリにリンクされます。これはtextfinder.pro ファイルで行われます:

QT += widgets uitools

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

TextFinder クラス定義

TextFinder クラスはメイン・ユーザー・インターフェースを含んでいます。QPushButtonQTextEditQLineEdit の各要素へのポインタを宣言しています。ユーザー・インターフェースのQLabel は、コードからアクセスする必要がないので、ここでは宣言しません。

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

スロットon_findButton_clicked() は、uic で要求されるAutomatic Connection の命名規則に従って命名されたスロットです。

リソースのロード

QFile 、実行時にプログラム・リソースからデータをロードします。このためのコードは、textfinder.cpp の上にある2つのメソッドloadUiFileloadTextFile にあります。

loadUiFile 関数は、Qt Widgets Designer で事前に作成したユーザー・インターフェース・ファイルをロードします。まず、textfinder.ui ファイルの内容がリソース・システムからロードされます。次に、QUiLoader インスタンスが作成され、QUiLoader::load ()関数が呼び出されます。第1引数にはオープンされているファイル、第2引数には親として設定されるウィジェットのポインタが指定されます。作成されたQWidget が返される。

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

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

同様に、loadTextFile 関数はinput.txt をリソースからロードする。データはQTextStream を使ってQTextStream::readAll() 関数でQString に読み込まれる。QTextStream 、デフォルトでは現在のシステムロケールを使用するため、明示的にエンコーディングをUTF-8に設定する。最後に、読み込まれたテキストが返されます。

static QString loadTextFile()
{
    QFile inputFile(u":/forms/input.txt"_s);
    inputFile.open(QIODevice::ReadOnly);
    QTextStream in(&inputFile);
    return in.readAll();
}

TextFinder クラスの実装

TextFinder クラスのコンストラクタは、子ウィジェットを直接インスタンス化しません。代わりにloadUiFile() 関数を呼び出し、QObject::findChild() を使って、作成されたQWidgetをオブジェクト名で探します。

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

次に、QMetaObject::connectSlotsByName() を使用して、on_findButton_clicked() スロットを自動的に呼び出せるようにします。

    QMetaObject::connectSlotsByName(this);

loadTextFile 関数を呼び出して、QTextEdit に表示するテキストを取得します。

    ui_textEdit->setText(loadTextFile());

これで、formWidget の動的にロードされるユーザーインターフェイスが適切にセットアップされました。次に、QVBoxLayout を通してformWidget を埋め込みます。

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

コンストラクタの最後に、ウィンドウのタイトルを設定します。

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

on_findButton_clicked() 関数はui_findButtonclicked() シグナルに接続されるスロットです。searchStringui_lineEdit から抽出され、documentui_textEdit から抽出される。空のsearchString があれば、QMessageBox が使用され、ユーザーに単語の入力を要求する。そうでない場合は、ui_textEdit の単語を走査し、searchString のすべての出現箇所を強調表示します。2 つの QTextCursor オブジェクトが使用されます:1つはline の単語を走査するため、もう1つは編集ブロックを追跡するためです。

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

searchStringui_textEdit のコンテンツ内で見つかったかどうかを示すために、found フラグが使用されます。 見つからなかった場合は、QMessageBox が使用されてユーザーに通知されます。

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

main() 関数

main() 関数はTextFinder をインスタンス化して表示します。

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

    TextFinder textFinder;
    textFinder.show();

    return app.exec();
}

アプリケーションにフォームを含めるには様々なアプローチがあります。QUILoaderの使用はその1つに過ぎません。利用可能な他のアプローチの詳細については、「アプリケーションでデザイナーUIファイルを使用する」を参照してください。

サンプルプロジェクト @ code.qt.io

Calculator Builderも参照してください

© 2025 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.