QColor::setHsvF()

2025-05-26

QColor::setHsvF() は、Qt の QColor クラスのメンバ関数で、色の値を HSV (Hue, Saturation, Value) モデル を用いて設定するためのものです。特に、この関数は各成分を 浮動小数点数 (float または qreal) で指定する点が特徴です。

HSV モデルについて

HSV モデルは、色を以下3つの要素で表現します。

  1. Hue (H: 色相): 色の種類を表します。赤、緑、青といった色の基本的な性質を指します。通常、色の円周上の角度(度数)で表され、0.0 から 1.0 の範囲で指定されます。
    • 0.0 または 1.0 は赤
    • 0.333... は緑
    • 0.666... は青 といったように連続的に変化します。
  2. Saturation (S: 彩度): 色の鮮やかさを表します。0.0 に近いほど灰色に近く、1.0 に近いほど色が鮮やかになります。
  3. Value (V: 明度): 色の明るさを表します。0.0 は黒、1.0 は最も明るい色になります。

setHsvF() の書式

void QColor::setHsvF(qreal h, qreal s, qreal v, qreal a = 1.0);
  • a: アルファ値 (Alpha) を 0.0 から 1.0 の範囲で指定します。これは色の透明度を表し、0.0 は完全な透明、1.0 は完全な不透明です。省略した場合のデフォルト値は 1.0 (不透明) です。
  • v: 明度 (Value) を 0.0 から 1.0 の範囲で指定します。
  • s: 彩度 (Saturation) を 0.0 から 1.0 の範囲で指定します。
  • h: 色相 (Hue) を 0.0 から 1.0 の範囲で指定します。

setHsvF() の特徴と利点

  • アニメーションやグラデーション: 浮動小数点数で値を指定できるため、色相、彩度、明度を連続的に変化させるアニメーションやグラデーションを作成する際に非常に役立ちます。
  • 直感的な色の調整: HSV モデルは、人間の色の知覚に近い形で色を表現できるため、RGB モデルよりも直感的に色の調整がしやすい場合があります。例えば、色の種類を変えずに鮮やかさや明るさだけを調整したい場合に便利です。
  • 浮動小数点数による精度: setHsv() のように整数値(0-3590-255)で指定するのではなく、qreal (通常は double) を使用するため、より細かい色の指定が可能です。

使用例

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

int main() {
    QColor color;

    // 赤色を設定 (Hue: 0.0, Saturation: 1.0, Value: 1.0, Alpha: 1.0)
    color.setHsvF(0.0, 1.0, 1.0);
    qDebug() << "Red (HSV):" << color; // 例: QColor(ARGB 1, 1, 0, 0)

    // 半透明の明るい青色を設定 (Hue: 0.666..., Saturation: 0.8, Value: 0.9, Alpha: 0.5)
    color.setHsvF(0.666, 0.8, 0.9, 0.5);
    qDebug() << "Light Blue (HSV):" << color; // 例: QColor(ARGB 0.5, 0.18, 0.45, 0.9)

    // 灰色を設定 (Saturation: 0.0)
    color.setHsvF(0.0, 0.0, 0.5); // Hueは関係なく、Saturationが0なので灰色になる
    qDebug() << "Gray (HSV):" << color; // 例: QColor(ARGB 1, 0.5, 0.5, 0.5)

    return 0;
}

この例では、setHsvF() を使って様々な色を設定し、qDebug() でその結果を表示しています。出力されるQColorオブジェクトは内部的にRGB値として表現されるため、HSVで設定した値がどのようにRGBに変換されたかを確認できます。



QColor::setHsvF() は非常に強力な関数ですが、正しく使わないと予期せぬ結果を招くことがあります。ここでは、よくあるエラーとその解決策を説明します。

引数の範囲外の値

setHsvF() の引数 h, s, v, a はすべて 0.0 から 1.0 の範囲で指定する必要があります。この範囲外の値を渡すと、色の変換が正しく行われなかったり、予期しない色が生成されたりする可能性があります。

よくある間違い

  • s, v, a をパーセンテージ (0-100) やバイト値 (0-255) で指定してしまう。
  • h (色相) を度数 (0-360) で指定してしまう。

例 (誤った使用)

QColor color;
color.setHsvF(360.0, 100.0, 100.0); // Hueが360度、SaturationとValueが100%
qDebug() << color; // 想定と異なる色になる可能性

トラブルシューティング

  • 別のフォーマットの数値(例: 0-360度、0-255バイト値など)から変換する場合は、適切に正規化(例: 値 / 360.0値 / 255.0)してから渡してください。
  • 常に 0.0 から 1.0 の範囲で値を渡すことを確認してください。

例 (正しい使用)

QColor color;
color.setHsvF(1.0, 1.0, 1.0); // Hue: 1.0 (赤), Saturation: 1.0, Value: 1.0
qDebug() << color;

HSVとHSLの混同

Qtには setHsvF() と似た setHslF() 関数があります。これらはそれぞれHSV (Hue, Saturation, Value) と HSL (Hue, Saturation, Lightness) モデルに基づいており、Saturationと3つ目の要素(ValueまたはLightness)の意味合いが異なります。

  • HSLのLightness (輝度): 0.0 は常に黒、0.5 は純粋な色、1.0 は常に白。
  • HSVのValue (明度): 0.0 は常に黒、1.0 は彩度が最大の明るい色。

よくある間違い

  • またはその逆。
  • HSVモデルで色を考えているのに、setHslF() を使ってしまう。

トラブルシューティング

  • 期待する明るさや鮮やかさにならない場合は、HSVとHSLのどちらのモデルを意図しているかを確認し、それぞれのモデルにおけるSaturationとValue/Lightnessの挙動を再確認してください。
  • どちらのカラーモデルで色を扱いたいのかを明確にし、対応する関数 (setHsvF() または setHslF()) を使用してください。

不透明度 (Alpha) の見落とし

setHsvF() はデフォルトでアルファ値 (a) を 1.0 (完全不透明) としますが、意図せず透明な色になってしまうことがあります。

よくある間違い

  • または、完全に不透明な色を期待していたのに、誤って 0.0 に近い a の値を渡してしまい、色が見えなくなってしまう。
  • 半透明の色を期待していたが、引数 a を指定し忘れたため完全不透明になってしまう。

トラブルシューティング

  • GUI上で色が見えない、または薄いと感じる場合は、アルファ値を確認してください。
  • 透明度を制御したい場合は、必ず4番目の引数 a を指定してください。

例 (アルファ値の指定)

QColor semiTransparentRed;
semiTransparentRed.setHsvF(0.0, 1.0, 1.0, 0.5); // 半透明の赤

浮動小数点演算の精度問題

qreal は通常 double のエイリアスですが、浮動小数点数には厳密な精度に限界があります。ごく稀に、setHsvF() で設定した値と hsvHueF(), hsvSaturationF(), hsvValueF(), alphaF() で取得した値の間に微細な誤差が生じることがあります。

よくある間違い

  • 設定したHSV値と取得したHSV値が厳密に一致することを期待する。

トラブルシューティング

  • ほとんどの場合、この精度問題は視覚的な違いとして現れることはありません。
  • 浮動小数点数の比較には、厳密な等価性 (==) ではなく、許容範囲内の誤差 (epsilon) を使用して比較するようにしてください。

灰色 (Achromatic Color) の Hue

Saturationが 0.0 (灰色) の場合、Hue (色相) の値は意味を持ちません。しかし、setHsvF() にはHueの値を渡す必要があります。

よくある間違い

  • 灰色を設定する際に、Hueの値を意識せずに適当な値を渡してしまう。これは機能的には問題ありませんが、コードの意図が不明確になる可能性があります。

トラブルシューティング

  • 灰色を設定する場合は、Hueに 0.0 を渡すか、あるいは特定の慣習的な値(例: 0.0)を使用するように決めておくと良いでしょう。重要なのはSaturationが 0.0 であることです。

例 (灰色の設定)

QColor grayColor;
grayColor.setHsvF(0.0, 0.0, 0.5); // 彩度が0なので中間の明るさの灰色

QMLとの連携における問題

C++で QColor を設定し、QMLに公開して使用する場合、型変換の際に問題が発生することが稀にあります。特に、QML側で QColor オブジェクトが正しく認識されない「Type Error」などが発生する可能性があります。

  • QML側で色の文字列形式 ("#RRGGBB") を使用する方が堅牢な場合があります。QColor::name() 関数でRGB文字列を取得し、それをQMLに渡すことも検討してください。
  • C++からQMLへ QColor を渡す際には、Qtのメタタイプシステムが正しく機能していることを確認してください。通常、Q_PROPERTYQ_INVOKABLE を適切に使用していれば問題ありませんが、複雑なデータ構造の一部として QColor を渡す場合は注意が必要です。


例1: 基本的な色の設定と表示

最も基本的な使い方です。QColor オブジェクトを作成し、setHsvF() を使って色を設定し、その色情報をデバッグ出力します。

#include <QColor>
#include <QDebug> // QDebug を使用して情報を出力

int main() {
    // 1. 赤色 (H=0.0, S=1.0, V=1.0)
    QColor redColor;
    redColor.setHsvF(0.0, 1.0, 1.0);
    qDebug() << "設定した赤色 (HSV):" << redColor;
    // 出力例: 設定した赤色 (HSV): QColor(ARGB 1, 1, 0, 0) - これはRGB値に変換されたもの

    // 2. 緑色 (H=0.333..., S=1.0, V=1.0)
    QColor greenColor;
    greenColor.setHsvF(1.0 / 3.0, 1.0, 1.0); // 1.0/3.0 は約0.333...
    qDebug() << "設定した緑色 (HSV):" << greenColor;
    // 出力例: 設定した緑色 (HSV): QColor(ARGB 1, 0, 1, 0)

    // 3. 青色 (H=0.666..., S=1.0, V=1.0)
    QColor blueColor;
    blueColor.setHsvF(2.0 / 3.0, 1.0, 1.0); // 2.0/3.0 は約0.666...
    qDebug() << "設定した青色 (HSV):" << blueColor;
    // 出力例: 設定した青色 (HSV): QColor(ARGB 1, 0, 0, 1)

    // 4. 明るいシアン (H=0.5, S=0.7, V=0.9) - 半透明
    QColor lightCyan;
    lightCyan.setHsvF(0.5, 0.7, 0.9, 0.6); // アルファ値 0.6 (60% 不透明)
    qDebug() << "設定した明るいシアン (半透明):" << lightCyan;
    // 出力例: 設定した明るいシアン (半透明): QColor(ARGB 0.6, 0.27, 0.9, 0.9)

    // 5. 灰色 (S=0.0) - Hueの値は関係ない
    QColor grayColor;
    grayColor.setHsvF(0.7, 0.0, 0.5); // Hueは任意、Saturationが0で灰色になる
    qDebug() << "設定した灰色 (HSV):" << grayColor;
    // 出力例: 設定した灰色 (HSV): QColor(ARGB 1, 0.5, 0.5, 0.5)

    return 0;
}

このコードを実行すると、QColor オブジェクトが内部でどのようにRGB値に変換されたかが qDebug() の出力で確認できます。

例2: 色相を変化させるグラデーションの生成

setHsvF() は、色相 (Hue) を連続的に変化させることで、美しいグラデーションを簡単に作成するのに非常に適しています。

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QColor>
#include <QDebug>

class GradientWidget : public QWidget {
public:
    GradientWidget(QWidget *parent = nullptr) : QWidget(parent) {
        setWindowTitle("HSV グラデーション");
        resize(400, 200);
    }

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

        int width = size().width();
        int height = size().height();

        // 左右に色相を変化させるグラデーションを描画
        for (int x = 0; x < width; ++x) {
            // x座標を 0.0 から 1.0 の Hue 値にマッピング
            qreal hue = static_cast<qreal>(x) / width;

            // 彩度と明度は一定 (完全な色)
            qreal saturation = 1.0;
            qreal value = 1.0;

            QColor color;
            color.setHsvF(hue, saturation, value);

            painter.setPen(color); // 各列をその色で描画
            painter.drawLine(x, 0, x, height);
        }
    }
};

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

    GradientWidget widget;
    widget.show();

    return app.exec();
}

この例では、paintEvent 関数内でウィジェットの幅に応じて hue の値を 0.0 から 1.0 まで変化させ、その色で垂直な線を描画することで、虹のような色相のグラデーションが生成されます。

例3: 彩度と明度を変化させる色選択ウィジェットのシミュレーション

色選択ツールなどでよく見られる、色相が固定された状態で彩度と明度を変化させるエリアをシミュレートします。

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QColor>
#include <QDebug>
#include <QMouseEvent> // マウスイベント用

class ColorPickerArea : public QWidget {
public:
    ColorPickerArea(QWidget *parent = nullptr) : QWidget(parent) {
        setWindowTitle("HSV 色選択エリア");
        resize(300, 300);
        setMouseTracking(true); // マウス追跡を有効にする
    }

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

        int width = size().width();
        int height = size().height();

        // 固定の色相 (例: 赤)
        qreal fixedHue = 0.0; // 赤色

        for (int y = 0; y < height; ++y) {
            for (int x = 0; x < width; ++x) {
                // x座標を彩度 (Saturation) にマッピング (左: 0.0, 右: 1.0)
                qreal saturation = static_cast<qreal>(x) / width;
                // y座標を明度 (Value) にマッピング (下: 0.0, 上: 1.0)
                qreal value = 1.0 - (static_cast<qreal>(y) / height); // Y軸は下が黒、上が明るい

                QColor color;
                color.setHsvF(fixedHue, saturation, value);

                painter.setPen(color);
                painter.drawPoint(x, y); // 各ピクセルに色を設定
            }
        }
    }

    void mouseMoveEvent(QMouseEvent *event) override {
        // マウスカーソルの位置からHSV値を計算し、デバッグ出力
        qreal x = event->position().x();
        qreal y = event->position().y();

        qreal saturation = x / width();
        qreal value = 1.0 - (y / height());

        // 固定の色相
        qreal fixedHue = 0.0;

        QColor hoveredColor;
        hoveredColor.setHsvF(fixedHue, saturation, value);

        qDebug() << QString("Current HSV: H=%.3f, S=%.3f, V=%.3f, Color: %s")
                        .arg(fixedHue)
                        .arg(saturation)
                        .arg(value)
                        .arg(hoveredColor.name(QColor::HexRgb));
    }
};

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

    ColorPickerArea picker;
    picker.show();

    return app.exec();
}

このコードでは、paintEvent で彩度と明度が変化する2Dのカラースペースを描画します。マウスを動かすと、その位置に対応するHSV値とRGBの16進数表現がデバッグ出力されます。これは、色選択ツールにおける中心的な機能のシミュレーションです。



QColor::setHsvF() の代替となるプログラミング方法

HSV モデルの別の関数 (QColor::setHsv(), QColor::fromHsv())

setHsvF() が浮動小数点数 (qreal) を使うのに対し、整数値で HSV を設定する関数もあります。

  • static QColor QColor::fromHsv(int h, int s, int v, int a = 255)

    • QColor オブジェクトを新しく生成して返す静的関数です。既存のオブジェクトを変更するのではなく、新しいオブジェクトが必要な場合に便利です。引数の意味は setHsv() と同じです。
    QColor newColor = QColor::fromHsv(120, 200, 200); // 新しい緑系の色を生成
    qDebug() << "fromHsv() の例:" << newColor;
    
    • h: 色相 (Hue) を 0 から 359 の範囲で指定します。0360 は赤。
    • s: 彩度 (Saturation) を 0 から 255 の範囲で指定します。
    • v: 明度 (Value) を 0 から 255 の範囲で指定します。
    • a: アルファ値 (Alpha) を 0 から 255 の範囲で指定します (0 が透明、255 が不透明)。
    • 特徴: 整数値で指定するため、GUIのカラーピッカーなどでよく使われる 0-359 度や 0-255 の範囲に直接対応しやすいです。ただし、setHsvF() ほどの細かい精度は期待できません。
    QColor color;
    color.setHsv(0, 255, 255); // 完全な赤 (Hue: 0度, Saturation: 255, Value: 255)
    qDebug() << "setHsv() の例:" << color;
    

RGB モデルの関数 (QColor::setRgbF(), QColor::setRgb(), QColor::fromRgbF(), QColor::fromRgb())

最も一般的で、ハードウェアに直接対応しやすいのが RGB (Red, Green, Blue) モデルです。

  • static QColor QColor::fromRgb(int r, int g, int b, int a = 255)

    • 整数値のRGB値から新しい QColor オブジェクトを生成します。
    QColor newColor = QColor::fromRgb(0, 0, 255); // 完全な青
    qDebug() << "fromRgb() の例:" << newColor;
    
  • static QColor QColor::fromRgbF(qreal r, qreal g, qreal b, qreal a = 1.0)

    • 浮動小数点数のRGB値から新しい QColor オブジェクトを生成します。
    QColor newColor = QColor::fromRgbF(0.0, 1.0, 0.0, 0.5); // 半透明の緑
    qDebug() << "fromRgbF() の例:" << newColor;
    
  • void QColor::setRgb(int r, int g, int b, int a = 255)

    • r, g, b, a: それぞれの成分を 0 から 255 の整数値で指定します。
    • 特徴: Webカラーやグラフィックソフトウェアでよく使われる 0-255 の範囲に対応しています。
    QColor color;
    color.setRgb(255, 0, 0); // 完全な赤
    qDebug() << "setRgb() の例:" << color;
    
  • void QColor::setRgbF(qreal r, qreal g, qreal b, qreal a = 1.0)

    • r, g, b: 赤、緑、青の成分を 0.0 から 1.0 の浮動小数点数で指定します。
    • a: アルファ値を 0.0 から 1.0 で指定します。
    • 特徴: setHsvF() と同様に浮動小数点数で高精度な色指定が可能です。特に、外部のデータソースが 0.0-1.0 のRGB値を持つ場合に便利です。
    QColor color;
    color.setRgbF(1.0, 0.0, 0.0); // 完全な赤
    qDebug() << "setRgbF() の例:" << color;
    

HSL モデルの関数 (QColor::setHslF(), QColor::setHsl(), QColor::fromHslF(), QColor::fromHsl())

HSL (Hue, Saturation, Lightness) モデルは、HSV と似ていますが、明度 (Value) の代わりに輝度 (Lightness) を使います。

  • setHsl(), fromHslF(), fromHsl() も同様に利用できます。

  • void QColor::setHslF(qreal h, qreal s, qreal l, qreal a = 1.0)

    • h: 色相 (0.0 から 1.0)
    • s: 彩度 (0.0 から 1.0)
    • l: 輝度 (0.0 から 1.0)。0.0 は黒、0.5 は純粋な色、1.0 は白になります。
    • a: アルファ値 (0.0 から 1.0)。
    • 特徴: HSV と同様に直感的な色調整が可能ですが、特に「明るさ」の概念が異なるため、純粋な白や黒に近づけたい場合に便利です。
    QColor color;
    color.setHslF(0.0, 1.0, 0.5); // 純粋な赤 (輝度0.5)
    qDebug() << "setHslF() の例:" << color;
    

色の名前を使用する (QColor::setNamedColor(), QColor::QColor(const QString &name))

定義済みの色名やWebカラーの16進数文字列を使って色を設定できます。

  • QColor::QColor(const QString &name) (コンストラクタ)

    • setNamedColor() と同様に、文字列を直接コンストラクタに渡して QColor オブジェクトを生成できます。
    QColor newColor("#008080"); // ティール (青緑)
    qDebug() << "コンストラクタ (Hex) の例:" << newColor;
    
  • void QColor::setNamedColor(const QString &name)

    • Webカラーの "#RRGGBB""#AARRGGBB" 形式の文字列、または Qt::redQt::blue のような定義済み色名 ("red", "blue") を使って色を設定します。
    QColor color;
    color.setNamedColor("#FF00FF"); // マゼンタ
    qDebug() << "setNamedColor() の例 (Hex):" << color;
    
    color.setNamedColor("darkcyan"); // ダークシアン
    qDebug() << "setNamedColor() の例 (Name):" << color;
    

既存の Qt::GlobalColor 列挙体を使用する

Qtは、よく使う基本的な色を Qt::GlobalColor 列挙体として提供しています。

  • QColor::QColor(Qt::GlobalColor color) (コンストラクタ)

    QColor red = Qt::red; // Qt::red を使用
    qDebug() << "Qt::GlobalColor の例:" << red;
    
    QColor black = Qt::black;
    qDebug() << "Qt::GlobalColor の例:" << black;
    

CMYK モデルの関数 (QColor::setCmykF(), QColor::fromCmykF() など)

印刷業界でよく使われる CMYK (Cyan, Magenta, Yellow, Key/Black) モデルも利用できます。

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

    • c, m, y, k: シアン、マゼンタ、イエロー、キー (ブラック) の成分を 0.0 から 1.0 の浮動小数点数で指定します。
    • 特徴: 印刷物向けのカラー設定に特化しています。
    QColor color;
    color.setCmykF(1.0, 0.0, 0.0, 0.0); // 純粋なシアン (印刷用)
    qDebug() << "setCmykF() の例:" << color;
    

どの方法を選ぶべきか?

  • 印刷を考慮した色設定が必要な場合: QColor::setCmykF()
  • 基本的な既定の色を使用したい場合: Qt::GlobalColor 列挙体。
  • Webカラーコードや既存の色名で色を設定したい場合: QColor::setNamedColor() または QColor の文字列コンストラクタ。
  • 色を「種類」「鮮やかさ」「輝度」で考え、特に白や黒へのグラデーションを重視したい場合: QColor::setHslF() または QColor::setHsl()
  • 色を「光の三原色」として扱いたい場合: QColor::setRgbF() または QColor::setRgb()。ディスプレイ表示のデフォルトであり、最も一般的です。
  • 色を直感的に「種類」「鮮やかさ」「明るさ」で考えたい場合: QColor::setHsvF() または QColor::setHsv()。特にアニメーションやユーザーによる色調整に適しています。

それぞれの関数は異なるカラーモデルや値の範囲に対応しており、用途に応じて使い分けることで、より効率的かつ意図に沿った色設定が可能になります。 Qtプログラミングにおいて QColor::setHsvF() の代わりに色を設定する方法はいくつかあります。それぞれの方法には、独自の利点と使用ケースがあります。

QColor::setHsv() (整数値によるHSV設定)

setHsvF() と同じHSVモデルを使用しますが、各成分を整数値で指定します。

  • 書式
    void QColor::setHsv(int h, int s, int v, int a = 255);
    • h (色相): 0 から 359 (度数)
    • s (彩度): 0 から 255
    • v (明度): 0 から 255
    • a (アルファ値): 0 (透明) から 255 (不透明)

利点

  • 多くのグラフィックAPIや画像ファイル形式で採用されている255段階の表現に直接対応できます。
  • 浮動小数点数の計算を避けたい場合に適しています。

使用例

#include <QColor>
#include <QDebug>

int main() {
    QColor color;
    // 純粋な赤色 (H=0度, S=255, V=255)
    color.setHsv(0, 255, 255);
    qDebug() << "整数値で設定した赤色 (HSV):" << color;

    // 半透明の緑色 (H=120度, S=200, V=200, A=128)
    color.setHsv(120, 200, 200, 128);
    qDebug() << "整数値で設定した半透明の緑色 (HSV):" << color;

    return 0;
}

QColor::fromHsvF() / QColor::fromHsv() (スタティックファクトリ関数)

QColor オブジェクトを直接HSV値から生成するスタティック関数です。既存の QColor オブジェクトを変更するのではなく、新しいオブジェクトを作成する場合に便利です。

  • 書式 (整数値)
    static QColor QColor::fromHsv(int h, int s, int v, int a = 255);
  • 書式 (浮動小数点数)
    static QColor QColor::fromHsvF(qreal h, qreal s, qreal v, qreal a = 1.0);

利点

  • 既存の QColor オブジェクトの状態を変更せずに新しい色を計算する場合に適しています。
  • コードがより簡潔になり、一時的な QColor オブジェクトをすぐに作成できます。

使用例

#include <QColor>
#include <QDebug>

int main() {
    // fromHsvF を使用して新しい色を作成
    QColor brightYellow = QColor::fromHsvF(0.16, 1.0, 1.0); // 太陽のような黄色
    qDebug() << "fromHsvF で作成した明るい黄色:" << brightYellow;

    // fromHsv を使用して新しい色を作成
    QColor darkPurple = QColor::fromHsv(270, 255, 100); // 暗い紫色
    qDebug() << "fromHsv で作成した暗い紫色:" << darkPurple;

    return 0;
}

QColor::setRgbF() / QColor::setRgb() (RGBモデルでの設定)

最も一般的で、ハードウェアに直接マッピングされるカラーモデルです。Red (赤)、Green (緑)、Blue (青) の各成分を組み合わせて色を表現します。

  • 書式 (整数値)
    void QColor::setRgb(int r, int g, int b, int a = 255);
    • r, g, b, a: それぞれ 0 から 255 の範囲。
  • 書式 (浮動小数点数)
    void QColor::setRgbF(qreal r, qreal g, qreal b, qreal a = 1.0);
    • r, g, b, a: それぞれ 0.0 から 1.0 の範囲。

利点

  • HTML/CSSのカラーコード (#RRGGBB) や画像編集ソフトウェアなどでRGB値に慣れている場合に便利です。
  • 最も広く使われているカラーモデルであり、色の直感的な理解がしやすい場合があります。

使用例

#include <QColor>
#include <QDebug>

int main() {
    QColor color;
    // 純粋なマゼンタ (RGB F: 1.0, 0.0, 1.0)
    color.setRgbF(1.0, 0.0, 1.0);
    qDebug() << "浮動小数点数で設定したマゼンタ (RGB):" << color;

    // 半透明のオレンジ (RGB: 255, 165, 0, A=192)
    color.setRgb(255, 165, 0, 192);
    qDebug() << "整数値で設定した半透明のオレンジ (RGB):" << color;

    return 0;
}

QColor::fromRgbF() / QColor::fromRgb() (スタティックファクトリ関数)

RGB値から新しい QColor オブジェクトを作成します。

  • 書式 (QRgb)
    static QColor QColor::fromRgb(QRgb rgb); (QRgbは unsigned int でARGB値を格納)
  • 書式 (整数値)
    static QColor QColor::fromRgb(int r, int g, int b, int a = 255);
  • 書式 (浮動小数点数)
    static QColor QColor::fromRgbF(qreal r, qreal g, qreal b, qreal a = 1.0);

利点

  • QRgb は、Windows APIや他のグラフィックライブラリで色の表現によく使われます。
  • 既存のRGB値(例えば、外部ライブラリから取得した値など)から直接 QColor オブジェクトを生成する場合に便利です。

使用例

#include <QColor>
#include <QDebug>
#include <QRgb> // QRgb 型を使用する場合

int main() {
    // fromRgbF で作成
    QColor vividGreen = QColor::fromRgbF(0.2, 0.8, 0.2);
    qDebug() << "fromRgbF で作成した鮮やかな緑:" << vividGreen;

    // fromRgb で作成
    QColor deepBlue = QColor::fromRgb(0, 0, 139);
    qDebug() << "fromRgb で作成した深い青:" << deepBlue;

    // QRgb から作成 (例: 16進数で指定)
    QRgb argbValue = 0xFF4080C0; // ARGB: Alpha=FF, Red=40, Green=80, Blue=C0
    QColor fromQRgb = QColor::fromRgba(argbValue); // fromRgbではなくfromRgbaに注意
    qDebug() << "QRgb から作成した色:" << fromQRgb;

    return 0;
}

QColor::setHslF() / QColor::setHsl() (HSLモデルでの設定)

HSL (Hue, Saturation, Lightness) モデルは、HSVと似ていますが、Lightness (輝度) の概念が異なります。Valueが「明るさ」であるのに対し、Lightnessは「光の量」に近い感覚です。

  • 書式 (整数値)
    void QColor::setHsl(int h, int s, int l, int a = 255);
    • h: 0 から 359
    • s, l, a: 0 から 255
  • 書式 (浮動小数点数)
    void QColor::setHslF(qreal h, qreal s, qreal l, qreal a = 1.0);
    • h, s, l, a: それぞれ 0.0 から 1.0 の範囲。

利点

  • 特に色の「明るさ」を均等に変化させたい場合にHSVよりも適していることがあります(HSVのValueは彩度が高いほど黒に近づきやすい傾向があるのに対し、HSLのLightnessは0.5が最も純粋な色で、0.0は黒、1.0は白になります)。
  • HSLは、人間の色の知覚とより一致すると考えられるため、色をより自然に調整できる場合があります。

使用例

#include <QColor>
#include <QDebug>

int main() {
    QColor color;
    // HSLで設定: Hue=60度 (黄色), Saturation=1.0, Lightness=0.5 (純粋な黄色)
    color.setHslF(60.0 / 360.0, 1.0, 0.5);
    qDebug() << "HSLで設定した純粋な黄色:" << color;

    // HSLで設定: Hue=180度 (シアン), Saturation=0.5, Lightness=0.8 (明るく濁ったシアン)
    color.setHsl(180, 128, 204);
    qDebug() << "HSLで設定した明るく濁ったシアン:" << color;

    return 0;
}

事前定義された色名または16進数文字列からの設定

Qtには、HTML/CSSのカラーネームや16進数形式のRGB文字列から色を設定する方法もあります。

  • 書式 (16進数)
    QColor::QColor(const QString &name); (例: "#RRGGBB" または "#AARRGGBB")
  • 書式 (色名)
    QColor::QColor(const QString &name); (コンストラクタ) または void QColor::setNamedColor(const QString &name);

利点

  • 読みやすく、覚えやすい。
  • デザインツールやWeb標準で定義された色を直接使用できます。

使用例

#include <QColor>
#include <QDebug>

int main() {
    // 色名で設定
    QColor teal = QColor("teal");
    qDebug() << "色名で設定した Teal:" << teal;

    // 16進数文字列で設定 (RGB)
    QColor customGray("#808080"); // 中間的な灰色
    qDebug() << "16進数で設定したカスタムグレー:" << customGray;

    // 16進数文字列で設定 (ARGB)
    QColor transparentBlue("#800000FF"); // 半透明の青 (AARRGGBB)
    qDebug() << "16進数で設定した半透明の青:" << transparentBlue;

    // setNamedColor を使用
    QColor anotherColor;
    anotherColor.setNamedColor("DarkGreen");
    qDebug() << "setNamedColor で設定した DarkGreen:" << anotherColor;

    return 0;
}