【GUIプログラミング】アクション用ウィジェットを自由自在に操る、Qt WidgetsのQWidgetAction::requestWidget()


QWidgetAction::requestWidget()は、Qt WidgetsライブラリにおけるQWidgetActionクラスのメソッドであり、アクションを表すウィジェットを、指定された親ウィジェットとともに返します。このメソッドは、コンテナウィジェットがアクション用のウィジェットを要求する際に使用されます。

詳細

QWidgetActionクラスは、アクションをより複雑なウィジェットで表現できるように拡張されたQActionクラスの子クラスです。例えば、ワードプロセッサのズームアクションでは、QToolBar内にQComboBoxを使用して、さまざまなズームレベルを提示することができます。

QWidgetActionオブジェクトがQToolBarなどのコンテナウィジェットに追加されると、QWidgetAction::createWidget()メソッドが呼び出されます。このメソッドは、アクションを表す新しいウィジェットを作成する責任を負います。サブクラスはこのメソッドを再実装して、独自のカスタムウィジェットを作成することができます。

createWidget()メソッドが再実装されていない場合、またはデフォルトの実装が使用される場合は、QWidgetActionオブジェクトにはデフォルトウィジェットが関連付けられます。デフォルトウィジェットは、アクションのアイコンとテキストを表示するシンプルなウィジェットです。

コンテナウィジェットがアクション用のウィジェットを要求するためにrequestWidget()メソッドを呼び出すと、デフォルトウィジェットが返されます。ただし、createWidget()メソッドが再実装されている場合は、カスタムウィジェットが返されます。

以下の例では、QWidgetActionオブジェクトを作成し、QToolBarに追加する方法を示します。この例では、createWidget()メソッドが再実装されておらず、デフォルトウィジェットが使用されます。

QWidgetAction *action = new QWidgetAction(this);
action->setText("Zoom");
action->setIcon(QIcon(":/zoom.png"));

QToolBar *toolBar = new QToolBar(this);
toolBar->addAction(action);


#include <QApplication>
#include <QMainWindow>
#include <QToolBar>
#include <QWidgetAction>

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

    QMainWindow window;

    QToolBar *toolBar = new QToolBar(&window);
    QWidgetAction *action = new QWidgetAction(&window);
    action->setText("Zoom");
    action->setIcon(QIcon(":/zoom.png"));

    toolBar->addAction(action);

    window.addToolBar(Qt::TopToolBarArea, toolBar);
    window.show();

    return app.exec();
}

例2:カスタムウィジェットを使用する

以下のコードは、QWidgetActionオブジェクトを作成し、QToolBarに追加する方法を示します。この例では、createWidget()メソッドが再実装され、カスタムウィジェットが使用されます。カスタムウィジェットは、QComboBoxを使用して、さまざまなズームレベルを提示します。

#include <QApplication>
#include <QMainWindow>
#include <QToolBar>
#include <QWidgetAction>
#include <QComboBox>

class ZoomComboBox : public QComboBox {
public:
    ZoomComboBox(QWidget *parent = nullptr) : QComboBox(parent) {
        addItem("25%");
        addItem("50%");
        addItem("100%");
        addItem("200%");
        addItem("400%");
    }
};

class ZoomAction : public QWidgetAction {
public:
    ZoomAction(QWidget *parent = nullptr) : QWidgetAction(parent) {
        comboBox = new ZoomComboBox(this);
        setDefaultWidget(comboBox);
    }

private:
    ZoomComboBox *comboBox;
};

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

    QMainWindow window;

    QToolBar *toolBar = new QToolBar(&window);
    ZoomAction *action = new ZoomAction(&window);

    toolBar->addAction(action);

    window.addToolBar(Qt::TopToolBarArea, toolBar);
    window.show();

    return app.exec();
}
  • 例2では、ZoomActionという名前のカスタムクラスが定義されます。このクラスは、QWidgetActionクラスを継承し、createWidget()メソッドを再実装します。createWidget()メソッドは、ZoomComboBoxオブジェクトを作成し、デフォルトウィジェットとして設定します。ZoomComboBoxクラスは、QComboBoxクラスを継承し、さまざまなズームレベルを提示します。
  • 例1では、QWidgetActionオブジェクトが作成され、setText()setIcon()メソッドを使用してテキストとアイコンが設定されます。その後、QToolBarオブジェクトにaddAction()メソッドを使用してアクションが追加されます。


  • カスタムウィジェットを使用するには、createWidget()メソッドを再実装する必要があります。これは、追加のコーディングが必要となります。
  • デフォルトでは、デフォルトウィジェットが返されます。これは、アクションのアイコンとテキストのみを表示するシンプルなウィジェットです。

これらの制限を回避するために、QWidgetAction::requestWidget()メソッドの代替方法をいくつか検討することができます。

QActionを使用する

QActionクラスは、アクションを表すためのよりシンプルな方法を提供します。QActionオブジェクトには、アイコン、テキスト、およびショートカットキーを設定することができます。QActionオブジェクトは、QToolBarQMenuなどのウィジェットに追加することができます。

QActionを使用する利点は次のとおりです。

  • カスタムウィジェットを作成する必要はありません。
  • デフォルトウィジェットが返されないため、追加のコーディングが不要です。

QActionを使用する例を次に示します。

#include <QApplication>
#include <QMainWindow>
#include <QToolBar>
#include <QAction>

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

    QMainWindow window;

    QToolBar *toolBar = new QToolBar(&window);
    QAction *action = new QAction(&window);
    action->setText("Zoom");
    action->setIcon(QIcon(":/zoom.png"));

    toolBar->addAction(action);

    window.addToolBar(Qt::TopToolBarArea, toolBar);
    window.show();

    return app.exec();
}

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

QWidgetAction::requestWidget()メソッドの代替方法として、アクション用のカスタムウィジェットを作成することができます。この方法は、より柔軟な制御を提供しますが、追加のコーディングが必要となります。

カスタムウィジェットを作成する利点は次のとおりです。

  • デフォルトウィジェットよりも複雑なウィジェットを作成することができます。
  • アクションの外観と動作を完全に制御できます。

カスタムウィジェットを作成する例を次に示します。

#include <QApplication>
#include <QMainWindow>
#include <QToolBar>
#include <QWidgetAction>
#include <QComboBox>

class ZoomComboBox : public QComboBox {
public:
    ZoomComboBox(QWidget *parent = nullptr) : QComboBox(parent) {
        addItem("25%");
        addItem("50%");
        addItem("100%");
        addItem("200%");
        addItem("400%");
    }
};

class ZoomAction : public QWidgetAction {
public:
    ZoomAction(QWidget *parent = nullptr) : QWidgetAction(parent) {
        comboBox = new ZoomComboBox(this);
        setDefaultWidget(comboBox);
    }

private:
    ZoomComboBox *comboBox;
};

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

    QMainWindow window;

    QToolBar *toolBar = new QToolBar(&window);
    ZoomAction *action = new ZoomAction(&window);

    toolBar->addAction(action);

    window.addToolBar(Qt::TopToolBarArea, toolBar);
    window.show();

    return app.exec();
}

QToolButtonを使用する

QToolButtonクラスは、ボタンを表すためのシンプルな方法を提供します。QToolButtonオブジェクトには、アイコン、テキスト、およびチェック状態を設定することができます。QToolButtonオブジェクトは、QToolBarQMenuなどのウィジェットに追加することができます。

QToolButtonを使用する利点は次のとおりです。

  • カスタムウィジェットを作成する必要はありません。
  • デフォルトウィジェットが返されないため、追加のコーディングが不要です。

QToolButtonを使用する例を次に示します。

#include <QApplication>
#include <QMainWindow>
#include <QToolBar>
#include <QToolButton>

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

    QMainWindow window;

    QToolBar *toolBar = new QToolBar(&window);
    QToolButton *button = new QToolButton(&window);
    button->setIcon(QIcon(":/zoom.png"));
    button->setText("Zoom");

    toolBar->addAction(button);

    window.addToolBar(Qt::TopToolBarArea, toolBar);
    window.show