Qt

【C++】Qt QLineEditの使い方:基本的な入力設定と利用例

C++でQtを使うとき、QLineEditは一行のテキスト入力に適したウィジェットです。

new QLineEdit(parentWidget)で作成し、setPlaceholderTextで入力ヒントを表示できます。

例えば、パスワード入力時はsetEchoModeで入力内容をマスクし、setValidatorで入力値の制限を行うなど、柔軟な操作が可能です。

QLineEditの基本機能

インスタンス生成と初期設定

親ウィジェットの指定とプロパティの初期設定

QLineEditは、ユーザーからの一行入力をシンプルに受け付けるウィジェットです。

最初に実際のアプリケーションで利用する場合、親ウィジェットを指定してインスタンスを生成する必要があります。

親ウィジェットを設定すると、ウィンドウの表示や動作の統一が容易になり、後でウィジェットの管理もしやすくなります。

たとえば、ウィジェットの位置やサイズなど基本プロパティの初期設定は、以下のサンプルコードのように実装できます。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    // 親ウィジェットの作成
    QWidget window;
    window.setWindowTitle("QLineEdit初期設定サンプル");
    window.resize(300, 150);
    // QLineEditのインスタンス生成
    QLineEdit *lineEdit = new QLineEdit(&window);
    // プレースホルダーテキストを設定
    lineEdit->setPlaceholderText("ここにテキストを入力してください");
    // ウィジェットの位置とサイズの設定
    lineEdit->move(50, 50);
    lineEdit->resize(200, 30);
    window.show();
    return app.exec();
}
※アプリケーションウィンドウが表示され、中央部分にテキスト入力欄がある状態になります。

このコードでは、QLineEditwindow内に生成され、レイアウトの一部として配置されています。

プレースホルダーテキストにより、入力前に利用者へ入力のヒントを示すことができます。

プレースホルダーテキストの設定方法

プレースホルダーテキストは、ユーザーが入力を開始する前に入力可能な内容を想定させる文言や簡単な説明を表示するために利用されます。

setPlaceholderTextメソッドを呼び出すことで容易に設定ができます。

これによりユーザーは、どのような情報を入力すればよいかすぐに理解できるようになります。

たとえば、下記のコードスニペットはユーザー名の入力欄にヒントを表示する例です。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("プレースホルダーテキスト設定例");
    window.resize(300, 150);
    QLineEdit *userNameEdit = new QLineEdit(&window);
    // ユーザー名入力欄のプレースホルダーテキスト設定
    userNameEdit->setPlaceholderText("ユーザー名を入力してください...");
    userNameEdit->move(50, 50);
    userNameEdit->resize(200, 30);
    window.show();
    return app.exec();
}
※ウィンドウ上に「ユーザー名を入力してください...」と表示されたテキストフィールドが現れる。

このように、プレースホルダーテキストを設定することで、入力欄がどのようなデータを受け付けるのかを一目でわかりやすく提示でき、ユーザーの利便性が向上します。

入力内容の制限と検証

最大文字数の設定

setMaxLengthによる文字数制限の実装

setMaxLengthメソッドを使用すると、ユーザーが入力可能な文字数を簡単に制限できるため、想定外の長い入力を防ぐことができます。

入力文字数の制限は、登録番号、電話番号、識別子などの固定文字数が決まっている入力欄で特に有効です。

以下のサンプルコードでは、テキストの最大文字数を10に設定しています。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("最大文字数設定例");
    window.resize(300, 150);
    QLineEdit *lineEdit = new QLineEdit(&window);
    lineEdit->setPlaceholderText("最大10文字まで入力");
    // 入力可能な最大文字数を10文字に設定する
    lineEdit->setMaxLength(10);
    lineEdit->move(50, 50);
    lineEdit->resize(200, 30);
    window.show();
    return app.exec();
}
※テキストフィールドに10文字以上の入力ができなくなります。

この制限により、ユーザーの入力誤りの防止や、予め決められた入力形式に沿ったデータ管理がしやすくなります。

入力検証の設定

QIntValidatorを用いた数値入力の制限

数値のみを入力可能にする場合、QIntValidatorが役立ちます。

これを設定することで、入力フィールドに数値以外の文字が入力された際に自動で拒否する仕組みを実装できます。

コード例は以下の通りです。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
#include <QIntValidator>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("数値入力制限例");
    window.resize(300, 150);
    QLineEdit *numberEdit = new QLineEdit(&window);
    numberEdit->setPlaceholderText("数値のみ入力可");
    // QIntValidatorにより数値のみ入力できるように設定
    QIntValidator *intValidator = new QIntValidator(0, 1000, numberEdit);
    numberEdit->setValidator(intValidator);
    numberEdit->move(50, 50);
    numberEdit->resize(200, 30);
    window.show();
    return app.exec();
}
※テキストフィールドでは0から1000までの整数のみが入力可能になります。

この設定により、ユーザーが誤った形式で入力することを未然に防ぎ、データ整合性を保つことができます。

QRegularExpressionValidatorによるパターン検証

特定のパターンに基づいた入力の検証が必要な場合、QRegularExpressionValidatorが便利です。

正規表現を用いることで、メールアドレス、電話番号、特定フォーマットの文字列など、複雑なパターンの入力チェックが可能になります。

サンプルコードでは、アルファベット小文字のみが許可される例を示します。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
#include <QRegularExpression>
#include <QRegularExpressionValidator>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("正規表現による入力検証例");
    window.resize(300, 150);
    QLineEdit *regexEdit = new QLineEdit(&window);
    regexEdit->setPlaceholderText("小文字英字のみ入力(例:abc)");
    // 正規表現パターンを設定: 小文字の英字のみ
    QRegularExpression regex("^[a-z]+$");
    QRegularExpressionValidator *regexValidator = new QRegularExpressionValidator(regex, regexEdit);
    regexEdit->setValidator(regexValidator);
    regexEdit->move(50, 50);
    regexEdit->resize(200, 30);
    window.show();
    return app.exec();
}
※テキストフィールドでは、アルファベットの小文字のみの入力が可能になります。

正規表現を使うことで、細かい入力チェックが行え、データの整合性やフォーマットの統一に役立ちます。

テキスト表示と配置の調整

テキスト配置の調整

setAlignmentでの中央・左寄せ・右寄せの指定

QLineEditが持つテキストは、読みやすいように配置を調整することができます。

setAlignmentメソッドで中央、左寄せ、右寄せなどの配置を指定でき、ユーザーの視覚的な利便性を向上させます。

たとえば、テキストの中央寄せを以下のサンプルコードで設定できます。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
#include <Qt>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("テキスト配置調整例");
    window.resize(300, 150);
    QLineEdit *centerEdit = new QLineEdit(&window);
    centerEdit->setPlaceholderText("テキスト中央寄せ");
    // テキストを中央寄せに設定する
    centerEdit->setAlignment(Qt::AlignCenter);
    centerEdit->move(50, 50);
    centerEdit->resize(200, 30);
    window.show();
    return app.exec();
}
※ウィンドウ上のテキストフィールド内のテキストが中央に配置されます。

この機能により、画面デザインやユーザーインタフェースの整合性を保ちながら、入力内容の見やすさを向上できます。

エコーモードの利用

Passwordモードでの入力内容の隠蔽

パスワード入力やプライバシーに配慮する必要がある場合、setEchoModeメソッドを使用して入力されるテキストを隠蔽することが可能です。

Passwordモードを指定すると、入力された文字はマスク文字に変換され、画面上で内容が見えなくなります。

以下はその実装例です。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("パスワード入力例");
    window.resize(300, 150);
    QLineEdit *passwordEdit = new QLineEdit(&window);
    passwordEdit->setPlaceholderText("パスワードを入力");
    // Passwordモードを設定して入力内容を隠蔽する
    passwordEdit->setEchoMode(QLineEdit::Password);
    passwordEdit->move(50, 50);
    passwordEdit->resize(200, 30);
    window.show();
    return app.exec();
}
※テキストフィールドに入力された文字がマスク文字で表示され、実際の内容は隠蔽されます。

このエコーモードは、セキュリティに関する要件を満たすために必須の機能となる場合が多く、ユーザーの個人情報を守る手段として利用されます。

シグナルとスロットの連携

テキスト変更イベントの活用

textChangedシグナルによる動的処理

QLineEditは、テキストが変更されるたびにtextChangedシグナルを発信します。

このシグナルを利用すれば、入力内容に応じた動的な処理を実装でき、たとえばリアルタイムの入力検証やインタフェースの更新が可能になります。

以下のサンプルコードは、入力が変化するたびにその内容をコンソールに出力する例です。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
#include <QObject>
#include <QDebug>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("textChangedシグナル例");
    window.resize(300, 150);
    QLineEdit *liveEdit = new QLineEdit(&window);
    liveEdit->setPlaceholderText("入力するたびに変更内容を確認");
    liveEdit->move(50, 50);
    liveEdit->resize(200, 30);
    // textChangedシグナルとラムダ式を用いた連携
    QObject::connect(liveEdit, &QLineEdit::textChanged,
                     [&liveEdit](const QString &newText){
                         qDebug() << "現在の入力内容:" << newText;
                     });
    window.show();
    return app.exec();
}
※テキストフィールド内で入力が変更されると、コンソールに最新のテキスト内容が表示されます。

このシグナルを活用することで、ユーザーの入力に応じた即時フィードバックや後続処理に柔軟に対応できます。

editingFinishedシグナルでの入力完了時の処理

ユーザーが入力を完了した際、フォーカスが外れるとeditingFinishedシグナルが発信されます。

このシグナルを利用すれば、入力後のデータ検証や保存処理を実装できるため、ユーザーの操作が完了したことを確実に検知できます。

実装方法は以下の通りです。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
#include <QObject>
#include <QDebug>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("editingFinishedシグナル例");
    window.resize(300, 150);
    QLineEdit *finishEdit = new QLineEdit(&window);
    finishEdit->setPlaceholderText("入力完了後に処理が実行されます");
    finishEdit->move(50, 50);
    finishEdit->resize(200, 30);
    // editingFinishedシグナルと接続して入力完了時の処理を実装
    QObject::connect(finishEdit, &QLineEdit::editingFinished, [](){
        qDebug() << "入力が完了しました";
    });
    window.show();
    return app.exec();
}
※テキストフィールドからフォーカスが外れると、コンソールに「入力が完了しました」と表示されます。

このアプローチは、最終的な入力内容に対するアクション(例えばデータ保存や他ウィジェットの更新)を確実にトリガーするために有効な手段です。

キーボード操作との連動

ReturnPressedシグナルによるアクション連携

ユーザーがキーボードのEnterキーやReturnキーを押した際、returnPressedシグナルが発信されます。

このシグナルを利用すれば、ユーザーが入力内容を確定したときに特定のアクション(検索の実行や送信のトリガーなど)を行うことができます。

下記のサンプルコードは、その連携方法を示しています。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
#include <QObject>
#include <QDebug>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("ReturnPressedシグナル利用例");
    window.resize(300, 150);
    QLineEdit *actionEdit = new QLineEdit(&window);
    actionEdit->setPlaceholderText("Enterキーでアクション発動");
    actionEdit->move(50, 50);
    actionEdit->resize(200, 30);
    // returnPressedシグナルと連動して特定の処理を実行
    QObject::connect(actionEdit, &QLineEdit::returnPressed, [](){
        qDebug() << "Enterキーが押されました。アクション実行中...";
    });
    window.show();
    return app.exec();
}
※ユーザーがEnterキーを押すと、コンソールにアクション実行メッセージが表示されます。

このシグナル連携により、入力内容の最終確認や次の処理への自動切替が可能になり、ユーザー体験の向上につながります。

QLineEditのカスタマイズ

スタイルの変更

スタイルシートでの外観調整

Qtのスタイルシート(QSS)を使用すれば、QLineEditの外観を自由にカスタマイズすることができます。

背景色、文字色、ボーダーなどを変えることで、アプリケーションのデザインに合わせた統一感のある外観に調整できます。

以下は、QSSを利用して背景色と文字色を変更する例です。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("スタイルシートによるカスタマイズ例");
    window.resize(300, 150);
    QLineEdit *styleEdit = new QLineEdit(&window);
    styleEdit->setPlaceholderText("カスタムスタイル適用中");
    styleEdit->move(50, 50);
    styleEdit->resize(200, 30);
    // スタイルシートを用いた外観調整
    styleEdit->setStyleSheet("QLineEdit {"
                             "background-color: #F0F8FF;"  // 薄い青色の背景
                             "color: #333333;"            // ダークグレーの文字色
                             "border: 2px solid #87CEEB;"  // 空色の枠線"
                             "border-radius: 5px;"         // 少し丸みを帯びた角"
                             "}");
    window.show();
    return app.exec();
}
※QLineEditが薄い青背景にダークグレーの文字、空色の枠線でカスタマイズされた状態で表示されます。

この方法を利用することで、アプリケーション全体のデザインテーマに合わせた直感的な調整が可能になります。

背景色と枠線のカスタマイズ

スタイルシートをさらに活用し、フォーカスが当たっていない状態とフォーカスが当たった状態での外観を分けることができます。

たとえば、通常時は穏やかな色合いにし、フォーカス時には枠線の色を強調することで、ユーザーがどのフィールドに入力しているかを視覚的に認識しやすくなります。

以下はその一例です。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("フォーカス時のスタイル変更例");
    window.resize(300, 150);
    QLineEdit *focusEdit = new QLineEdit(&window);
    focusEdit->setPlaceholderText("フォーカスでスタイルが変わります");
    focusEdit->move(50, 50);
    focusEdit->resize(200, 30);
    // スタイルシートで通常時とフォーカス時の外観を設定
    focusEdit->setStyleSheet("QLineEdit {"
                             "background-color: #FFFACD;"  // レモンシフォンの背景
                             "border: 1px solid #CCCCCC;"
                             "border-radius: 3px;"
                             "}"
                             "QLineEdit:focus {"
                             "border: 2px solid #FF8C00;"    // フォーカス時にオレンジ色の枠線"
                             "background-color: #FFF5EE;"     // シーシェルの背景"
                             "}");
    window.show();
    return app.exec();
}
※テキストフィールドが通常時とフォーカス時で異なるスタイルに変化する様子が確認できます。

このような視覚的な調整は、ユーザーが入力中のフィールドを直感的に把握する手助けとなります。

フォーカス時のスタイル変更

ユーザーが特定のフィールドに集中している際、他のウィジェットとの差別化が求められる場合は、フォーカス時のスタイル変更が非常に有効です。

前述の例と同様に、QSSを使って、フォーカス時に文字の色や背景色、枠線のスタイルを変更することで、入力フィールドが選択されていることを視覚的に示すことができます。

独自イベント処理の実装

イベントフィルターを利用した拡張方法

QLineEditに特殊な動作を加える場合、イベントフィルターを利用して独自の処理を実装することが可能です。

たとえば、特定のキー入力やマウスイベントをキャッチして、入力欄の背景色を瞬時に変えるなどの応用ができます。

以下のサンプルコードは、イベントフィルターを利用してEnterキーが押されたときに背景色を変更する例です。

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
#include <QKeyEvent>
#include <QDebug>
class CustomLineEdit : public QLineEdit {
public:
    CustomLineEdit(QWidget *parent = nullptr) : QLineEdit(parent) {}
protected:
    bool event(QEvent *e) override {
        // キーボードイベントのキャッチ
        if(e->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = static_cast<QKeyEvent*>(e);
            if(keyEvent->key() == Qt::Key_Return) {
                // Enterキーが押された場合の処理
                this->setStyleSheet("background-color: #E6E6FA;");  // 薄い紫色背景に変更
                qDebug() << "Enterキーが押され、背景色を変更しました。";
                return true;
            }
        }
        return QLineEdit::event(e);
    }
};
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("イベントフィルター利用例");
    window.resize(300, 150);
    CustomLineEdit *customEdit = new CustomLineEdit(&window);
    customEdit->setPlaceholderText("Enterキーで背景色が変わります");
    customEdit->move(50, 50);
    customEdit->resize(200, 30);
    window.show();
    return app.exec();
}
※Enterキーを押すと、テキストフィールドの背景色が薄い紫に変化します。コンソールにもメッセージが表示されます。

この実装方法は、通常のシグナル&スロットではカバーしきれない細かなインタラクションを制御する際に非常に有用です。

QLineEditの応用例

ユーザインターフェースでの活用事例

認証フォームにおけるパスワード欄としての利用

認証フォームを作成する際、パスワード入力用のQLineEditは、入力内容を隠すために必ずPasswordエコーモードを利用します。

これにより、ユーザーのパスワードが他人に覗かれないよう配慮がなされ、セキュリティ面で安心感を与えます。

実装は、前述のエコーモードの利用例に準じた形で導入できます。

検索バーとしての実装例

検索バーとして利用する場合、ユーザーが入力した文字列に応じてリアルタイムな候補表示やフィルタリングが可能な仕組みに接続ができます。

入力検証、文字数制限、シグナル連携などの各種機能を統合して、使い勝手の良い検索インタフェースを構築できます。

複数入力フィールドとの連携

フォーム全体での入力データ管理と検証

複数のQLineEditが配置されたフォームでは、それぞれの入力フィールドから取得するデータを統合して管理する必要があります。

各フィールドに対して独自の入力検証を設定することにより、データの一貫性や正確性を保ちながら、全体としての検証処理や送信処理のトリガーとしてシグナル連携を利用できます。

たとえば、ユーザー名、メールアドレス、電話番号など、複数の情報を入力させる場合は、各フィールドごとにsetValidatorsetMaxLengthを設定し、最終的に「送信」ボタンの動作で全体の検証結果を着実に反映させる工夫が求められます。

  • 各QLineEditに適切な入力検証を設定
  • ボタンのクリックやフォーカスアウト時に全体の入力状況をチェック
  • シグナル&スロットで連携し、1つの入力フィールドでエラーがあった場合、エラーメッセージを分かりやすく表示

これにより、ユーザーにストレスなく入力を完了してもらえる設計にすることができます。

まとめ

ここまで、QLineEditの基本機能から入力内容の制限、テキストの配置、シグナルとスロットの連携、カスタマイズ、さらに実際の応用例まで、様々な実装方法や利用シーンについて柔らかい表現で説明してきました。

各サンプルコードは、実際に手を動かしながら確認できるような内容になっており、入力項目の簡単な検証から、全体としてのデザインの統一まで、簡単かつ実用的なアプローチが示されています。

今回紹介した手法を参考に、ユーザーが使いやすく、見た目にも美しいアプリケーションの構築に役立ててもらえれば嬉しいです。

関連記事

Back to top button