Qt Widgetsでボタンを自在に操る!QPushButtonクラスの使い方を徹底解説


QPushButtonクラスは、Qt Widgetsモジュールで提供される最も基本的なウィジェットの一つであり、ユーザーがクリックすることでアクションを実行できるボタンを作成するために使用されます。シンプルな外観ながら、テキスト、アイコン、スタイルなどをカスタマイズすることで、様々な用途に活用できます。

ボタンの作成

QPushButtonインスタンスを作成するには、以下のいずれかのコンストラクタを使用します。

  • QPushButton(QWidget *parent = nullptr): テキストもアイコンも設定されない空のボタンを作成します。
  • QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr): アイコンとテキスト付きのボタンを作成します。
  • QPushButton(const QString &text, QWidget *parent = nullptr): テキストのみのボタンを作成します。

ボタンの配置

作成したボタンは、親ウィジェットに配置する必要があります。一般的には、レイアウトマネージャーを使用して、ボタンをウィジェット内における適切な位置に配置します。

ボタンのテキストとアイコン

ボタンのテキストとアイコンは、以下のプロパティを使用して設定できます。

  • setIcon(const QIcon &icon): ボタンのアイコンを設定します。
  • text(): ボタンのテキストを取得・設定します。

ボタンのスタイル

ボタンの外観は、スタイルシートを使用してカスタマイズできます。Qt Widgetsは、様々なスタイルオプションを提供しており、ボタンの色、フォント、ボーダーなどを自由に設定できます。

ボタンのシグナルとスロット

ボタンがクリックされたときに発生するシグナルと、そのシグナルに接続されるスロットを使用して、ボタンクリック時の処理を定義できます。

  • connect(button, &QPushButton::clicked, this, &YourClass::yourSlot);: ボタンのclickedシグナルを、YourClassクラスのyourSlotスロットに接続します。
  • clicked(): ボタンがクリックされたときに発生するシグナルです。

以下のコードは、"Hello, World!"と表示するボタンを作成する例です。

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

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

  QPushButton button("Hello, World!");
  button.connect(&button, &QPushButton::clicked, []() {
    QMessageBox::information(nullptr, "Hello", "Hello, World!");
  });

  button.show();

  return app.exec();
}


テキストとアイコン付きボタン

このコードは、"テキスト付きボタン"と"アイコン付きボタン"を作成し、それぞれ異なるアクションを実行する例です。

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

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

  // テキスト付きボタン
  QPushButton textButton("テキスト付きボタン");
  textButton.connect(&textButton, &QPushButton::clicked, []() {
    QMessageBox::information(nullptr, "テキストボタン", "テキストボタンがクリックされました!");
  });

  // アイコン付きボタン
  QIcon icon(":/icon.png"); // icon.png ファイルをパスに置き換えてください
  QPushButton iconButton("アイコン付きボタン", icon);
  iconButton.connect(&iconButton, &QPushButton::clicked, []() {
    QMessageBox::information(nullptr, "アイコンボタン", "アイコンボタンがクリックされました!");
  });

  // ボタンを横に並べて表示
  QHBoxLayout *layout = new QHBoxLayout;
  layout->addWidget(&textButton);
  layout->addWidget(&iconButton);

  // ウィジェットを作成し、レイアウトを設定
  QWidget widget;
  widget.setLayout(layout);
  widget.show();

  return app.exec();
}

スタイルシートを使用したボタンのカスタマイズ

このコードは、スタイルシートを使用してボタンの外観をカスタマイズする例です。ボタンの背景色、フォントサイズ、ボーダーなどを変更します。

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

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

  QPushButton button("ボタン");

  // スタイルシートを定義
  QString styleSheet = "QPushButton {"
                       "background-color: #f0f0f0; "
                       "font-size: 20px; "
                       "border: 2px solid #ccc; "
                       "padding: 10px; "
                       "}";

  // ボタンにスタイルシートを適用
  button.setStyleSheet(styleSheet);

  // ボタンをウィジェットに配置して表示
  QWidget widget;
  widget.setLayout(new QVBoxLayout);
  widget.layout()->addWidget(&button);
  widget.show();

  return app.exec();
}

チェックボックス付きボタン

このコードは、チェックボックス付きボタンを作成し、チェック状態に応じて処理を切り替える例です。

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

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

  // チェックボックス付きボタン
  QCheckBox checkBox("チェックボックス");
  QPushButton button("ボタン");

  // ボタンの状態を、チェックボックスの状態に連動
  QObject::connect(&checkBox, &QCheckBox::stateChanged, &button, &QPushButton::setEnabled);

  // ボタンがクリックされたらチェックボックスの状態を反転
  QObject::connect(&button, &QPushButton::clicked, [&checkBox]() {
    checkBox.setChecked(!checkBox.isChecked());
  });

  // ボタンを横に並べて表示
  QHBoxLayout *layout = new QHBoxLayout;
  layout->addWidget(&checkBox);
  layout->addWidget(&button);

  // ウィジェットを作成し、レイアウトを設定
  QWidget widget;
  widget.setLayout(layout);
  widget.show();

  return app.exec();
}

トグルボタン

このコードは、トグルボタンを作成し、クリックするたびに状態を切り替える例です。

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

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

  // トグルボタン
  QPushButton button("トグルボタン");
  button.setCheckable(true); // トグルボタンとして設定

  // ボタンの状態が変化したらメッセージボックスを表示
  QObject::connect(&button, &QPushButton::toggled, [&button](bool checked) {
    if (checked) {
      QMessageBox::information(nullptr, "トグルボタン", "オンになりました!");
    } else {
      QMessageBox::information(nullptr, "トグルボタン", "オフになりました!");
    }
  });

  // ボタンをウィジェットに配置して表示
  QWidget widget;
  widget.setLayout


QToolButtonクラス

QToolButtonクラスは、アイコンのみを表示するボタンや、ドロップダウンリスト付きのボタンなど、より複雑なボタンを作成するために使用されます。QPushButtonクラスよりも柔軟性が高く、様々な用途に活用できます。


QToolButton button;
button.setIcon(QIcon(":/icon.png")); // icon.png ファイルをパスに置き換えてください
button.setText("ツールボタン");
button.setToolButtonStyle(Qt::ToolButtonIconOnly); // アイコンのみを表示

QRadioButtonクラス

QRadioButtonクラスは、ラジオボタンを作成するために使用されます。複数のラジオボタンをグループ化することで、ユーザーが1つのオプションを選択できるようにします。


QRadioButton radioButton1("オプション1");
QRadioButton radioButton2("オプション2");

// ラジオボタンをグループ化
QButtonGroup group;
group.addButton(&radioButton1);
group.addButton(&radioButton2);

QCheckBoxクラス

QCheckBoxクラスは、チェックボックスを作成するために使用されます。ユーザーがオプションを選択したり解除したりできるようにします。


QCheckBox checkBox("チェックボックス");

QMenuクラス

QMenuクラスは、ドロップダウンメニューを作成するために使用されます。メニューには、アクション項目を複数配置することができます。


QMenu menu("メニュー");
QAction *action1 = menu.addAction("アクション1");
QAction *action2 = menu.addAction("アクション2");

// ボタンにメニューを割り当て
QPushButton button("メニューボタン");
button.setMenu(&menu);

カスタムウィジェット

上記以外にも、QPushButtonクラスの機能を拡張したカスタムウィジェットを作成することもできます。

class MyButton : public QPushButton {
public:
  MyButton(const QString &text, QWidget *parent = nullptr);

protected:
  void paintEvent(QPaintEvent *event) override;
};

MyButton::MyButton(const QString &text, QWidget *parent)
    : QPushButton(text, parent) {
}

void MyButton::paintEvent(QPaintEvent *event) {
  // カスタムペイント処理
  QPainter painter(this);
  // ...
}