ツールチップ、コンテキストメニュー、キーボードショートカット:QWhatsThisを超えた「このウィジェットとは」ヘルプの実現


使い方

この関数を呼び出すだけで、"What's This?" ヘルプモードが有効になります。ユーザーが Esc キーを押すか、別のウィジェットをクリックするまで、このモードは有効なままになります。

void MyWidget::enterHelpMode() {
  QWhatsThis::enterWhatsThisMode();
}

このコードは、MyWidget クラスのメンバー関数 enterHelpMode() を定義します。この関数は QWhatsThis::enterWhatsThisMode() 関数を呼び出し、"What's This?" ヘルプモードを有効にします。

  • QWhatsThis::leaveWhatsThisMode() 関数は、"What's This?" ヘルプモードを無効にするために使用できます。
  • QWhatsThis::inWhatsThisMode() 関数は、"What's This?" ヘルプモードが有効かどうかを確認するために使用できます。
  • ユーザーが "What's This?" ヘルプモードに入ると、Qt::EnterWhatsThisMode イベントがすべてのトップレベルウィジェットに送信されます。
  • QWhatsThis::enterWhatsThisMode() 関数は、アプリケーションのトップレベルウィジェットに対してのみ呼び出すことができます。
  • "What's This?" ヘルプテキストは、QWhatsThis::add() 関数を使用してウィジェットに割り当てることができます。
  • QWhatsThis::enterWhatsThisMode() 関数は、Qt Widgets 以外の Qt フレームワークでも使用できます。


例1: ボタンに "What's This?" ヘルプを追加する

この例では、ボタンに "What's This?" ヘルプを追加する方法を示します。

#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWhatsThis>

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

  QPushButton button("Click me");
  button.setToolTip("This is a button.");

  QWhatsThis::registerObject(&button, "This is a button with 'What's This?' help.");

  button.show();

  return app.exec();
}

このコードは、次のことを行います。

  1. QApplication オブジェクトを作成します。
  2. QPushButton オブジェクトを作成し、"Click me" というテキストを設定します。
  3. setToolTip() メソッドを使用して、ボタンにツールチップを設定します。
  4. QWhatsThis::registerObject() メソッドを使用して、ボタンに "What's This?" ヘルプを登録します。
  5. ボタンを表示します。
  6. アプリケーションを実行します。

ユーザーがこのボタンをクリックすると、"What's This?" ヘルプテキストが表示されます。

例2: カスタムヘルプウィジェットを作成する

この例では、カスタムヘルプウィジェットを作成する方法を示します。

#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QWhatsThis>

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

  QLabel label("This is a label.");

  QWhatsThis::registerObject(&label, "This is a label with custom 'What's This?' help.");

  label.show();

  return app.exec();
}

このコードは、例1とほとんど同じですが、代わりに QLabel オブジェクトを使用しています。QWhatsThis::registerObject() メソッドの第二引数には、カスタムヘルプテキストが指定されています。

ユーザーがこのラベルをクリックすると、カスタムヘルプウィジェットが表示されます。

  • QWhatsThis::inWhatsThisMode() 関数を使用して、"What's This?" ヘルプモードが有効かどうかを確認することができます。
  • QWhatsThis::leaveWhatsThisMode() 関数を使用して、"What's This?" ヘルプモードを無効にすることができます。
  • QWhatsThis::add() 関数を使用して、ウィジェットにヘルプテキストを直接追加することができます。


以下に、QWhatsThis::enterWhatsThisMode() 関数の代替方法をいくつか紹介します。

カスタムヘルプウィジェットを作成する

QWhatsThis::enterWhatsThisMode() 関数の代わりに、カスタムヘルプウィジェットを作成することができます。この方法では、ヘルプテキストの表示方法をより細かく制御できます。

#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QWhatsThis>

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

  QLabel label("This is a label.");

  // カスタムヘルプウィジェットを作成します。
  QDialog helpDialog;
  QLabel helpLabel("This is the custom help text.");
  helpDialog.setLayout(new QVBoxLayout);
  helpDialog.layout()->addWidget(&helpLabel);

  // 'What's This?' ヘルプテキストを設定します。
  QWhatsThis::registerObject(&label, &helpDialog);

  label.show();

  return app.exec();
}

このコードは、QDialog オブジェクトを使用してカスタムヘルプウィジェットを作成します。QWhatsThis::registerObject() メソッドを使用して、このヘルプウィジェットをラベルに関連付けます。

ツールチップを使用する

QWhatsThis::enterWhatsThisMode() 関数の代わりに、ツールチップを使用することができます。ツールチップは、より簡潔なヘルプを提供するのに適しています。

#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>

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

  QPushButton button("Click me");
  button.setToolTip("This is a button.");

  button.show();

  return app.exec();
}

このコードは、setToolTip() メソッドを使用してボタンにツールチップを設定します。

コンテキストメニューを使用する

QWhatsThis::enterWhatsThisMode() 関数の代わりに、コンテキストメニューを使用することができます。コンテキストメニューは、より多くのヘルプオプションを提供するのに適しています。

#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QMenu>

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

  QPushButton button("Click me");

  // コンテキストメニューを作成します。
  QMenu contextMenu;
  QAction *whatsThisAction = contextMenu.addAction("What's This?");
  connect(whatsThisAction, &QAction::triggered, &button, &QPushButton::enterHelpMode);

  button.setContextMenuPolicy(Qt::ContextMenuPolicy::NoContextMenu);
  button.addAction(contextMenu.menuAction());

  button.show();

  return app.exec();
}

このコードは、QMenu オブジェクトを使用してコンテキストメニューを作成します。"What's This?" アクションがメニューに追加され、ボタンがクリックされたときに enterHelpMode() メソッドが呼び出されます。

キーボードショートカットを使用する

QWhatsThis::enterWhatsThisMode() 関数の代わりに、キーボードショートカットを使用することができます。キーボードショートカットは、より迅速なアクセスを提供するのに適しています。

#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>

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

  QPushButton button("Click me");

  // キーボードショートカットを設定します。
  button.setShortcut(Qt::Key_F1);
  connect(button, &QShortcut::activated, &button, &QPushButton::enterHelpMode);

  button.show();

  return app.exec();
}

このコードは、setShortcut() メソッドを使用してボタンにキーボードショートカットを設定します。"F1" キーが押されると、enterHelpMode() メソッドが呼び出されます。

これらの方法は、それぞれ長所と短所があります。状況に応じて最適な方法を選択してください。

  • QWhatsThis::inWhatsThisMode()
  • QWhatsThis::leaveWhatsThisMode() 関数を使用して、"What's This?" ヘルプモードを無効にすることができます。