Qtプログラミング入門: QColor::colorNames()で色の名前を使いこなす
QStringList QColor::colorNames()
とは
QColor::colorNames()
は、Qtフレームワークの QColor
クラスが提供する静的(static)関数です。この関数は、Qtが認識している全ての色の名前を QStringList
(文字列のリスト) として返します。
具体的には、以下のような名前が含まれます(一部抜粋):
- ... など
- "aquamarine"
- "aliceblue"
- "lightGray"
- "darkGray"
- "yellow"
- "green"
- "blue"
- "red"
- "black"
- "white"
これらの色の名前は、通常、SVG 1.0の色の名前やX11のカラーデータベース (rgb.txt) から取得されます。
使い方
この関数は静的関数なので、QColor
オブジェクトを作成する必要はありません。クラス名を使って直接呼び出すことができます。
#include <QColor>
#include <QStringList>
#include <QDebug> // デバッグ出力用
int main() {
// Qtが認識している色の名前のリストを取得
QStringList colorNames = QColor::colorNames();
// 取得した色の名前をすべて表示
qDebug() << "Qtが認識している色の名前:";
for (const QString &name : colorNames) {
qDebug() << name;
}
// 特定の色名をQColorオブジェクトに変換する例
if (colorNames.contains("blue")) {
QColor blueColor("blue");
qDebug() << "Blue color RGB:" << blueColor.red() << blueColor.green() << blueColor.blue();
}
return 0;
}
上記のコードを実行すると、Qtがサポートする多数の色の名前がコンソールに出力されます。
この関数の利点
- 移植性: Qtはプラットフォームに依存しないため、これらの色名はWindows、macOS、Linuxなど、どのOS上でも一貫して利用できます。
- 可読性の向上: RGB値や16進数コード (
#RRGGBB
) ではなく、"red" や "blue" のような人間が読める名前で色を指定したい場合に役立ちます。QColor
コンストラクタはこれらの名前を受け入れます。 - 利用可能な色名の確認: Qtアプリケーションでユーザーに色を選択させる際、Qtが標準でサポートしている色名をリストアップするのに便利です。
- 色の名前は文字列なので、スペルミスには注意が必要です。存在しない色名を
QColor
コンストラクタに渡した場合、QColor
オブジェクトは無効な状態になる可能性があります(QColor::isValid()
で確認できます)。 - 返されるリストは、Qtがデフォルトで認識している色名のみです。カスタムの色名や、特定のアプリケーションで定義された色名は含まれません。
QColor::colorNames()
自体は静的関数であり、特定の引数も取らないため、この関数を呼び出すこと自体でエラーが発生することは稀です。しかし、その返り値である QStringList
や、取得した色の名前を使って QColor
オブジェクトを生成する際に、いくつかの問題が発生する可能性があります。
色名のスペルミス、またはQtが認識しない色名を使用している
エラー/問題
QColor::colorNames()
で取得したリストに含まれていない色名(例: "lightgrey" の代わりに "lightgray" のようなスペルミス、または全くの架空の色名)を QColor
のコンストラクタに渡した場合、意図した色にならない、または QColor
オブジェクトが無効な状態になることがあります。
QColor myColor("nonExistentColor"); // 例: 存在しない色名
if (!myColor.isValid()) {
qDebug() << "エラー: 無効な色名が指定されました。";
}
トラブルシューティング
- RGB値を使用する
色の名前での指定にこだわらないのであれば、RGB値 (QColor(r, g, b)
) や16進数文字列 (QColor("#RRGGBB")
) で色を直接指定することで、この種の問題を回避できます。 - Qtのドキュメントを参照する
Qtの公式ドキュメントで、サポートされている色名の一覧を確認します。SVG 1.0の色の名前がベースになっていることが多いです。 - QColor::isValid() を使用する
QColor
オブジェクトを生成した後、isValid()
メソッドを呼び出して、色が有効に作成されたかを確認します。無効な場合は、指定した色名が誤っている可能性が高いです。 - QColor::colorNames() で確認する
実際に使用したい色名がQColor::colorNames()
で返されるリストに含まれているかを確認します。
大文字・小文字の問題
エラー/問題
QColor
の色名は通常、大文字・小文字を区別しませんが、システムやQtのバージョン、または他のライブラリとの連携によっては、大文字・小文字が問題になるケースが稀にあります。例えば、QColor("RED")
と QColor("red")
は通常同じ色になりますが、念のため注意が必要です。
トラブルシューティング
- 小文字に統一する
QColor::colorNames()
が返す色名はすべて小文字です。色名を使ってQColor
オブジェクトを生成する際も、小文字に統一することで一貫性を保ち、予期せぬ問題を避けることができます。QString::toLower()
を使用できます。
実行環境による色名の差異 (非常に稀)
エラー/問題
通常、QColor::colorNames()
が返すリストはQtが認識している標準的な色名であり、環境による大きな差異はありません。しかし、非常に特殊な組み込みシステムや、Qtの特定のビルド設定によっては、デフォルトの色名セットが異なる可能性もゼロではありません(これは極めて稀なケースです)。
トラブルシューティング
- Qtのビルド設定を確認する
もしカスタムビルドのQtを使用している場合、色名に関連するモジュールや設定が適切に含まれているかを確認します。 - デバッグ出力で確認する
実際に問題が発生している環境でQColor::colorNames()
の内容をデバッグ出力し、期待する色名が含まれているか確認します。
QStringList の操作に関する問題
エラー/問題
QColor::colorNames()
自体のエラーではありませんが、返された QStringList
を操作する際に、QStringList
の一般的な操作に関する問題が発生することがあります。例えば、存在しないインデックスにアクセスしたり、意図しないフィルタリングを行ったりする場合などです。
QStringList colorNames = QColor::colorNames();
// 例えば、リストのサイズを超えたインデックスにアクセスしようとする
if (colorNames.size() <= 1000) { // 例: 存在しないインデックス
qDebug() << colorNames[1000]; // クラッシュまたは不正なアクセス
}
トラブルシューティング
- イテレータやforeachループを使用する
範囲外アクセスを避けるために、Qtが推奨するforeachループやイテレータ (QList<T>::const_iterator
) を使用することをお勧めします。 - 範囲チェックを行う
QStringList
の要素にアクセスする前に、size()
やisEmpty()
メソッドを使用して範囲チェックを行います。
Qtモジュールの不足
エラー/問題
QColor
クラスは QtGui
モジュールに属しています。もし、プロジェクトファイル (.pro
ファイル) で QT += gui
が適切に設定されていない場合、コンパイル時に QColor
クラスが見つからないというエラーが発生します。
- .pro ファイルを確認する
プロジェクトの.pro
ファイルにQT += gui
が記述されていることを確認します。Qt Creatorを使用している場合は、通常自動的に追加されますが、手動でプロジェクトを設定した場合は確認が必要です。
例1: 全ての色名を取得して表示する
最も基本的な使用例です。Qtが認識している全ての色名をコンソールに出力します。
#include <QCoreApplication> // コンソールアプリケーションの場合
#include <QDebug> // デバッグ出力用
#include <QColor> // QColorクラス
#include <QStringList> // QStringListクラス
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // QApplicationでも可
// QColor::colorNames() を呼び出して、色の名前のリストを取得
QStringList colorNames = QColor::colorNames();
qDebug() << "Qtが認識している色の名前 (" << colorNames.size() << "個):";
// 取得したリストをループで回して、各色名を表示
for (const QString &name : colorNames) {
qDebug() << name;
}
return a.exec(); // QCoreApplication/QApplicationのイベントループを開始
}
説明
colorNames.size()
でリストに含まれる色の総数を表示しています。qDebug()
を使ってコンソールに出力しています。これは開発中に情報を確認するのに非常に便利です。- 返り値は
QStringList
型なので、QStringList
変数で受け取ります。 QColor::colorNames()
は静的関数なので、QColor
オブジェクトを作成せずに直接呼び出します。
例2: 色名を使って QColor
オブジェクトを生成し、そのRGB値を確認する
色名から QColor
オブジェクトを生成し、その色のRGB(赤、緑、青)成分を取得する方法を示します。
#include <QCoreApplication>
#include <QDebug>
#include <QColor>
#include <QStringList>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// いくつかの色名を選んで試す
QStringList testColorNames;
testColorNames << "red" << "blue" << "green" << "darkorange" << "nonexistentcolor";
qDebug() << "色名からQColorオブジェクトを生成してRGB値を確認:";
for (const QString &name : testColorNames) {
QColor color(name); // 色名からQColorオブジェクトを生成
if (color.isValid()) { // 色が有効に生成されたか確認
qDebug() << QString("%1: R=%2, G=%3, B=%4")
.arg(name)
.arg(color.red())
.arg(color.green())
.arg(color.blue());
} else {
qDebug() << QString("エラー: '%1' は認識されない色名です。").arg(name);
}
}
return a.exec();
}
説明
color.red()
,color.green()
,color.blue()
メソッドで、それぞれの色成分の0-255の整数値を取得できます。color.isValid()
が重要です。存在しない色名を渡した場合、QColor
オブジェクトは無効な状態になります。これを確認することで、エラーハンドリングを行うことができます。QColor color(name);
のように、QColor
のコンストラクタに色名を渡すことでオブジェクトを初期化できます。
例3: QComboBox
に色名を表示し、選択された色で何かを行う (GUIアプリケーションの場合)
GUIアプリケーションで QColor::colorNames()
をどのように活用できるかの例です。ここでは QComboBox
(ドロップダウンリスト) に色名を表示し、ユーザーが選択した色に応じて背景色を変更するシナリオを想定します。
必要なモジュール
QT += widgets
を.pro
ファイルに追加してください。
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QComboBox>
#include <QLabel>
#include <QColor>
#include <QStringList>
#include <QPalette> // 色の設定用
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget window;
window.setWindowTitle("色選択デモ");
window.resize(300, 200);
QVBoxLayout *layout = new QVBoxLayout(&window);
QLabel *label = new QLabel("色を選択してください:");
layout->addWidget(label);
QComboBox *colorComboBox = new QComboBox();
// QColor::colorNames() で取得した色名をコンボボックスに追加
colorComboBox->addItems(QColor::colorNames());
layout->addWidget(colorComboBox);
// 色表示用のラベル
QLabel *colorDisplayLabel = new QLabel("選択された色:");
colorDisplayLabel->setFixedSize(150, 50); // サイズを固定
colorDisplayLabel->setAlignment(Qt::AlignCenter); // 中央揃え
layout->addWidget(colorDisplayLabel);
// 初期表示の色を設定
// QPalette を使って背景色を変更
QColor initialColor(colorComboBox->currentText());
if (initialColor.isValid()) {
QPalette palette = colorDisplayLabel->palette();
palette.setColor(QPalette::Background, initialColor);
colorDisplayLabel->setAutoFillBackground(true); // 背景色を自動で塗りつぶす設定
colorDisplayLabel->setPalette(palette);
}
// コンボボックスの選択が変更されたときの処理
QObject::connect(colorComboBox, QOverload<const QString &>::of(&QComboBox::currentIndexChanged),
[&](const QString &colorName) {
QColor selectedColor(colorName);
if (selectedColor.isValid()) {
QPalette palette = colorDisplayLabel->palette();
palette.setColor(QPalette::Background, selectedColor);
colorDisplayLabel->setPalette(palette);
// 文字色を背景色に応じて自動調整(明るい背景なら文字は黒、暗い背景なら文字は白)
if (selectedColor.lightnessF() > 0.5) { // 明度が高い場合
palette.setColor(QPalette::WindowText, Qt::black);
} else { // 明度が低い場合
palette.setColor(QPalette::WindowText, Qt::white);
}
colorDisplayLabel->setPalette(palette);
colorDisplayLabel->setText(colorName); // 選択された色名を表示
} else {
// 無効な色が選択された場合の処理(この例では発生しないはず)
qDebug() << "無効な色名が選択されました:" << colorName;
}
});
window.show();
return a.exec();
}
selectedColor.lightnessF()
は色の明るさを示す浮動小数点値(0.0~1.0)を返します。これを使って、背景色に応じて文字色を自動的に黒または白に切り替える工夫をしています。QPalette
を使用して、ウィジェットの背景色や文字色を変更しています。QObject::connect
を使用して、コンボボックスの選択が変更されたときに特定の処理(ラムダ関数)が実行されるように設定しています。colorComboBox->addItems(QColor::colorNames());
の一行で、QColor::colorNames()
が返すQStringList
をそのままQComboBox
のアイテムとして追加しています。
RGB (Red, Green, Blue) 値で色を指定する
最も一般的で柔軟性の高い方法です。色の三原色である赤、緑、青の成分をそれぞれ0〜255の範囲で指定します。アルファ値(透明度)も指定できます。
特徴
- 標準的
多くの画像編集ソフトウェアやウェブデザインで使われる最も一般的な色の表現方法です。 - 正確な色指定
特定のRGB値が分かっている場合に非常に便利です。 - 広範な表現力
約1670万色(256^3)を表現でき、アルファ値を含めるとさらに多くの組み合わせが可能です。
コード例
#include <QColor>
#include <QDebug>
int main() {
// RGB値で色を生成 (不透明)
QColor redColor(255, 0, 0); // 純粋な赤
QColor customGreen(0, 150, 0); // 少し暗い緑
qDebug() << "Red (RGB):" << redColor.red() << redColor.green() << redColor.blue();
qDebug() << "Custom Green (RGB):" << customGreen.red() << customGreen.green() << customGreen.blue();
// RGB値とアルファ値 (透明度) で色を生成
// アルファ値は0(完全透明)から255(完全不透明)まで
QColor semiTransparentBlue(0, 0, 255, 127); // 半透明の青
qDebug() << "Semi-transparent Blue (RGBA):" << semiTransparentBlue.red()
<< semiTransparentBlue.green() << semiTransparentBlue.blue()
<< semiTransparentBlue.alpha();
// 静的ファクトリ関数 `fromRgb()` も利用可能
QColor anotherRed = QColor::fromRgb(255, 0, 0);
QColor anotherSemiTransparentBlue = QColor::fromRgb(0, 0, 255, 127);
return 0;
}
16進数文字列で色を指定する
ウェブ開発でよく使われる形式です。"#RRGGBB"
や "#AARRGGBB"
の形式で色を文字列で指定します。#
は必須です。
特徴
- ウェブとの親和性
CSSやHTMLでの色の指定方法と互換性があります。 - コンパクト
RGB値を覚える代わりに、短い文字列で表現できます。
コード例
#include <QColor>
#include <QDebug>
int main() {
// 16進数文字列で色を生成 (RRGGBB形式)
QColor hexRed("#FF0000"); // 純粋な赤
QColor hexPurple("#800080"); // 紫
qDebug() << "Hex Red:" << hexRed.name(); // .name()は#RRGGBB形式の文字列を返す
// 16進数文字列で色を生成 (AARRGGBB形式 - アルファ値も含む)
QColor semiTransparentGreen("#8000FF00"); // 半透明の緑 (A=80, R=00, G=FF, B=00)
qDebug() << "Semi-transparent Green (ARGB):" << semiTransparentGreen.name(QColor::HexArgb); // QColor::HexArgbでARGB形式に
// `QColor::isValid()` で有効性を確認
QColor invalidHex("#XYZXYZ"); // 無効な16進数
if (!invalidHex.isValid()) {
qDebug() << "無効な16進数文字列です。";
}
return 0;
}
HSV (Hue, Saturation, Value) 値で色を指定する
色相、彩度、明度で色を表現する方法です。人間の色の認識に近い感覚で色を調整できます。
特徴
- 色調整に便利
例えば、同じ色相で彩度や明度だけを変えたバリエーションを作成するのに適しています。 - 直感的
色のバリエーション(色相)、鮮やかさ(彩度)、明るさ(明度)を個別に調整しやすいです。
コード例
#include <QColor>
#include <QDebug>
int main() {
// HSV値で色を生成 (色相H:0-359, 彩度S:0-255, 明度V:0-255)
QColor hsvRed = QColor::fromHsv(0, 255, 255); // 純粋な赤
QColor pastelBlue = QColor::fromHsv(240, 100, 200); // パステル調の青
qDebug() << "HSV Red (R,G,B):" << hsvRed.red() << hsvRed.green() << hsvRed.blue();
qDebug() << "Pastel Blue (H,S,V):" << pastelBlue.hue() << pastelBlue.saturation() << pastelBlue.value();
// 浮動小数点数バージョン (`fromHsvF`) もあります (H:0.0-359.0, S:0.0-1.0, V:0.0-1.0)
QColor fromHsvFRed = QColor::fromHsvF(0.0, 1.0, 1.0);
qDebug() << "From HsvF Red (R,G,B):" << fromHsvFRed.red() << fromHsvFRed.green() << fromHsvFRed.blue();
return 0;
}
HSL (Hue, Saturation, Lightness) 値で色を指定する
HSVと似ていますが、明度の代わりに「明るさ (Lightness)」を使用します。
特徴
- より直感的(一部の人にとって)
特にデザイナーにとって、HSVのValueよりもHSLのLightnessの方が明るさの調整が自然に感じる場合があります。
コード例
#include <QColor>
#include <QDebug>
int main() {
// HSL値で色を生成 (色相H:0-359, 彩度S:0-255, 明度L:0-255)
QColor hslGreen = QColor::fromHsl(120, 255, 127); // 緑色
QColor lightGray = QColor::fromHsl(0, 0, 200); // 明るい灰色 (彩度が0の場合、色相は意味を持たない)
qDebug() << "HSL Green (R,G,B):" << hslGreen.red() << hslGreen.green() << hslGreen.blue();
qDebug() << "Light Gray (H,S,L):" << lightGray.hue() << lightGray.saturation() << lightGray.lightness();
return 0;
}
CMYK (Cyan, Magenta, Yellow, Black) 値で色を指定する
印刷業界で使われる減法混色モデルです。
特徴
- 印刷向け
印刷用のアプリケーションで色を扱う場合に適しています。
コード例
#include <QColor>
#include <QDebug>
int main() {
// CMYK値で色を生成 (シアンC, マゼンタM, イエローY, ブラックK: 各0-255)
QColor cmykBlue = QColor::fromCmyk(255, 255, 0, 0); // 純粋な青 (C+M = 青)
QColor printBlack = QColor::fromCmyk(0, 0, 0, 255); // 純粋な黒
qDebug() << "CMYK Blue (R,G,B):" << cmykBlue.red() << cmykBlue.green() << cmykBlue.blue();
qDebug() << "Print Black (C,M,Y,K):" << printBlack.cyan() << printBlack.magenta()
<< printBlack.yellow() << printBlack.black();
return 0;
}
Qt::GlobalColor 列挙型を使用する
Qtは Qt
名前空間内に、よく使われる基本的な色を定義した GlobalColor
列挙型を提供しています。これらは QColor::colorNames()
で返される名前の一部に対応しています。
特徴
- 限定的
定義されている色数が限られています。 - 手軽さ
最も手軽に色を指定できる方法です。
コード例
#include <QColor>
#include <QDebug>
#include <QtGlobal> // Qt::GlobalColor のために必要
int main() {
QColor blue = Qt::blue;
QColor green = Qt::green;
QColor darkRed = Qt::darkRed; // 暗い赤
qDebug() << "Qt::blue (RGB):" << blue.red() << blue.green() << blue.blue();
qDebug() << "Qt::darkRed (RGB):" << darkRed.red() << darkRed.green() << darkRed.blue();
return 0;
}
QStringList QColor::colorNames()
は、Qtが知っている「名前付きの色」のリストが必要な場合に非常に有用ですが、プログラム内で色を定義したり、動的に色を生成したりする場合には、上記の代替方法がより一般的で強力です。
- 印刷向けに色を扱いたい
CMYK値 - 人間の感覚に近い色調整を行いたい、バリエーションを作りたい
HSV/HSL値 - 正確な色、または多様な色を表現したい
RGB値(整数または16進数文字列) - 手軽に基本的な色を使いたい
Qt::GlobalColor