Qt Widgets の QCompleter::CompletionMode (enum) を使ったサンプルコード


QCompleter::CompletionMode は、Qt Widgets ライブラリで提供される QCompleter クラスで使用される列挙型です。この列挙型は、補完候補がどのようにユーザーに提供されるかを決定します。

定数

QCompleter::CompletionMode には、以下の 3 つの定数が定義されています。

  • OverlappingCompletion
    すべての可能な補完候補がポップアップウィンドウに表示され、最も可能性の高い候補が現在の候補として示されます。これは、ユーザーがすべての補完候補を閲覧したい場合に役立ちます。
  • InlineCompletion
    補完候補はインラインで表示されます。つまり、入力中のテキストの一部として表示されます。これは、入力候補が限られている場合や、ユーザーが候補を素早く確認したい場合に役立ちます。
  • PopupCompletion
    補完候補はポップアップウィンドウに表示されます。これは最も一般的なモードであり、多くの場合に使用されます。

使用方法

QCompleter::CompletionMode は、QCompleter::setCompletionMode() メソッドを使用して設定できます。

QCompleter completer;
completer.setCompletionMode(QCompleter::PopupCompletion);

以下の例では、QLineEdit ウィジェットに QCompleter を接続し、ユーザーが入力した文字列に基づいて補完候補をポップアップウィンドウに表示する方法を示します。

#include <QApplication>
#include <QCompleter>
#include <QLineEdit>

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

  QLineEdit lineEdit;
  QCompleter completer(&lineEdit);
  completer.setCompletionMode(QCompleter::PopupCompletion);

  // ... (補完候補となるデータソースを設定)

  lineEdit.show();

  return app.exec();
}

詳細

QCompleter::CompletionMode について詳しくは、Qt ドキュメントを参照してください。

  • QCompleter クラスは、テキスト入力ウィジェットの自動補完機能を実装するのに役立ちます。
  • QCompleter::CompletionMode は、QCompleter クラスの動作をカスタマイズするための多くのプロパティの 1 つに過ぎません。


#include <QApplication>
#include <QCompleter>
#include <QLineEdit>
#include <QStringListModel>

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

  // 補完候補となるデータ
  QStringList data = {
    "apple",
    "banana",
    "orange",
    "grape",
    "strawberry"
  };

  // 補完候補モデルを作成
  QStringListModel model(data);

  // QLineEdit ウィジェットを作成
  QLineEdit lineEdit;

  // QCompleter を作成
  QCompleter completer(&lineEdit, &model);

  // 補完モードを設定
  completer.setCompletionMode(QCompleter::PopupCompletion);

  // QLineEdit と QCompleter を接続
  lineEdit.setCompleter(&completer);

  // QLineEdit ウィジェットを表示
  lineEdit.show();

  return app.exec();
}
  1. #include <QApplication>: Qt アプリケーションライブラリをインクルードします。
  2. #include <QCompleter>: QCompleter クラスをインクルードします。
  3. #include <QLineEdit>: QLineEdit クラスをインクルードします。
  4. #include <QStringListModel>: QStringListModel クラスをインクルードします。
  5. int main(int argc, char *argv[]): アプリケーションのエントリーポイントです。
  6. QApplication app(argc, argv);: Qt アプリケーションオブジェクトを作成します。
  7. QStringList data;: 補完候補となるデータのリストを作成します。
  8. QStringListModel model(data);: 補完候補モデルを作成します。
  9. QLineEdit lineEdit;: QLineEdit ウィジェットを作成します。
  10. QCompleter completer(&lineEdit, &model);: QCompleter オブジェクトを作成し、QLineEdit ウィジェットと QStringListModel モデルを関連付けます。
  11. completer.setCompletionMode(QCompleter::PopupCompletion);: 補完モードを PopupCompletion に設定します。
  12. lineEdit.setCompleter(&completer);: QLineEdit ウィジェットに QCompleter オブジェクトを設定します。
  13. lineEdit.show();: QLineEdit ウィジェットを表示します。
  14. return app.exec();: アプリケーションを実行します。
  • キーボードショートカットを追加する。
  • 補完候補の外観をカスタマイズする。
  • カスタムフィルタリングロジックを実装する。
  • 独自のデータソースを使用する。


代替方法

  1. カスタムウィジェット
    独自のウィジェットを作成して補完機能を実装することができます。これは、より高度なカスタマイズが必要な場合や、QCompleter クラスが提供する機能を超えた機能が必要な場合に役立ちます。
  2. QListView
    QListView ウィジェットを使用して補完候補を表示することができます。これは、シンプルな補完機能が必要な場合や、補完候補をより柔軟に制御したい場合に役立ちます。
  3. 手動フィルタリング
    入力文字列に基づいて補完候補を手動でフィルタリングすることができます。これは、パフォーマンスが重要な場合や、独自のフィルタリングロジックが必要な場合に役立ちます。

各代替方法の詳細

カスタムウィジェット

カスタムウィジェットを作成するには、以下の手順を実行します。

  1. 補完候補を表示するためのウィジェットを作成します。
  2. ユーザーが入力した文字列に基づいて補完候補をフィルタリングするロジックを実装します。
  3. ユーザーが補完候補を選択できるようにします。

カスタムウィジェットを使用する利点は、補完機能を完全に制御できることです。ただし、実装には時間がかかり、複雑になる可能性があります。

以下の例では、QListView ウィジェットを使用して補完候補を表示するカスタムウィジェットを作成する方法を示します。

#include <QApplication>
#include <QCompleter>
#include <QLineEdit>
#include <QStringListModel>
#include <QVBoxLayout>

class CustomCompleter : public QWidget {
public:
  CustomCompleter(QWidget *parent = nullptr);

private:
  QLineEdit *lineEdit;
  QListView *listView;
  QStringListModel *model;

  void filterCompletions(const QString &text);
};

CustomCompleter::CustomCompleter(QWidget *parent) : QWidget(parent) {
  lineEdit = new QLineEdit(this);
  listView = new QListView(this);
  model = new QStringListModel(this);

  QVBoxLayout *layout = new QVBoxLayout(this);
  layout->addWidget(lineEdit);
  layout->addWidget(listView);

  connect(lineEdit, &QLineEdit::textEdited, this, &CustomCompleter::filterCompletions);
}

void CustomCompleter::filterCompletions(const QString &text) {
  QStringList filteredData;
  for (int i = 0; i < model->rowCount(); ++i) {
    QString itemText = model->data(model->index(i, 0)).toString();
    if (itemText.contains(text, Qt::CaseSensitivity::Sensitive)) {
      filteredData.append(itemText);
    }
  }

  model->setStringList(filteredData);
}

QListView

QListView を使用するには、以下の手順を実行します。

  1. 補完候補を格納するためのデータモデルを作成します。
  2. QListView ウィジェットを作成し、データモデルを設定します。
  3. ユーザーが補完候補を選択できるようにします。

QListView を使用する利点は、実装が比較的簡単で、シンプルな補完機能が必要な場合に適していることです。ただし、QCompleter クラスほど柔軟ではありません。

以下の例では、QListView ウィジェットを使用して補完候補を表示する方法を示します。

#include <QApplication>
#include <QLineEdit>
#include <QListView>
#include <QStringListModel>

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

  // 補完候補となるデータ
  QStringList data = {
    "apple",
    "banana",
    "orange",
    "grape",
    "strawberry"
  };

  // データモデルを作成
  QStringListModel model(data);

  // QLineEdit ウィジェットを作成
  QLineEdit lineEdit;

  // QListView ウィジェットを作成
  QListView listView;
  listView.setModel(&model);

  // ユーザーが補完候補を選択できるようにします。
  connect(listView, &QListView::clicked, [&](const QModelIndex &index) {
    lineEdit.setText(model.data(index).toString());
  });

  // ウィジェットをレイアウトします。
  QVBoxLayout layout;
  layout.addWidget(&lineEdit);
  layout.addWidget(&listView);