【初心者向け】Qt Widgets でアイコンを扱う: QStyle::StandardPixmap と SVG アイコン


QStyle::StandardPixmap は、Qt Widgets で標準的なアイコンやピクトグラムを取得するために使用される enum です。ボタン、メニュー、ツールバーなどの GUI 要素でよく使用されるアイコンを提供します。

使い方

QStyle::StandardPixmap を使用するには、まず QStyle オブジェクトを取得する必要があります。これは、通常、現在のウィジェットのスタイルを取得することで行います。

QStyle* style = widget->style();

次に、QStyle::standardPixmap メソッドを呼び出し、使用する標準ピクトグラムの種類を指定します。

QPixmap pixmap = style->standardPixmap(QStyle::SP_ArrowUp);

この例では、上矢印アイコンを取得しています。利用可能な標準ピクトグラムの種類は、QStyle::StandardPixmap enum に定義されています。

次の例では、ボタンに "開く" アイコンを設定する方法を示します。

QPushButton* button = new QPushButton("開く");

QStyle* style = button->style();
QPixmap openPixmap = style->standardPixmap(QStyle::SP_DirOpenIcon);
button->setIcon(openPixmap);

QStyle::standardIcon の使用

Qt 5.11 以降では、QStyle::standardIcon メソッドを使用して標準アイコンを取得することをお勧めします。これは、QStyle::standardPixmap よりも高DPI対応で、より効率的な方法です。

QIcon icon = style->standardIcon(QStyle::SP_DirOpenIcon);
button->setIcon(icon);
  • 標準ピクトグラムは、テーマによって異なる場合があります。
  • QStyle::standardPixmap は Qt 6 で廃止予定となっています。将来的には、QStyle::standardIcon を使用するように切り替える必要があります。


#include <QApplication>
#include <QPushButton>
#include <QStyle>

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

  QPushButton* button = new QPushButton("開く");

  QStyle* style = button->style();
  QPixmap openPixmap = style->standardPixmap(QStyle::SP_DirOpenIcon);
  button->setIcon(openPixmap);

  button->show();

  return app.exec();
}

例 2: ツールバーにアイコンを追加

#include <QApplication>
#include <QToolBar>
#include <QPushButton>
#include <QStyle>

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

  QToolBar* toolbar = new QToolBar;

  QPushButton* openButton = new QPushButton;
  openButton->setIcon(style->standardPixmap(QStyle::SP_DirOpenIcon));
  toolbar->addAction(openButton);

  QPushButton* saveButton = new QPushButton;
  saveButton->setIcon(style->standardPixmap(QStyle::SP_DirSaveIcon));
  toolbar->addAction(saveButton);

  toolbar->show();

  return app.exec();
}

例 3: メニューにアイコンを追加

#include <QApplication>
#include <QMenu>
#include <QAction>
#include <QStyle>

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

  QMenu* menu = new QMenu;

  QAction* openAction = new QAction("開く", menu);
  openAction->setIcon(style->standardPixmap(QStyle::SP_DirOpenIcon));
  menu->addAction(openAction);

  QAction* saveAction = new QAction("保存", menu);
  saveAction->setIcon(style->standardPixmap(QStyle::SP_DirSaveIcon));
  menu->addAction(saveAction);

  menu->show();

  return app.exec();
}
  • コードを実行するには、Qt Creator などの Qt IDE を使用してプロジェクトを作成する必要があります。
  • 他の Qt バージョンを使用している場合は、対応する enum 値と API を使用する必要があります。
  • 上記のコードは Qt Widgets 6.7.1 を使用しています。


Qt Widgets で標準的なアイコンやピクトグラムを取得するために、QStyle::StandardPixmap enum を使用することは一般的です。しかし、いくつかの代替方法があり、状況によってはこれらの方法の方が適切な場合があります。

代替方法

  • カスタム描画
    アイコンを自分で描画します。
  • SVG アイコン
    SVG ファイルからアイコンを読み込みます。
  • QIcon::fromTheme() メソッド
    特定のテーマに属するアイコンを取得できます。

各方法の詳細

QIcon::fromTheme() メソッド

QIcon::fromTheme() メソッドは、特定のテーマに属するアイコンを取得するために使用されます。この方法は、テーマに依存するアイコンが必要な場合に役立ちます。

QIcon icon = QIcon::fromTheme("application-octet-stream");

この例では、"application-octet-stream" テーマに属するアイコンを取得しています。

SVG アイコン

SVG ファイルは、スケーラブルなベクターグラフィック形式であり、アイコンを表すために使用できます。SVG ファイルからアイコンを読み込むには、QIcon::fromFile() メソッドを使用します。

QIcon icon = QIcon::fromFile("path/to/icon.svg");

この例では、"path/to/icon.svg" ファイルにあるアイコンを読み込んでいます。

カスタム描画

アイコンを自分で描画したい場合は、QPainter クラスを使用してカスタムウィジェットを作成できます。

class MyIconWidget : public QWidget {
public:
  MyIconWidget(const QSize& size) : QWidget(nullptr) {
    setFixedSize(size);
  }

protected:
  void paintEvent(QPaintEvent* event) override {
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // アイコンを描画するコードをここに記述します
  }
};

この例では、MyIconWidget というカスタムウィジェットを作成しています。このウィジェットの paintEvent() メソッド内で、アイコンを描画するコードを記述する必要があります。

適切な方法の選択

どの代替方法を使用するかは、状況によって異なります。

  • 完全な制御が必要な場合は、カスタム描画を使用します。
  • スケーラブルなアイコンが必要な場合は、SVG アイコンを使用します。
  • 特定のテーマに属するアイコンが必要な場合は、QIcon::fromTheme() メソッドを使用します。