Qt QColor::setHsl()徹底解説:HSLカラーモデルで色を操る

2025-05-27

QColor::setHsl()とは

QColorクラスは、色を表現するためのQtのクラスです。通常、色はRGB(赤、緑、青)で表現されることが多いですが、QColorはRGBの他に、HSV(Hue, Saturation, Value)、CMYK(Cyan, Magenta, Yellow, Key/Black)、そして**HSL(Hue, Saturation, Lightness)**といった様々な色モデルをサポートしています。

QColor::setHsl()メソッドは、このHSL色モデルを使ってQColorオブジェクトの色を設定するための関数です。

HSL色モデルについて

HSLは、人間の色の認識に近い形で色を表現できるため、デザインなどでよく使われます。それぞれの要素は以下の通りです。

  • L (Lightness - 輝度/明度):
    • 色の明るさを表します。
    • 0から255までの値で表現されます。
    • 0は完全に黒、255は完全に白を示します。128が元の色の明るさの中間点と考えることができます。
  • S (Saturation - 彩度):
    • 色の鮮やかさを表します。
    • 0から255までの値で表現されます。
    • 0は彩度がなく灰色に近い色(無彩色)、255は最も鮮やかな色(純色)を示します。
  • H (Hue - 色相):
    • 色の種類(赤、オレンジ、黄、緑、青、紫など)を表します。
    • 通常、0から359までの角度で表現され、色相環上の位置に対応します。
    • 0度は赤、120度は緑、240度は青に対応します。

QColor::setHsl()の引数

setHsl()メソッドは、通常以下の引数を取ります。

void QColor::setHsl(int h, int s, int l, int a = 255)
  • a: アルファ値 (Alpha)。色の不透明度を表します。0(完全に透明)から255(完全に不透明)までの整数値。デフォルトは255です。
  • l: 輝度 (Lightness)。0から255までの整数値。
  • s: 彩度 (Saturation)。0から255までの整数値。
  • h: 色相 (Hue)。0から359までの整数値。

また、浮動小数点数版のsetHslF()も存在し、こちらは0.0から1.0までの範囲で値を指定します。

使用例

#include <QColor>
#include <QDebug>

int main() {
    QColor myColor;

    // HSLで色を設定する例
    // 色相: 0 (赤), 彩度: 255 (鮮やか), 輝度: 128 (中間)
    myColor.setHsl(0, 255, 128); // 鮮やかな赤

    qDebug() << "HSL (0, 255, 128) の色:" << myColor.name(); // RGB形式で表示される (例: "#FF0000")

    // 別の例:薄い青
    myColor.setHsl(240, 100, 200); // 色相:240(青), 彩度:100(ややくすんだ), 輝度:200(明るめ)

    qDebug() << "HSL (240, 100, 200) の色:" << myColor.name(); // 例: "#9999FF" (薄い青)

    // アルファ値を設定する例
    myColor.setHsl(120, 255, 128, 128); // 鮮やかな緑で半透明

    qDebug() << "HSL (120, 255, 128, 128) の色:" << myColor.name(QColor::HexArgb); // 例: "#8000FF00" (半透明の緑)

    return 0;
}

このコードでは、QColor::setHsl()を使って異なる色をHSL値で設定し、その結果をqDebug()で出力しています。

  • 色のバリエーション生成
    特定の色相を固定し、彩度や輝度を変えることで、トーンの異なる色のバリエーションを簡単に生成できます。
  • デザインツールとの親和性
    多くのグラフィックデザインソフトウェアやCSSなどでHSLが使われているため、デザインとの連携がスムーズです。
  • 直感的な色の調整
    HSLは、RGBに比べて人間が色を認識する方法に近いため、「この色をもう少し明るくしたい」「この色をもう少し鮮やかにしたい」といった直感的な色の調整がしやすいです。


引数の範囲外の値

最もよくある間違いは、setHsl()の引数に指定する値が期待される範囲外であることです。

  • A (Alpha - アルファ値): 0〜255
  • L (Lightness - 輝度/明度): 0〜255
  • S (Saturation - 彩度): 0〜255
  • H (Hue - 色相): 0〜359

よくあるエラー例

  • myColor.setHsl(120, 255, -10); (輝度が0を下回っている)
  • myColor.setHsl(120, 300, 128); (彩度が255を超えている)
  • myColor.setHsl(360, 255, 128); (色相が360になっている)

トラブルシューティング

  • デバッグ出力
    qDebug()を使って、setHsl()に渡す値が実際にどうなっているかを確認します。
  • 値の検証
    setHsl()を呼び出す前に、渡す値が正しい範囲内にあることを確認するコードを追加することを検討してください。例えば、qBound()や単純なif文で値をクランプ(制限)することができます。
    int h = someValueH;
    int s = someValueS;
    int l = someValueL;
    int a = someValueA;
    
    // 範囲内にクランプする例
    h = qBound(0, h, 359);
    s = qBound(0, s, 255);
    l = qBound(0, l, 255);
    a = qBound(0, a, 255);
    
    myColor.setHsl(h, s, l, a);
    
  • Qtのドキュメントを確認する
    各引数の正しい範囲を常にQtの公式ドキュメントで確認してください。

HSLの理解不足による意図しない色

HSLモデルの各要素が色にどのように影響するかを完全に理解していないと、期待と異なる色になることがあります。

よくあるエラー例

  • 純粋な白や黒にならない

    • Lightnessが255に近い値(例: 255)で、Saturationが0に非常に近い(例: 0)。

    • Lightnessが0に非常に近い値(例: 0)。この場合、HueとSaturationはほとんど意味を持ちません。
  • 「鮮やかな色」を指定したいのに灰色に近い色になる
    彩度(Saturation)が低い値(例: 0〜50)だと、色相や輝度に関わらず、灰色がかったくすんだ色になります。
  • 「明るい色」を指定したいのに黒に近い色になる
    輝度(Lightness)が低い値(例: 0〜50)だと、彩度が高くても非常に暗い色になります。

トラブルシューティング

  • 試行錯誤
    小さなプロジェクトで様々なHSL値を試してみて、色の変化を観察します。
  • HSL色空間の視覚化ツールを使う
    HSLスライダーやカラーピッカーなど、HSLを視覚的に操作できるツールを使って、各値が色にどう影響するかを理解する練習をしてください。オンラインのカラーピッカーなどが役立ちます。

setHslF() (浮動小数点数版) との混同

setHsl()には整数引数版と、setHslF()という浮動小数点数(qreal、通常はdouble)引数版があります。これらの違いを混同するとエラーにつながります。

  • setHslF(qreal h, qreal s, qreal l, qreal a = 1.0): 引数は0.0-1.0(すべて)の浮動小数点数。
  • setHsl(int h, int s, int l, int a = 255): 引数は0-359(H)または0-255(S, L, A)の整数。

よくあるエラー例

  • myColor.setHsl(0.5, 0.8, 0.7); (整数関数に浮動小数点数を渡している)
  • myColor.setHslF(120, 255, 128); (浮動小数点数関数に整数値を渡している)

トラブルシューティング

  • 型キャスト
    必要に応じて、static_cast<int>(value)static_cast<qreal>(value)のように型キャストを行います。ただし、整数と浮動小数点の間の変換では値のスケールに注意が必要です(例: 255を1.0にスケールする)。
    // 整数値を0.0-1.0の浮動小数点数に変換してsetHslFに渡す例
    int s_int = 200;
    qreal s_float = s_int / 255.0; // 0.0から1.0にスケール
    myColor.setHslF(120.0/360.0, s_float, 0.5); // Hは0.0-1.0なので注意
    
  • 正しい関数を選択する
    使用したい値の型(整数か浮動小数点数か)に応じて、setHsl()またはsetHslF()のどちらかを正しく選択してください。

QPainterなどでの描画時に色が反映されない

QColorオブジェクトは正しく設定されているはずなのに、画面に描画される色が期待通りにならない場合があります。

よくある原因とトラブルシューティング

  • 異なる色モデル間の変換
    setHsl()で色を設定した後、その色をRGB値として取得(myColor.red()など)して他のAPIに渡す場合、変換の際にわずかな丸め誤差が生じることがあります。通常は問題になりませんが、厳密な色の再現が必要な場合は注意が必要です。
  • ウィジェットのパレット設定
    ウィジェットの色は、そのパレット(QPalette)によって制御される場合があります。setHsl()で設定したQColorをウィジェットのパレットに適用しないと、見た目が変わらないことがあります。
    QColor myColor;
    myColor.setHsl(0, 255, 128);
    
    QPalette palette = myWidget->palette();
    palette.setColor(QPalette::Window, myColor); // ウィジェットの背景色を変更
    myWidget->setPalette(palette);
    myWidget->setAutoFillBackground(true); // 背景を自動で塗りつぶす設定も必要
    
  • アルファ値が0になっている
    setHsl()の最後の引数(アルファ値)が0(完全に透明)になっていると、何も描画されません。意図しない透明度になっていないか確認してください。
  • QPainterのペン/ブラシに設定し忘れている
    QPainterで色を使用するには、setPen()setBrush()QColorオブジェクトを設定する必要があります。
    QPainter painter(this); // thisは描画対象ウィジェット
    QColor myColor;
    myColor.setHsl(0, 255, 128); // 鮮やかな赤
    
    painter.setBrush(myColor); // ここで色を設定
    painter.drawRect(10, 10, 100, 100);
    

QMLからのQColorの扱い

C++で定義したQColorをQMLに渡す場合や、QML側で色を扱う場合、型変換の問題が発生することがあります。

  • デバッグ
    QMLのJavaScriptデバッガを使って、QML側で受け取ったcolorプロパティがどのような値になっているかを確認します。
  • プロパティの登録
    C++のクラスをQMLに公開し、QColor型のプロパティを持つ場合、Q_PROPERTYマクロで正しく登録されていることを確認してください。
  • QMLのcolor型
    QMLではcolorという専用の型があり、C++のQColorは自動的にQMLのcolorに変換されます。しかし、QVariantなどを介して渡す場合に、型が正しく認識されないことがあります。


C++での基本的な使用例(QPainterによる描画)

この例では、QColor::setHsl()を使って異なるHSL値を持つ色を作成し、それをQPainterでウィジェット上に描画します。

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QColor>

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent *event) override;
};

#endif // MYWIDGET_H

mywidget.cpp

#include "mywidget.h"
#include <QPainter>
#include <QDebug> // デバッグ出力用

MyWidget::MyWidget(QWidget *parent)
    : QWidget{parent}
{
    setWindowTitle("QColor::setHsl() Examples");
    setFixedSize(400, 300); // ウィンドウサイズを固定
}

void MyWidget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing); // アンチエイリアシングを有効にする

    // 1. 基本的な赤 (Hue:0, Saturation:255, Lightness:128)
    QColor redColor;
    redColor.setHsl(0, 255, 128); // 鮮やかな赤
    painter.setBrush(redColor);
    painter.drawRect(20, 20, 80, 80);
    painter.drawText(20, 110, "Hue:0, Sat:255, Ligh:128 (Red)");
    qDebug() << "Red HSL Color:" << redColor.name(QColor::HexArgb); // デバッグ出力

    // 2. 青 (Hue:240, Saturation:200, Lightness:150)
    QColor blueColor;
    blueColor.setHsl(240, 200, 150); // やや明るい青
    painter.setBrush(blueColor);
    painter.drawRect(120, 20, 80, 80);
    painter.drawText(120, 110, "Hue:240, Sat:200, Ligh:150 (Blue)");
    qDebug() << "Blue HSL Color:" << blueColor.name(QColor::HexArgb);

    // 3. 半透明の緑 (Hue:120, Saturation:255, Lightness:100, Alpha:128)
    QColor greenTransparentColor;
    greenTransparentColor.setHsl(120, 255, 100, 128); // 鮮やかな緑、半透明
    painter.setBrush(greenTransparentColor);
    painter.drawRect(220, 20, 80, 80);
    painter.drawText(220, 110, "Hue:120, Sat:255, Ligh:100, Alpha:128 (Green)");
    qDebug() << "Green Transparent HSL Color:" << greenTransparentColor.name(QColor::HexArgb);

    // 4. 明度を変えたグレー(無彩色:Saturation=0)
    QColor grayColor;
    grayColor.setHsl(0, 0, 150); // 色相は無視される, 彩度0で灰色、明度150
    painter.setBrush(grayColor);
    painter.drawRect(320, 20, 80, 80);
    painter.drawText(320, 110, "Hue:0, Sat:0, Ligh:150 (Gray)");
    qDebug() << "Gray HSL Color:" << grayColor.name(QColor::HexArgb);

    // 5. setHslF() を使った例 (浮動小数点数)
    QColor yellowFColor;
    yellowFColor.setHslF(60.0 / 360.0, 1.0, 0.7); // HSLを0.0-1.0で指定 (鮮やかな黄色の明るめ)
    painter.setBrush(yellowFColor);
    painter.drawRect(20, 150, 80, 80);
    painter.drawText(20, 240, "Hue:60, Sat:1.0, Ligh:0.7 (YellowF)");
    qDebug() << "YellowF HSL Color:" << yellowFColor.name(QColor::HexArgb);
}

main.cpp

#include <QApplication>
#include "mywidget.h"

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

    MyWidget w;
    w.show();

    return a.exec();
}

このコードを実行すると、HSL値に基づいて異なる色が描画されたウィンドウが表示されます。コンソールには、それぞれの色の16進数ARGB値も出力されます。

C++で色を動的に変更する例(QSliderとの連携)

この例では、スライダーを使ってリアルタイムでHSL値を変更し、動的に色が変わる矩形を表示します。

colorsliderwidget.h

#ifndef COLORSLIDERWIDGET_H
#define COLORSLIDERWIDGET_H

#include <QWidget>
#include <QSlider>
#include <QLabel>
#include <QVBoxLayout>
#include <QHBoxLayout>

class ColorSliderWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ColorSliderWidget(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent *event) override;

private slots:
    void updateColor();

private:
    QSlider *hueSlider;
    QSlider *saturationSlider;
    QSlider *lightnessSlider;
    QSlider *alphaSlider;

    QLabel *hueLabel;
    QLabel *saturationLabel;
    QLabel *lightnessLabel;
    QLabel *alphaLabel;

    QColor currentColor; // 現在の色
};

#endif // COLORSLIDERWIDGET_H

colorsliderwidget.cpp

#include "colorsliderwidget.h"
#include <QPainter>
#include <QDebug>

ColorSliderWidget::ColorSliderWidget(QWidget *parent)
    : QWidget{parent}
{
    setWindowTitle("Dynamic HSL Color");
    setFixedSize(400, 450);

    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    QHBoxLayout *slidersLayout = new QHBoxLayout();
    QVBoxLayout *labelsLayout = new QVBoxLayout();

    // HUE スライダー
    hueSlider = new QSlider(Qt::Horizontal, this);
    hueSlider->setRange(0, 359);
    hueSlider->setValue(0);
    hueLabel = new QLabel("Hue: 0", this);
    slidersLayout->addWidget(hueSlider);
    labelsLayout->addWidget(hueLabel);

    // Saturation スライダー
    saturationSlider = new QSlider(Qt::Horizontal, this);
    saturationSlider->setRange(0, 255);
    saturationSlider->setValue(255);
    saturationLabel = new QLabel("Saturation: 255", this);
    slidersLayout->addWidget(saturationSlider);
    labelsLayout->addWidget(saturationLabel);

    // Lightness スライダー
    lightnessSlider = new QSlider(Qt::Horizontal, this);
    lightnessSlider->setRange(0, 255);
    lightnessSlider->setValue(128);
    lightnessLabel = new QLabel("Lightness: 128", this);
    slidersLayout->addWidget(lightnessSlider);
    labelsLayout->addWidget(lightnessLabel);

    // Alpha スライダー
    alphaSlider = new QSlider(Qt::Horizontal, this);
    alphaSlider->setRange(0, 255);
    alphaSlider->setValue(255);
    alphaLabel = new QLabel("Alpha: 255", this);
    slidersLayout->addWidget(alphaSlider);
    labelsLayout->addWidget(alphaLabel);

    mainLayout->addLayout(labelsLayout);
    mainLayout->addLayout(slidersLayout);

    // スライダーの値が変更されたらupdateColor()を呼び出す
    connect(hueSlider, &QSlider::valueChanged, this, &ColorSliderWidget::updateColor);
    connect(saturationSlider, &QSlider::valueChanged, this, &ColorSliderWidget::updateColor);
    connect(lightnessSlider, &QSlider::valueChanged, this, &ColorSliderWidget::updateColor);
    connect(alphaSlider, &QSlider::valueChanged, this, &ColorSliderWidget::updateColor);

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

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

    // 現在の色で矩形を描画
    painter.setBrush(currentColor);
    painter.drawRect(50, mainLayout()->geometry().bottom() + 20, 300, 100); // スライダーの下に描画
}

void ColorSliderWidget::updateColor()
{
    int h = hueSlider->value();
    int s = saturationSlider->value();
    int l = lightnessSlider->value();
    int a = alphaSlider->value();

    currentColor.setHsl(h, s, l, a); // HSL値で色を設定

    hueLabel->setText(QString("Hue: %1").arg(h));
    saturationLabel->setText(QString("Saturation: %1").arg(s));
    lightnessLabel->setText(QString("Lightness: %1").arg(l));
    alphaLabel->setText(QString("Alpha: %1").arg(a));

    // 色の更新を強制するために再描画を要求
    update();
}

main.cpp

#include <QApplication>
#include "colorsliderwidget.h"

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

    ColorSliderWidget w;
    w.show();

    return a.exec();
}

この例では、スライダーを動かすことでリアルタイムに色が変化する様子を確認できます。HSL色空間の各要素が色にどのように影響するかを視覚的に理解するのに役立ちます。

QMLでの使用例

QMLでは、colorプロパティがQColorに対応しており、HSL値を使用して色を指定するためのQt.hsla()関数が提供されています。

main.cpp (QMLをロードするためのC++コード)

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QColor> // QMLからQColorを直接扱うことは少ないですが、型として存在します

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

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
                     &app, []() { QCoreApplication::exit(-1); },
                     Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

main.qml

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15

Window {
    width: 640
    height: 480
    visible: true
    title: "QML HSL Color Example"

    Column {
        anchors.fill: parent
        anchors.margins: 20
        spacing: 10

        // HSLで色を設定するRectangle
        Rectangle {
            width: parent.width
            height: 100
            // Qt.hsla(h, s, l, a) を使用。h, s, l, a は全て0.0から1.0の範囲。
            // h: 0.0-1.0 (0.0=0度, 1.0=360度)
            // s: 0.0-1.0 (0.0=無彩色, 1.0=純色)
            // l: 0.0-1.0 (0.0=黒, 1.0=白, 0.5が中間)
            // a: 0.0-1.0 (0.0=透明, 1.0=不透明)
            color: Qt.hsla(0.0, 1.0, 0.5, 1.0) // 鮮やかな赤 (H:0, S:100%, L:50%, A:100%)
            border.color: "black"
            border.width: 1
            Text {
                text: "Red (H:0, S:1.0, L:0.5)"
                anchors.centerIn: parent
                color: "white"
                font.pixelSize: 18
            }
        }

        Rectangle {
            width: parent.width
            height: 100
            color: Qt.hsla(0.66, 0.8, 0.6, 0.7) // 青っぽい色 (H:240/360=0.66, S:0.8, L:0.6, A:0.7)
            border.color: "black"
            border.width: 1
            Text {
                text: "Bluish (H:0.66, S:0.8, L:0.6, A:0.7)"
                anchors.centerIn: parent
                color: "white"
                font.pixelSize: 18
            }
        }

        Rectangle {
            width: parent.width
            height: 100
            color: Qt.hsla(0.0, 0.0, 0.8, 1.0) // 明るいグレー (H:無視, S:0.0, L:0.8, A:1.0)
            border.color: "black"
            border.width: 1
            Text {
                text: "Light Gray (S:0.0, L:0.8)"
                anchors.centerIn: parent
                color: "black" // テキストの色を黒にして見やすくする
                font.pixelSize: 18
            }
        }
    }
}

このQMLコードでは、3つの異なるHSL値を持つ矩形が表示されます。QMLのQt.hsla()は、C++のQColor::setHslF()に相当し、全ての引数が0.0から1.0の浮動小数点数で指定される点に注意してください。



QColorクラスは、様々な色モデルでの色設定に対応しています。主な代替方法を以下に示します。

RGB(Red, Green, Blue)モデルでの設定

最も一般的な色モデルです。コンピュータのディスプレイは通常RGBで色を表現します。

  • コンストラクタによる初期化: QColorオブジェクトをRGB値で直接初期化できます。

    QColor color(255, 0, 0);         // 赤
    QColor color(0, 255, 0, 128);    // 半透明の緑
    
  • void QColor::setRgb(QRgb rgb): QRgb型(unsigned intでRGBA値をパックしたもの)で色を設定します。qRgb()qRgba()関数を使ってQRgb値を作成できます。

  • void QColor::setRgbF(qreal r, qreal g, qreal b, qreal a = 1.0): 浮動小数点数(0.0〜1.0)でRGBとアルファ値を指定します。

  • void QColor::setRgb(int r, int g, int b, int a = 255): 赤、緑、青、アルファ値(不透明度)を0〜255の整数で指定します。

    • r: 赤成分
    • g: 緑成分
    • b: 青成分
    • a: アルファ値(透明度、デフォルトは255で不透明)

使いどころ:

  • ハードウェア(ディスプレイなど)と直接的に連携する場合。
  • グラフィックデザインツールでRGB値が指定されている場合。
  • CSSやHTMLのカラーコード(#RRGGBB)に慣れている場合。

HSV(Hue, Saturation, Value)モデルでの設定

HSVはHSLと似ていますが、Value(明度)の定義が異なります。Valueは色の純粋な明るさを示し、HSLのLightnessは色の明るさの中間点(50%)が最も「明るい」と感じられるように設計されています。

  • void QColor::setHsvF(qreal h, qreal s, qreal v, qreal a = 1.0): 浮動小数点数(0.0〜1.0、ただしHueは0.0〜359.0)でHSVとアルファ値を指定します。

  • void QColor::setHsv(int h, int s, int v, int a = 255): 色相、彩度、明度、アルファ値を指定します。

    • h: 色相 (0〜359)
    • s: 彩度 (0〜255)
    • v: 明度 (0〜255, 0は黒、255は最も明るい)
    • a: アルファ値 (0〜255)

使いどころ:

  • 一部の画像処理アルゴリズムやカラーピッカーでHSVが使われている場合。
  • 色のバリエーションを生成する際に、明度を維持しつつ彩度や色相を変更したい場合。

CMYK(Cyan, Magenta, Yellow, Key/Black)モデルでの設定

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

  • void QColor::setCmykF(qreal c, qreal m, qreal y, qreal k, qreal a = 1.0): 浮動小数点数(0.0〜1.0)でCMYKとアルファ値を指定します。
  • void QColor::setCmyk(int c, int m, int y, int k, int a = 255): シアン、マゼンタ、イエロー、キー(黒)、アルファ値を0〜255の整数で指定します。

使いどころ:

  • CMYK値で指定された既存の色情報を扱う場合。
  • 印刷用のアプリケーションを開発する場合。

名前付き色(Named Colors)による設定

Qtは、Webカラーなど、多くの標準的な色名を認識します。

  • Qt::GlobalColor enum: Qt名前空間には、Qt::red, Qt::blue, Qt::white, Qt::black, Qt::transparentなどの基本的な色が定義されています。
  • void QColor::setNamedColor(const QString &name): "red", "blue", "darkGray", "lightBlue", "salmon"などの文字列で色を設定します。また、"#RRGGBB""#AARRGGBB"のような16進数表記の文字列も認識します。

使いどころ:

  • ユーザーが色名を直接入力するUIを実装する場合。
  • 一般的なWebカラーやCSSカラーを使用したい場合。
  • コードの可読性を高めたい場合(例: myColor = Qt::red;)。

QColor::from...() 静的関数による生成

QColorのインスタンスを生成する際に、直接指定した色モデルの値から作成できます。

  • (浮動小数点数版も同様にfromRgbF(), fromHslF()などがあります)
  • static QColor QColor::fromCmyk(int c, int m, int y, int k, int a = 255)
  • static QColor QColor::fromHsv(int h, int s, int v, int a = 255)
  • static QColor QColor::fromHsl(int h, int s, int l, int a = 255)
  • static QColor QColor::fromRgb(int r, int g, int b, int a = 255)

使いどころ:

  • 一時的なQColorオブジェクトを関数呼び出し内で作成する場合。
  • 新しいQColorオブジェクトを作成する際に、特定のカラーモデルで値を直接指定したい場合。

QColor::lighter() / QColor::darker()

既存の色の明度を相対的に調整したい場合に便利です。

  • QColor QColor::darker(int factor = 200) const: 現在の色よりも暗い色を返します。factorはパーセンテージで、デフォルトの200は50%暗くします。
  • QColor QColor::lighter(int factor = 150) const: 現在の色よりも明るい色を返します。factorはパーセンテージで、デフォルトの150は50%明るくします。

使いどころ:

  • グラデーションの中間色を生成する場合。
  • UI要素のホバー状態やクリック状態の色を、元の色から自動生成したい場合。