Qt Widgets でフォントを選択する方法:QFontDialog::currentFont() 関数と代替方法を徹底解説


QFontDialog::currentFont() 関数の使用例

QFontDialog dialog;

// 初期フォントを設定
dialog.setCurrentFont(QFont("Arial", 12));

// ダイアログを表示
int result = dialog.exec();

if (result == QDialog::Accepted) {
  // ユーザーが OK ボタンをクリックした場合
  QFont selectedFont = dialog.currentFont();
  // 選択されたフォントを使用して処理を行う
  // ...
} else {
  // ユーザーがキャンセルした場合
  // ...
}

この例では、まず QFontDialog オブジェクトを作成し、setCurrentFont() 関数を使用して初期フォントを設定します。次に、exec() 関数を使用してダイアログを表示します。ユーザーが OK ボタンをクリックした場合、currentFont() 関数を使用して選択されたフォントを取得し、処理に使用することができます。

QFontDialog::currentFont() 関数の注意点

  • ユーザーが OK ボタンをクリックするまで、選択されたフォントは確定しません。currentFont() 関数は、ダイアログ内のフォントプレビューに表示されているフォントを返します。
  • この関数は、QFontDialog ダイアログが表示されている場合にのみ有効です。ダイアログが表示されていない場合は、空の QFont オブジェクトを返します。


例 1: 単純なフォント選択

この例では、QFontDialog ダイアログを使用してフォントを選択し、選択されたフォントの名前を表示します。

#include <QApplication>
#include <QFontDialog>

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

  // フォントダイアログを作成
  QFontDialog dialog;

  // 初期フォントを設定
  dialog.setCurrentFont(QFont("Arial", 12));

  // ダイアログを表示
  int result = dialog.exec();

  if (result == QDialog::Accepted) {
    // ユーザーが OK ボタンをクリックした場合
    QFont selectedFont = dialog.currentFont();
    QString fontName = selectedFont.family();

    // 選択されたフォントの名前を表示
    qDebug() << "Selected font name:" << fontName;
  } else {
    // ユーザーがキャンセルした場合
    qDebug() << "Font selection canceled";
  }

  return 0;
}

例 2: フォント設定ダイアログ

この例では、QFontDialog ダイアログを使用してフォントを設定し、そのフォントを使用してラベルのテキストを表示します。

#include <QApplication>
#include <QLabel>
#include <QFontDialog>

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

  // ラベルを作成
  QLabel label("Hello, World!");

  // フォントダイアログを作成
  QFontDialog dialog;

  // 初期フォントを設定
  dialog.setCurrentFont(label.font());

  // ダイアログを表示
  int result = dialog.exec();

  if (result == QDialog::Accepted) {
    // ユーザーが OK ボタンをクリックした場合
    QFont selectedFont = dialog.currentFont();

    // ラベルのフォントを設定
    label.setFont(selectedFont);
  } else {
    // ユーザーがキャンセルした場合
    qDebug() << "Font selection canceled";
  }

  // ラベルを表示
  label.show();

  return 0;
}


しかし、状況によっては、この関数の代替方法が必要になる場合があります。以下に、いくつかの代替方法とその利点と欠点をご紹介します。

カスタムフォント選択ダイアログの作成

独自のフォント選択ダイアログを作成することで、QFontDialog::currentFont() 関数よりも柔軟な制御とカスタマイズが可能になります。この方法の利点は次のとおりです。

  • 追加の機能を追加できます (例: 最近使用したフォントのリスト)
  • 必要なフォントオプションのみを含めることができます。
  • ダイアログの外観と動作を完全に制御できます。

この方法の欠点は次のとおりです。

  • 複雑なロジックが必要になる場合があります。
  • コード量が増えます。


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

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

  QFont selectedFont() const { return m_fontComboBox->currentFont(); }

private:
  QFontComboBox *m_fontComboBox;
  QPushButton *m_okButton;
  QPushButton *m_cancelButton;

  void connectSignalsSlots();
};

FontDialog::FontDialog(QWidget *parent) : QDialog(parent) {
  m_fontComboBox = new QFontComboBox(this);
  m_okButton = new QPushButton("OK", this);
  m_cancelButton = new QPushButton("Cancel", this);

  connectSignalsSlots();

  // フォントリストを初期化
  for (const QFont &font : QFont::availableFonts()) {
    m_fontComboBox->addItem(font.family());
  }
}

void FontDialog::connectSignalsSlots() {
  connect(m_okButton, &QPushButton::clicked, this, &FontDialog::accept);
  connect(m_cancelButton, &QPushButton::clicked, this, &FontDialog::reject);
}

QFontDatabase クラスの使用

QFontDatabase クラスを使用すると、システムにインストールされているすべてのフォントにアクセスして、情報を取得することができます。この方法の利点は次のとおりです。

  • QFontDialog::currentFont() 関数よりも高速で効率的です。
  • コードが複雑になる場合があります。
  • ユーザーがフォントを選択することはできません。


#include <QtWidgets/QApplication>
#include <QFontDatabase>

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

  // フォントファミリを取得
  QString fontFamily = "Arial";

  // フォント情報を取得
  QFont font = QFontDatabase::font(fontFamily);

  // フォント情報を出力
  qDebug() << "Font family:" << font.family();
  qDebug() << "Font style:" << font.styleName();
  qDebug() << "Font size:" << font.pointSize();

  return 0;
}

プラットフォーム固有の API の使用

一部のプラットフォームでは、QFontDialog::currentFont() 関数よりも高度なフォント選択機能を提供するプラットフォーム固有の API が用意されています。この方法の利点は次のとおりです。

  • ユーザーにとってより直感的な操作を提供できます。
  • プラットフォーム固有の機能にアクセスできます。
  • すべてのプラットフォームで利用できるわけではありません。
  • プラットフォームによってコードが異なる場合があります。


Windows

#include <windows.h>

HFONT GetCurrentFont() {
  HDC hdc = GetDC(nullptr);
  HFONT hFont = GetCurrentObject(hdc, OBJ_FONT);
  ReleaseDC(nullptr, hdc);
  return hFont;
}
#include <Carbon/Carbon.h>

CFStringRef GetCurrentFontName() {
  ATSFontRef atsFont = ATSGetCurrentFont();
  CFStringRef fontName = CFStringCreateWithCString(kCFAllocatorDefault, ATSFontGetName(atsFont), kCFStringEncodingUTF8);
  return