QColor::setHsv()だけじゃない!Qtでの多様な色設定メソッドを比較解説

2025-05-27

QColor::setHsv() は、QtのQColorクラスが提供するメソッドで、色の値をHSV(Hue, Saturation, Value)モデルに基づいて設定するために使用されます。これにより、色の色相、彩度、明度をそれぞれ指定して色を定義できます。

HSVカラーモデルについて

HSVモデルは、人間が色を認識する方法に比較的近いとされるカラーモデルです。

  • V (Value: 明度/輝度): 色の明るさを表します。0から255までの範囲の整数で指定します。
    • 0は常に黒を表します。
    • 255に近いほど色が明るくなります。
  • S (Saturation: 彩度): 色の鮮やかさ、純度を表します。0から255までの範囲の整数で指定します。
    • 0に近いほど色が薄くなり、グレーに近づきます。
    • 255に近いほど色が鮮やかで純粋になります。
  • H (Hue: 色相): 色の種類を表します。色相環の角度で表現され、通常は0から359までの範囲の整数で指定します。
    • 赤は0度、緑は120度、青は240度といったように、色相環上で色が配置されています。
    • 無彩色(グレー)の場合、色相は意味を持たないため、慣例的に-1が使われることがあります。

メソッドのシグネチャ

QColor::setHsv()の主なシグネチャは以下の通りです。

void setHsv(int h, int s, int v, int a = 255)
  • a: アルファ値 (Alpha)。オプション。色の不透明度を表し、0(完全に透明)から255(完全に不透明)までの整数。デフォルトは255。
  • v: 明度 (Value)。0から255までの整数。
  • s: 彩度 (Saturation)。0から255までの整数。
  • h: 色相 (Hue)。0から359までの整数。無彩色(グレー)の場合は-1。

また、浮動小数点数を使用するオーバーロードも存在します。

void setHsvF(qreal h, qreal s, qreal v, qreal a = 1.0)
  • a: アルファ値 (Alpha)。オプション。0.0(完全に透明)から1.0(完全に不透明)までの浮動小数点数。デフォルトは1.0。
  • v: 明度 (Value)。0.0から1.0までの浮動小数点数。
  • s: 彩度 (Saturation)。0.0から1.0までの浮動小数点数。
  • h: 色相 (Hue)。0.0から359.0までの浮動小数点数。

使用例

HSV値を使ってQColorオブジェクトの色を設定する例を以下に示します。

#include <QColor>
#include <QDebug> // デバッグ出力用

int main() {
    QColor color;

    // 純粋な赤を設定 (Hue: 0, Saturation: 255, Value: 255)
    color.setHsv(0, 255, 255);
    qDebug() << "Pure Red (HSV):" << color.hue() << color.saturation() << color.value();
    qDebug() << "Pure Red (RGB):" << color.red() << color.green() << color.blue();

    // 暗めの青緑を設定 (Hue: 160, Saturation: 200, Value: 150)
    color.setHsv(160, 200, 150);
    qDebug() << "Dark Cyan-Green (HSV):" << color.hue() << color.saturation() << color.value();
    qDebug() << "Dark Cyan-Green (RGB):" << color.red() << color.green() << color.blue();

    // 半透明の灰色を設定 (Hue: -1 (無彩色), Saturation: 0, Value: 128, Alpha: 128)
    color.setHsv(-1, 0, 128, 128);
    qDebug() << "Semi-Transparent Gray (HSV):" << color.hue() << color.saturation() << color.value() << color.alpha();
    qDebug() << "Semi-Transparent Gray (RGB):" << color.red() << color.green() << color.blue() << color.alpha();

    // 浮動小数点数バージョンを使用
    color.setHsvF(60.0, 0.8, 0.9, 0.75); // 黄色に近い色で半透明
    qDebug() << "Float Yellow (HSV):" << color.hueF() << color.saturationF() << color.valueF() << color.alphaF();
    qDebug() << "Float Yellow (RGB):" << color.redF() << color.greenF() << color.blueF() << color.alphaF();

    return 0;
}

setHsv()の利点

  • 色のバリエーション生成: 特定の色相を保ちつつ、彩度や明度だけを変更して色の濃淡や明暗のバリエーションを簡単に生成できます。例えば、ある赤の色相を固定し、彩度を下げてくすんだ赤にしたり、明度を上げて明るい赤にしたりすることが容易です。
  • 直感的な色指定: 人間が色を認識する仕組みに近いHSVモデルを使用することで、色の種類(色相)、鮮やかさ(彩度)、明るさ(明度)をより直感的にコントロールできます。RGBモデル(赤、緑、青の光の混合)よりも、色の調整がしやすい場合があります。

注意点

  • RGBとの変換: QColorは内部的にRGB値を保持しています。setHsv()で値を設定しても、内部的にはRGB値に変換されます。HSV値を取得する際にはhue(), saturation(), value()などのメソッドを使用しますが、元のHSV値と完全に一致しない場合(特に浮動小数点数精度の場合)があります。
  • 引数の範囲: 各引数(h, s, v, a)の範囲に注意してください。範囲外の値を設定した場合、Qtが内部的に値をクリッピングするか、予期しない結果になる可能性があります。


QColor::setHsv()の一般的なエラーとトラブルシューティング

QColor::setHsv()自体は比較的単純なメソッドですが、使い方や期待される色の結果に関連していくつかの一般的な問題が発生する可能性があります。

引数の範囲外の値

最も一般的なエラーの一つは、setHsv()に渡す引数の値が適切な範囲外である場合です。

  • トラブルシューティング:

    • 引数のチェック: setHsv()を呼び出す前に、各引数の値が指定された範囲内にあることを必ず確認してください。特に、ユーザーからの入力や計算結果を直接渡す場合は、範囲チェックとクランプ(値が範囲外の場合に最小値または最大値に丸める)処理を追加することを検討してください。
    • デバッグ出力: qDebug()を使用して、setHsv()を呼び出す直前の引数の値、および呼び出し後のQColorオブジェクトのhue(), saturation(), value(), alpha(), red(), green(), blue()などの値をすべて出力し、期待通りになっているかを確認します。
    int h = 370; // 範囲外の例
    int s = 300; // 範囲外の例
    int v = -10; // 範囲外の例
    int a = 200;
    
    // クランプ処理の例
    h = qBound(0, h, 359); // Qt 5.x 以降では qBound は非推奨。std::clamp を使う
    s = qBound(0, s, 255);
    v = qBound(0, v, 255);
    a = qBound(0, a, 255);
    
    QColor color;
    color.setHsv(h, s, v, a);
    qDebug() << "Set HSV:" << h << s << v << a;
    qDebug() << "Actual HSV:" << color.hue() << color.saturation() << color.value() << color.alpha();
    
  • 原因:

    • Hue (色相): 0~359の範囲外の値を指定した。-1は無彩色を表す特殊な値として許可されています。
    • Saturation (彩度): 0~255の範囲外の値を指定した(整数版の場合)。setHsvF()では0.0~1.0。
    • Value (明度): 0~255の範囲外の値を指定した(整数版の場合)。setHsvF()では0.0~1.0。
    • Alpha (アルファ): 0~255の範囲外の値を指定した(整数版の場合)。setHsvF()では0.0~1.0。
  • エラーの症状:

    • 期待通りの色にならない。
    • 色が極端に明るい/暗い、または全く色がない(グレー)になる。
    • デバッグ出力でQColorの各コンポーネントを確認すると、設定した値と異なる値になっていることがある(Qtが内部でクリッピングするため)。

HSVとRGBの概念の混同

HSVとRGBは異なるカラーモデルであり、それぞれのパラメータが意味するものが異なります。この混同が原因で、期待通りの色にならないことがあります。

  • トラブルシューティング:

    • カラーモデルの理解: HSVカラーモデルの概念(色相、彩度、明度)をしっかりと理解することが重要です。
      • Hue: 純粋な色(赤、緑、青など)の位置。
      • Saturation: その色の鮮やかさ。0で無彩色(グレー)、255で最も鮮やか。
      • Value: その色の明るさ。0で黒、255で最も明るい。
    • オンラインツール: オンラインのHSV-RGB変換ツールやカラーピッカーを使用して、HSV値とそれに対応するRGB値を比較し、感覚をつかむ練習をすると良いでしょう。
  • 原因:

    • HSVとRGBの各コンポーネントの役割を十分に理解していない。
    • 特に、彩度(Saturation)と明度(Value)は、RGBの各成分(赤、緑、青)とは直接的に対応しません。
  • エラーの症状:

    • 「赤のHSVは(255,0,0)だと思ったのに違う」といった誤解。
    • RGBで表現したい色を、誤ってHSVパラメータに直接当てはめてしまう。

浮動小数点数と整数の混同 (setHsv() と setHsvF())

QColorには整数版のsetHsv()と浮動小数点数版のsetHsvF()があります。これらを誤って使用すると、値の解釈が異なり、意図しない色になります。

  • トラブルシューティング:

    • メソッド名の確認: 常に使用するメソッドがsetHsvsetHsvFかを確認し、それに合わせて引数の型と範囲を調整してください。
    • qrealの使用: 浮動小数点数版を使用する場合、qreal型(通常はdoubleのtypedef)を使用するように徹底すると、可読性が向上し、型変換ミスを減らせます。
  • 原因:

    • メソッド名の違い (setHsv vs setHsvF) を意識していない。
    • 各引数の期待される型と範囲を理解していない。
  • エラーの症状:

    • setHsvF(1.0, 0.5, 0.5)のように、整数版のメソッドに浮動小数点数を渡そうとする(コンパイルエラーになるか、暗黙の型変換で意図しない値になる)。
    • setHsv(100, 0.8, 0.5)のように、浮動小数点数版のメソッドに整数を渡そうとする(同様にコンパイルエラーか意図しない変換)。

無彩色 (グレー) の表現

HSVで無彩色(グレー)を表現する場合、色相(Hue)の値が特殊な扱いになります。

  • トラブルシューティング:

    • 無彩色には-1: 完全に無彩色(グレー)にしたい場合は、setHsv( -1, 0, value, alpha)のように、色相(h)に-1を指定し、彩度(s)を0に設定してください。
    • 黒の表現: 真っ黒にしたい場合は、明度(v)を0に設定します。この場合、色相や彩度は無視されます。例: setHsv(0, 0, 0) または setHsv(-1, 0, 0)
  • 原因:

    • setHsv()h引数に-1を設定していない。彩度を0に設定すると色相は意味をなさなくなりますが、Qtの内部処理ではhの値が何らかの形で影響を与える可能性があります。
    • 明度(Value)が0でないのに真っ黒を期待している。
  • エラーの症状:

    • 彩度(Saturation)を0に設定しても、何となく色が残っているように見える。
    • 完全に真っ黒にならない。

QColorの初期化と使用

QColorオブジェクトが正しく初期化されていない状態でsetHsv()を呼び出すことは稀ですが、無効なQColorオブジェクトを扱うと問題が発生する可能性があります。

  • トラブルシューティング:

    • isValid()の確認: 色を設定した後、QColor::isValid()を呼び出して、色が有効であるかを確認する習慣をつけると良いでしょう。
    • 適切な初期化: QColorオブジェクトは、デフォルトコンストラクタで作成すると、黒(#000000)で初期化され、有効な色となります。その後、setHsv()で目的の色に設定します。
  • 原因:

    • 例えば、無効な文字列をQColor::setNamedColor()に渡した後に、その無効なQColorオブジェクトに対してsetHsv()を呼び出そうとするなど、前の操作で色が正しく設定されていない場合。
  • エラーの症状:

    • QColor::isValid()falseを返す。
    • 描画時に色が適用されない、またはデフォルトの色(黒)が使われる。
  • デバッガの活用: IDEのデバッガを使用して、プログラムの実行中にQColorオブジェクトの各コンポーネントの値を確認することは、問題を特定する上で非常に有効です。
  • Qtドキュメントの参照: QColorクラスのリファレンスドキュメントは非常に詳細で、各メソッドの引数の範囲や挙動が明確に記述されています。疑問に思ったら、まず公式ドキュメントを参照してください。
  • 最小限の再現コード: 問題が発生した場合、その問題を再現できる最小限のコードスニペットを作成してみてください。これにより、問題の原因を特定しやすくなります。


例1: 基本的なHSV色の設定とRGB値の確認

この例では、異なるHSV値を持つ色を作成し、それがどのようにRGB値に変換されるかを確認します。

#include <QCoreApplication>
#include <QColor>
#include <QDebug> // デバッグ出力用

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 1. 純粋な赤 (Hue: 0, Saturation: 255, Value: 255)
    QColor pureRed;
    pureRed.setHsv(0, 255, 255);
    qDebug() << "--- Pure Red ---";
    qDebug() << "HSV: H=" << pureRed.hue() << "S=" << pureRed.saturation() << "V=" << pureRed.value() << "A=" << pureRed.alpha();
    qDebug() << "RGB: R=" << pureRed.red() << "G=" << pureRed.green() << "B=" << pureRed.blue() << "A=" << pureRed.alpha();
    // 期待されるRGB: R=255, G=0, B=0

    // 2. 暗めの青 (Hue: 240, Saturation: 255, Value: 128)
    QColor darkBlue;
    darkBlue.setHsv(240, 255, 128);
    qDebug() << "\n--- Dark Blue ---";
    qDebug() << "HSV: H=" << darkBlue.hue() << "S=" << darkBlue.saturation() << "V=" << darkBlue.value() << "A=" << darkBlue.alpha();
    qDebug() << "RGB: R=" << darkBlue.red() << "G=" << darkBlue.green() << "B=" << darkBlue.blue() << "A=" << darkBlue.alpha();
    // 期待されるRGB: R=0, G=0, B=128

    // 3. 明るい緑 (Hue: 120, Saturation: 150, Value: 255) - 彩度を少し落とす
    QColor lightGreen;
    lightGreen.setHsv(120, 150, 255);
    qDebug() << "\n--- Light Green ---";
    qDebug() << "HSV: H=" << lightGreen.hue() << "S=" << lightGreen.saturation() << "V=" << lightGreen.value() << "A=" << lightGreen.alpha();
    qDebug() << "RGB: R=" << lightGreen.red() << "G=" << lightGreen.green() << "B=" << lightGreen.blue() << "A=" << lightGreen.alpha();
    // 期待されるRGB: R=102 (約), G=255, B=102 (約)

    // 4. 無彩色 (灰色) - Hueを-1、Saturationを0に設定
    QColor grayColor;
    grayColor.setHsv(-1, 0, 128); // 明度128の灰色
    qDebug() << "\n--- Gray Color ---";
    qDebug() << "HSV: H=" << grayColor.hue() << "S=" << grayColor.saturation() << "V=" << grayColor.value() << "A=" << grayColor.alpha();
    qDebug() << "RGB: R=" << grayColor.red() << "G=" << grayColor.green() << "B=" << grayColor.blue() << "A=" << grayColor.alpha();
    // 期待されるRGB: R=128, G=128, B=128

    // 5. 透明度付きの赤 (Alpha: 128)
    QColor semiTransparentRed;
    semiTransparentRed.setHsv(0, 255, 255, 128);
    qDebug() << "\n--- Semi-Transparent Red ---";
    qDebug() << "HSV: H=" << semiTransparentRed.hue() << "S=" << semiTransparentRed.saturation() << "V=" << semiTransparentRed.value() << "A=" << semiTransparentRed.alpha();
    qDebug() << "RGB: R=" << semiTransparentRed.red() << "G=" << semiTransparentRed.green() << "B=" << semiTransparentRed.blue() << "A=" << semiTransparentRed.alpha();

    return a.exec();
}

解説: この例では、setHsv(h, s, v, a)メソッドを使って、様々な色のHSV値を設定し、その後hue(), saturation(), value(), alpha(), red(), green(), blue()といったゲッターメソッドでその値を確認しています。特に、HSVとRGBの間で値がどのように変換されるか、また無彩色の場合のHueの特殊な値(-1)に注目してください。

例2: setHsvF() (浮動小数点数) を使った色の設定

setHsvF()は浮動小数点数で色を定義する場合に便利です。各コンポーネントが0.0から1.0(Hueは0.0から359.0)の範囲になります。

#include <QCoreApplication>
#include <QColor>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 1. 純粋なシアン (Hue: 180.0, Saturation: 1.0, Value: 1.0)
    QColor pureCyan;
    pureCyan.setHsvF(180.0, 1.0, 1.0);
    qDebug() << "--- Pure Cyan (Float) ---";
    qDebug() << "HSV: H=" << pureCyan.hueF() << "S=" << pureCyan.saturationF() << "V=" << pureCyan.cyanF() << "A=" << pureCyan.alphaF();
    qDebug() << "RGB: R=" << pureCyan.redF() << "G=" << pureCyan.greenF() << "B=" << pureCyan.blueF() << "A=" << pureCyan.alphaF();

    // 2. 薄いオレンジ (Hue: 30.0, Saturation: 0.5, Value: 0.9)
    QColor lightOrange;
    lightOrange.setHsvF(30.0, 0.5, 0.9);
    qDebug() << "\n--- Light Orange (Float) ---";
    qDebug() << "HSV: H=" << lightOrange.hueF() << "S=" << lightOrange.saturationF() << "V=" << lightOrange.valueF() << "A=" << lightOrange.alphaF();
    qDebug() << "RGB: R=" << lightOrange.redF() << "G=" << lightOrange.greenF() << "B=" << lightOrange.blueF() << "A=" << lightOrange.alphaF();

    // 3. 半透明の暗い紫 (Hue: 280.0, Saturation: 0.7, Value: 0.4, Alpha: 0.6)
    QColor semiTransparentDarkPurple;
    semiTransparentDarkPurple.setHsvF(280.0, 0.7, 0.4, 0.6);
    qDebug() << "\n--- Semi-Transparent Dark Purple (Float) ---";
    qDebug() << "HSV: H=" << semiTransparentDarkPurple.hueF() << "S=" << semiTransparentDarkPurple.saturationF() << "V=" << semiTransparentDarkPurple.valueF() << "A=" << semiTransparentDarkPurple.alphaF();
    qDebug() << "RGB: R=" << semiTransparentDarkPurple.redF() << "G=" << semiTransparentDarkPurple.greenF() << "B=" << semiTransparentDarkPurple.blueF() << "A=" << semiTransparentDarkPurple.alphaF();

    return a.exec();
}

解説: setHsvF()は、QColorの各成分をqreal型(通常はdouble)で設定する際に使用します。これは、より細かい色の調整が必要な場合や、計算結果が浮動小数点数になる場合(例えばカラーピッカーのスライダー値から変換する場合)に便利です。

例3: UI要素(QLabel)の背景色を変更する

この例では、Qt WidgetsアプリケーションでQColor::setHsv()を使ってQLabelの背景色を変更する方法を示します。

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QSlider>
#include <QDebug>

class ColorPickerWidget : public QWidget {
    Q_OBJECT // シグナルとスロットを使用するために必要

public:
    ColorPickerWidget(QWidget *parent = nullptr) : QWidget(parent) {
        setWindowTitle("HSV Color Picker");

        // UI要素の作成
        colorLabel = new QLabel("このラベルの色が変わります", this);
        colorLabel->setAlignment(Qt::AlignCenter);
        colorLabel->setFixedSize(200, 100); // ラベルのサイズを固定

        hueSlider = new QSlider(Qt::Horizontal, this);
        hueSlider->setRange(0, 359); // Hueの範囲
        hueSlider->setValue(0);
        hueSlider->setToolTip("色相 (Hue)");

        saturationSlider = new QSlider(Qt::Horizontal, this);
        saturationSlider->setRange(0, 255); // Saturationの範囲
        saturationSlider->setValue(255);
        saturationSlider->setToolTip("彩度 (Saturation)");

        valueSlider = new QSlider(Qt::Horizontal, this);
        valueSlider->setRange(0, 255); // Valueの範囲
        valueSlider->setValue(255);
        valueSlider->setToolTip("明度 (Value)");

        // レイアウトの設定
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(colorLabel);
        layout->addWidget(new QLabel("Hue (0-359):", this));
        layout->addWidget(hueSlider);
        layout->addWidget(new QLabel("Saturation (0-255):", this));
        layout->addWidget(saturationSlider);
        layout->addWidget(new QLabel("Value (0-255):", this));
        layout->addWidget(valueSlider);

        // スライダーの値が変更されたら色を更新
        connect(hueSlider, &QSlider::valueChanged, this, &ColorPickerWidget::updateColor);
        connect(saturationSlider, &QSlider::valueChanged, this, &ColorPickerWidget::updateColor);
        connect(valueSlider, &QSlider::valueChanged, this, &ColorPickerWidget::updateColor);

        // 初期色の設定
        updateColor();
    }

private slots:
    void updateColor() {
        int h = hueSlider->value();
        int s = saturationSlider->value();
        int v = valueSlider->value();

        QColor currentColor;
        currentColor.setHsv(h, s, v);

        // ラベルの背景色を更新
        // QPaletteを使用して背景色を設定するのが一般的
        QPalette palette = colorLabel->palette();
        palette.setColor(QPalette::Window, currentColor); // Windowロールで背景色を設定
        colorLabel->setAutoFillBackground(true); // 自動で背景を描画するように設定
        colorLabel->setPalette(palette);

        qDebug() << "Current HSV:" << h << s << v << " -> RGB:" << currentColor.red() << currentColor.green() << currentColor.blue();
    }

private:
    QLabel *colorLabel;
    QSlider *hueSlider;
    QSlider *saturationSlider;
    QSlider *valueSlider;
};

#include "main.moc" // mocファイルを含める

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

    ColorPickerWidget widget;
    widget.show();

    return a.exec();
}

解説: このより実践的な例では、Qt Widgetsを使用してシンプルなHSVカラーピッカーを作成しています。

  1. UI要素: QLabelが現在の色を表示し、3つのQSliderがそれぞれHue、Saturation、Valueを制御します。
  2. スロットとシグナル: 各スライダーのvalueChanged()シグナルがupdateColor()スロットに接続されています。
  3. updateColor()メソッド:
    • スライダーの現在の値を取得します。
    • QColor currentColor; を作成し、currentColor.setHsv(h, s, v); で色を設定します。
    • QPaletteを使用してQLabelの背景色を新しく設定したcurrentColorに更新します。colorLabel->setAutoFillBackground(true);を呼び出して、ラベルがその背景を自動的に塗りつぶすようにすることも重要です。
    • qDebug()で現在のHSV値と対応するRGB値を出力し、デバッグに役立てています。

この例をコンパイルして実行すると、スライダーを動かすことでQLabelの背景色がリアルタイムに変化し、HSVモデルを使って直感的に色を調整できることが体験できます。



QColor::setHsv()の代替メソッド

QColorクラスは、様々なカラーモデルや形式で色を表現・設定するための豊富なメソッドを提供しています。

RGB (Red, Green, Blue) モデルによる設定

最も一般的で基本的な色の指定方法です。赤、緑、青の3つの原色の光の合成で色を表現します。

  • 静的ファクトリ関数

    • QColor::fromRgb(int r, int g, int b, int a = 255)
    • QColor::fromRgbF(qreal r, qreal g, qreal b, qreal a = 1.0)
    • QColor::fromRgb(QRgb rgb)
    • これらの関数は、指定されたRGB値から新しいQColorオブジェクトを生成して返します。
    • 例: QColor green = QColor::fromRgb(0, 255, 0);
  • void QColor::setRgb(QRgb rgb) / void QColor::setRgba(QRgb rgba)

    • QRgb型(unsigned intのtypedef)は、色の各成分(通常はAARRGGBB形式)を単一の整数で表現します。
    • qRgb()qRgba()といったヘルパー関数を使ってQRgb値を作成できます。
    • 例: QColor color; color.setRgb(qRgb(255, 128, 0)); // オレンジ
    • 例: QColor transparentRed; transparentRed.setRgba(qRgba(255, 0, 0, 128)); // 半透明の赤
  • コンストラクタによる初期化

    • QColorオブジェクトをRGB値で直接初期化できます。
    • 例: QColor red(255, 0, 0);
    • 浮動小数点数版: QColor blue(0.0f, 0.0f, 1.0f);
  • void QColor::setRgbF(qreal r, qreal g, qreal b, qreal a = 1.0)

    • 浮動小数点数版で、各成分を0.0~1.0のqreal型(通常はdouble)で指定します。
    • 例: QColor color; color.setRgbF(1.0, 0.0, 0.0); // 純粋な赤
    • 赤 (r), 緑 (g), 青 (b) の各成分を0~255の整数で指定します。
    • オプションでアルファ値 (a) も0~255で指定できます(デフォルトは255で完全に不透明)。
    • 例: QColor color; color.setRgb(255, 0, 0); // 純粋な赤

HSL (Hue, Saturation, Lightness) モデルによる設定

HSVモデルと似ていますが、Value(明度)の代わりにLightness(輝度/明るさ)を使用します。Lightnessは0で黒、0.5で純色、1で白になります。

  • 静的ファクトリ関数

    • QColor::fromHsl(int h, int s, int l, int a = 255)
    • QColor::fromHslF(qreal h, qreal s, qreal l, qreal a = 1.0)
    • 例: QColor yellow = QColor::fromHsl(60, 255, 128);
  • void QColor::setHslF(qreal h, qreal s, qreal l, qreal a = 1.0)

    • 浮動小数点数版。Hueは0.0~359.0、SaturationとLightnessは0.0~1.0。
    • 例: QColor color; color.setHslF(120.0, 1.0, 0.5); // 純粋な緑
  • void QColor::setHsl(int h, int s, int l, int a = 255)

    • 色相 (h): 0~359。無彩色の場合-1
    • 彩度 (s): 0~255。
    • 輝度 (l): 0~255。
    • アルファ (a): 0~255。
    • 例: QColor color; color.setHsl(0, 255, 128); // 中間の明るさの赤

CMYK (Cyan, Magenta, Yellow, Key/Black) モデルによる設定

主に印刷業界で使用される減法混色モデルです。

  • 静的ファクトリ関数

    • QColor::fromCmyk(int c, int m, int y, int k, int a = 255)
    • QColor::fromCmykF(qreal c, qreal m, qreal y, qreal k, qreal a = 1.0)
  • void QColor::setCmykF(qreal c, qreal m, qreal y, qreal k, qreal a = 1.0)

    • 浮動小数点数版で、各成分を0.0~1.0のqreal型で指定します。
    • 例: QColor color; color.setCmykF(0.0, 1.0, 1.0, 0.0); // 純粋な赤 (CMYKで表現)
  • void QColor::setCmyk(int c, int m, int y, int k, int a = 255)

    • シアン (c), マゼンタ (m), イエロー (y), キー/ブラック (k) を0~255の整数で指定します。
    • アルファ (a): 0~255。
    • 例: QColor color; color.setCmyk(0, 255, 255, 0); // 純粋な赤 (CMYKで表現)

色の名前による設定

Qtは、SVG 1.0のカラーネームなど、多くの標準的な色の名前を認識します。

  • Qt::GlobalColor列挙型による設定

    • Qt名前空間には、一般的な基本色が列挙型で定義されています。
    • 例: QColor black = Qt::black;
    • 例: QColor white(Qt::white);
  • コンストラクタによる初期化

    • QColorオブジェクトを色の名前で直接初期化できます。
    • 例: QColor green("green");
    • 例: QColor customColor("#FFD700"); // Gold
  • void QColor::setNamedColor(const QString &name)

    • 色の名前(例: "red", "blue", "DarkGreen", "LightSteelBlue" など)を文字列で指定します。
    • 16進数表記のRGB値(例: "#FF0000", "#F00", "#aabbcc")も認識します。
    • 例: QColor color; color.setNamedColor("blue");
    • 例: QColor htmlColor; htmlColor.setNamedColor("#FF8C00"); // DarkOrange

個別コンポーネントの設定

色の各成分を個別に設定することも可能です。

  • void QColor::setAlpha(int alpha) / setAlphaF(qreal alpha)
    • これらのメソッドは、既存の色の特定成分のみを変更したい場合に便利です。
    • 例: QColor originalColor(255, 0, 0); // 赤
    • originalColor.setGreen(128); // 緑成分を追加してオレンジ色に近づける
    • originalColor.setAlpha(100); // 透明度を設定
  • void QColor::setRedF(qreal red) / setGreenF(qreal green) / setBlueF(qreal blue)
  • void QColor::setRed(int red) / setGreen(int green) / setBlue(int blue)

色の設定方法を選択する際には、以下の点を考慮してください。

  • 印刷用途: CMYKモデルは印刷時の色再現に重要ですが、通常はグラフィックデザインソフトウェアがこの変換を処理します。Qtアプリケーションで直接CMYK値を扱うことは稀かもしれません。
  • ウェブとの互換性: HTML/CSSなどで使用される16進数表記の色や名前付きカラーを使用する場合は、setNamedColor()が便利です。
  • ハードウェア/表示との整合性: ほとんどのディスプレイはRGBモデルで動作するため、RGB値で直接色を指定することは、表示される色を最も直接的に制御する方法です。
  • 直感的な色の調整: 色相、彩度、明度(または輝度)を個別に調整したい場合は、setHsv()setHsl()が非常に強力です。特に、色のバリエーション(例: 同じ色相で濃淡を変える)を生成する際に適しています。