【Qtプログラミング】QColor::fromHsv()でよくあるエラーと解決策

2025-05-27

HSVカラーモデルとは?

色を表現する方法として、一般的にはRGB (Red, Green, Blue) がよく知られています。しかし、HSVは人間の色の知覚に近い形で色を表現できるため、デザイナーやアーティストにとって直感的で扱いやすいモデルです。

HSVは以下の3つの成分で構成されます。

  • V (Value - 明度): 色の明るさを表します。0から255までの値で表現され、値が大きいほど明るくなります。
    • 0: 黒
    • 255: 最も明るい色
  • S (Saturation - 彩度): 色の鮮やかさを表します。0から255までの値で表現され、値が大きいほど色が鮮やかになります。
    • 0: 完全に無彩色(グレー)
    • 255: 非常に鮮やかな色

QColor QColor::fromHsv() の役割

QColor QColor::fromHsv(int h, int s, int v, int a = 255) は、指定されたH(色相)、S(彩度)、V(明度)、そしてオプションでA(アルファ値 - 透明度)の各成分から QColor オブジェクトを生成します。

  • a: アルファ値 (Alpha)。透明度を表し、0(完全に透明)から255(完全に不透明)までの整数です。省略された場合は255(不透明)がデフォルト値となります。
  • v: 明度 (Value)。0〜255の範囲の整数です。
  • s: 彩度 (Saturation)。0〜255の範囲の整数です。
  • h: 色相 (Hue)。通常は0〜359の範囲の整数です。

この関数を使うことで、RGB値に直接変換することなく、HSV値を使って簡単に色を定義し、GUI要素の描画などに利用することができます。

#include <QApplication>
#include <QLabel>
#include <QColor>
#include <QPalette>

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

    // HSV値で赤色を生成 (H=0, S=255, V=255)
    QColor redColor = QColor::fromHsv(0, 255, 255);

    // HSV値で半透明の青色を生成 (H=240, S=255, V=255, A=128)
    QColor semiTransparentBlue = QColor::fromHsv(240, 255, 255, 128);

    // QLabelを作成し、色を設定
    QLabel label1("Hello, Qt!");
    QPalette palette1 = label1.palette();
    palette1.setColor(QPalette::Window, redColor); // 背景色を赤に
    label1.setAutoFillBackground(true);
    label1.setPalette(palette1);
    label1.setWindowTitle("Red Label");
    label1.show();

    QLabel label2("Transparent Blue!");
    QPalette palette2 = label2.palette();
    palette2.setColor(QPalette::Window, semiTransparentBlue); // 背景色を半透明の青に
    label2.setAutoFillBackground(true);
    label2.setPalette(palette2);
    label2.setWindowTitle("Blue Label");
    label2.show();

    return app.exec();
}

この例では、QColor::fromHsv() を使って2つの異なる色を作成し、それぞれの QLabel の背景色として設定しています。



パラメータの範囲外の値

最も一般的なエラーは、fromHsv() に渡す引数(H, S, V, A)が正しい範囲内にない場合です。

  • A (Alpha - アルファ値): 0〜255 の範囲です(デフォルトは255)。
  • V (Value - 明度): 0〜255 の範囲です。
  • S (Saturation - 彩度): 0〜255 の範囲です。
  • H (Hue - 色相): 通常 0〜359 の範囲です。360度は0度と同じ色を示します。

一般的なエラーの症状

  • 特に色相が0または360に近い場合、色のわずかな違いが大きく見えることがある。
  • 予期しない色が表示される(例: 常に黒、グレー、またはランダムな色)。
  • QColor オブジェクトが「無効 (invalid)」になる (isValid()false を返す)。

トラブルシューティング

  • デバッグ出力
    各パラメータの値を qDebug() などで出力し、意図しない値が渡されていないか確認します。
  • 範囲の強制
    必要に応じて、値を手動で適切な範囲に制限します。
    • h = h % 360; (色相を0〜359に丸める)
    • s = qBound(0, s, 255); (彩度を0〜255に制限)
    • v = qBound(0, v, 255); (明度を0〜255に制限)
    • a = qBound(0, a, 255); (アルファ値を0〜255に制限) qBound(min, value, max) はQtのユーティリティ関数で、valueminmax の間に制限します。
  • 入力値の確認
    fromHsv() に渡す前に、H, S, V, A の各値が上記の範囲内に収まっていることを確認します。

無彩色 (Achromatic Color) の色相 (Hue)

HSVモデルでは、彩度 (Saturation) が0の場合(つまり、グレーの場合)、色相 (Hue) は意味を持ちません。

一般的なエラーの症状

  • QColor::getHsv() で取得したHの値が -1 になることがある。
  • 彩度を0にしたのに、Hの値によって色の見た目が変わるように感じる(実際には変わらないはず)。

トラブルシューティング

  • 彩度優先
    無彩色を表現したい場合は、色相の値に関わらず、彩度 s0 に設定することが重要です。
  • 設計上の理解
    彩度が0のQColorオブジェクトの色相値は無意味であり、Qtの内部実装によっては -1 を返すことがあります。これはエラーではなく、HSVモデルの特性を反映したものです。

黒色または白色が表示される

特定のHSV値の組み合わせは、常に黒または白になります。

  • S (彩度) が 0 で、V (明度) が 255 の場合
    Hの値に関わらず、常にになります。
  • V (明度) が 0 の場合
    HとSの値に関わらず、常にになります。

一般的なエラーの症状

  • 様々なHSV値を指定しているのに、色が表示されずに黒や白ばかりになる。

トラブルシューティング

  • 例えば、グラデーションを生成する際に、明度を変化させるつもりが誤って彩度を0にしてしまい、グレーのグラデーションになってしまう、といったケースがあります。
  • 値の再確認
    意図的に黒や白を表示したい場合を除き、SやVの値が極端に小さい(またはVが極端に大きい)設定になっていないか確認します。

RGBへの変換後の色の違い

QColor::fromHsv() で作成した色を toRgb() でRGBに変換し、そのRGB値が他のアプリケーション(Photoshopなど)で表示される色と微妙に異なることがあります。

一般的なエラーの症状

  • Qtで表示される色が、他のツールで期待される色とわずかに違う。

トラブルシューティング

  • fromHsvF() および getHsvF() の利用
    より高い精度が必要な場合は、浮動小数点版の QColor::fromHsvF(qreal h, qreal s, qreal v, qreal a = 1.0)QColor::getHsvF(qreal *h, qreal *s, qreal *v, qreal *a = nullptr) const を使用することを検討してください。これらの関数は、各成分を 0.0 から 1.0 の範囲で扱います。
  • 異なるHSV/RGB変換アルゴリズム
    HSVとRGBの変換には複数のアルゴリズムが存在し、わずかな違いがあることがあります。Qtが採用しているアルゴリズムは標準的ですが、他のツールが異なるアルゴリズムを使用している可能性もあります。
  • 浮動小数点演算の丸め誤差
    HSVからRGBへの変換には浮動小数点演算が伴うため、わずかな丸め誤差が生じることがあります。これはほとんどの場合、視覚的に問題になることはありませんが、厳密な一致が必要な場合は考慮に入れる必要があります。

QColor::fromHsv() に不正な引数が渡された場合、生成される QColor オブジェクトは isValid() メソッドが false を返す「無効な (invalid)」状態になることがあります。

一般的なエラーの症状

  • エラーメッセージが表示されないまま、意図しない挙動になる。
  • QColor オブジェクトを何かに設定しても、色が反映されない。
  • Qtのドキュメントには、「パフォーマンス上の理由から、QColor はほとんどの場合、不正な色を無視し、その結果、無効な色を使用した場合の動作は未定義です」と記載されています。
  • isValid() のチェック
    QColor オブジェクトを生成した後、その有効性を if (!myColor.isValid()) { ... } のようにチェックする習慣をつけましょう。これにより、予期せぬ問題を早期に発見できます。


例1: 基本的な色の生成と表示

最も基本的な例として、特定のHSV値から色を生成し、QLabel の背景色として表示します。

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

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

    // 1. 真っ赤な色 (Hue:0, Saturation:255, Value:255)
    QColor redColor = QColor::fromHsv(0, 255, 255);
    qDebug() << "Red Color (HSV):" << redColor.hue() << redColor.saturation() << redColor.value();
    qDebug() << "Red Color (RGB):" << redColor.red() << redColor.green() << redColor.blue();

    QLabel label1("Pure Red");
    QPalette palette1 = label1.palette();
    palette1.setColor(QPalette::Window, redColor); // 背景色を設定
    label1.setAutoFillBackground(true); // 背景色の自動塗りつぶしを有効にする
    label1.setPalette(palette1);
    label1.setWindowTitle("Red Label");
    label1.setGeometry(100, 100, 200, 50); // 位置とサイズを設定
    label1.show();

    // 2. 彩度を下げた赤色 (くすんだ赤、ピンクに近い)
    QColor dullRedColor = QColor::fromHsv(0, 100, 200); // Saturationを低く、Valueを中程度に
    qDebug() << "Dull Red Color (HSV):" << dullRedColor.hue() << dullRedColor.saturation() << dullRedColor.value();
    qDebug() << "Dull Red Color (RGB):" << dullRedColor.red() << dullRedColor.green() << dullRedColor.blue();

    QLabel label2("Dull Red");
    QPalette palette2 = label2.palette();
    palette2.setColor(QPalette::Window, dullRedColor);
    label2.setAutoFillBackground(true);
    label2.setPalette(palette2);
    label2.setWindowTitle("Dull Red Label");
    label2.setGeometry(100, 160, 200, 50);
    label2.show();

    // 3. 明度を下げた赤色 (暗い赤、茶色に近い)
    QColor darkRedColor = QColor::fromHsv(0, 255, 100); // Valueを低く
    qDebug() << "Dark Red Color (HSV):" << darkRedColor.hue() << darkRedColor.saturation() << darkColor.value();
    qDebug() << "Dark Red Color (RGB):" << darkRedColor.red() << darkRedColor.green() << darkRedColor.blue();

    QLabel label3("Dark Red");
    QPalette palette3 = label3.palette();
    palette3.setColor(QPalette::Window, darkRedColor);
    label3.setAutoFillBackground(true);
    label3.setPalette(palette3);
    label3.setWindowTitle("Dark Red Label");
    label3.setGeometry(100, 220, 200, 50);
    label3.show();

    // 4. 半透明の緑色 (Alpha値を指定)
    QColor semiTransparentGreen = QColor::fromHsv(120, 200, 200, 128); // Hue:緑, Alpha:半透明
    qDebug() << "Semi-Transparent Green (HSV):" << semiTransparentGreen.hue() << semiTransparentGreen.saturation() << semiTransparentGreen.value() << semiTransparentGreen.alpha();
    qDebug() << "Semi-Transparent Green (RGBA):" << semiTransparentGreen.red() << semiTransparentGreen.green() << semiTransparentGreen.blue() << semiTransparentGreen.alpha();

    QLabel label4("Semi-Transparent Green");
    QPalette palette4 = label4.palette();
    palette4.setColor(QPalette::Window, semiTransparentGreen);
    label4.setAutoFillBackground(true);
    label4.setPalette(palette4);
    label4.setWindowTitle("Transparent Green Label");
    label4.setGeometry(100, 280, 200, 50);
    label4.show();

    return app.exec();
}

解説

  • QDebug() を使って、生成された色のHSV値とRGB値を確認しています。これにより、fromHsv() がどのように色を生成しているかを理解しやすくなります。
  • QLabel::setAutoFillBackground(true) は、QPalette::Window に設定した背景色を適用するために必要です。
  • QColor::fromHsv(h, s, v, a) の各引数に適切な値を渡すことで、様々な色を生成できます。

例2: 色相環の生成

色相 (Hue) を変化させて、HSVカラーモデルの直感的な性質を視覚的に確認する例です。

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

class ColorCircleWidget : public QWidget
{
public:
    ColorCircleWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        setFixedSize(300, 300);
    }

protected:
    void paintEvent(QPaintEvent *event) override
    {
        Q_UNUSED(event);
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing); // アンチエイリアシングを有効に

        int centerX = width() / 2;
        int centerY = height() / 2;
        int radius = qMin(width(), height()) / 2 - 10; // 枠との余白

        // 色相環を描画
        for (int h = 0; h < 360; ++h) {
            // 各色相で最大の彩度と明度を持つ色を生成
            QColor color = QColor::fromHsv(h, 255, 255);
            painter.setPen(color); // 描画色を設定

            // 角度から円周上の座標を計算
            qreal angleRad = qDegreesToRadians(static_cast<qreal>(h));
            qreal x1 = centerX + radius * qCos(angleRad);
            qreal y1 = centerY + radius * qSin(angleRad);
            qreal x2 = centerX + (radius - 5) * qCos(angleRad); // 少し内側の点
            qreal y2 = centerY + (radius - 5) * qSin(angleRad); // 少し内側の点

            painter.drawLine(QPointF(x1, y1), QPointF(x2, y2)); // 細い線で色相を表現
        }

        // 中心に彩度と明度を変化させる四角形を描画 (例として)
        // 中央の四角形の色は、H=0 (赤)、SとVを変化させている
        QColor centerColor = QColor::fromHsv(0, 150, 200);
        painter.setBrush(centerColor);
        painter.setPen(Qt::NoPen);
        painter.drawRect(centerX - 30, centerY - 30, 60, 60);

        painter.setPen(Qt::black);
        painter.drawText(centerX - 50, centerY + 50, "HSV Color Circle");
    }
};

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

    ColorCircleWidget widget;
    widget.setWindowTitle("HSV Color Circle Example");
    widget.show();

    return app.exec();
}

解説

  • qDegreesToRadians は、角度をラジアンに変換するQtの関数です。
  • 円周上に各色の短い線を描画することで、色相環を視覚的に表現しています。
  • for ループで h (色相) を0から359まで変化させ、それぞれ QColor::fromHsv(h, 255, 255) で色を生成しています。
  • QPainter を使用してカスタムウィジェットに描画しています。

QSlider を使ってH, S, Vの各値をユーザーが変更できるようにし、リアルタイムで色の変化を確認する例です。

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QSlider>
#include <QLabel>
#include <QColor>
#include <QPalette>
#include <QSpinBox> // 数値入力用

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

public:
    HsvColorPicker(QWidget *parent = nullptr) : QWidget(parent)
    {
        QVBoxLayout *mainLayout = new QVBoxLayout(this);

        // カラープレビューラベル
        m_colorPreviewLabel = new QLabel("Color Preview");
        m_colorPreviewLabel->setFixedSize(200, 100);
        m_colorPreviewLabel->setAlignment(Qt::AlignCenter);
        m_colorPreviewLabel->setAutoFillBackground(true);
        mainLayout->addWidget(m_colorPreviewLabel, 0, Qt::AlignCenter);

        // H, S, V, A 各スライダーとスピンボックス
        mainLayout->addLayout(createColorControl("Hue (0-359)", 0, 359, &m_hueSlider, &m_hueSpinBox));
        mainLayout->addLayout(createColorControl("Saturation (0-255)", 0, 255, &m_saturationSlider, &m_saturationSpinBox));
        mainLayout->addLayout(createColorControl("Value (0-255)", 0, 255, &m_valueSlider, &m_valueSpinBox));
        mainLayout->addLayout(createColorControl("Alpha (0-255)", 0, 255, &m_alphaSlider, &m_alphaSpinBox));

        // 初期値の設定
        m_hueSlider->setValue(0);
        m_saturationSlider->setValue(255);
        m_valueSlider->setValue(255);
        m_alphaSlider->setValue(255);

        // スライダーの値が変更されたときに色を更新
        connect(m_hueSlider, &QSlider::valueChanged, this, &HsvColorPicker::updateColor);
        connect(m_saturationSlider, &QSlider::valueChanged, this, &HsvColorPicker::updateColor);
        connect(m_valueSlider, &QSlider::valueChanged, this, &HsvColorPicker::updateColor);
        connect(m_alphaSlider, &QSlider::valueChanged, this, &HsvColorPicker::updateColor);

        // スピンボックスの値が変更されたときにスライダーと色を更新
        connect(m_hueSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), m_hueSlider, &QSlider::setValue);
        connect(m_saturationSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), m_saturationSlider, &QSlider::setValue);
        connect(m_valueSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), m_valueSlider, &QSlider::setValue);
        connect(m_alphaSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), m_alphaSlider, &QSlider::setValue);

        // スライダーの値が変更されたときにスピンボックスを更新
        connect(m_hueSlider, &QSlider::valueChanged, m_hueSpinBox, &QSpinBox::setValue);
        connect(m_saturationSlider, &QSlider::valueChanged, m_saturationSpinBox, &QSpinBox::setValue);
        connect(m_valueSlider, &QSlider::valueChanged, m_valueSpinBox, &QSpinBox::setValue);
        connect(m_alphaSlider, &QSlider::valueChanged, m_alphaSpinBox, &QSpinBox::setValue);

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

private slots:
    void updateColor()
    {
        int h = m_hueSlider->value();
        int s = m_saturationSlider->value();
        int v = m_valueSlider->value();
        int a = m_alphaSlider->value();

        QColor color = QColor::fromHsv(h, s, v, a);
        QPalette palette = m_colorPreviewLabel->palette();
        palette.setColor(QPalette::Window, color);
        m_colorPreviewLabel->setPalette(palette);

        // デバッグ出力
        qDebug() << "H:" << h << "S:" << s << "V:" << v << "A:" << a
                 << "-> RGB:" << color.red() << color.green() << color.blue() << color.alpha()
                 << "isValid:" << color.isValid();
    }

private:
    QHBoxLayout* createColorControl(const QString& labelText, int min, int max, QSlider** slider, QSpinBox** spinBox)
    {
        QHBoxLayout* layout = new QHBoxLayout();
        QLabel* label = new QLabel(labelText);
        *slider = new QSlider(Qt::Horizontal);
        (*slider)->setRange(min, max);
        (*slider)->setTickPosition(QSlider::TicksBelow);
        (*slider)->setTickInterval((max - min) / 10);

        *spinBox = new QSpinBox();
        (*spinBox)->setRange(min, max);

        layout->addWidget(label);
        layout->addWidget(*slider);
        layout->addWidget(*spinBox);
        return layout;
    }

    QLabel* m_colorPreviewLabel;
    QSlider* m_hueSlider;
    QSlider* m_saturationSlider;
    QSlider* m_valueSlider;
    QSlider* m_alphaSlider;
    QSpinBox* m_hueSpinBox;
    QSpinBox* m_saturationSpinBox;
    QSpinBox* m_valueSpinBox;
    QSpinBox* m_alphaSpinBox;
};

#include "main.moc" // mocファイルを含める (シグナル/スロットのため)

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

    HsvColorPicker picker;
    picker.setWindowTitle("HSV Color Picker");
    picker.show();

    return app.exec();
}
  • main.moc ファイルを含めることを忘れないでください。これは、カスタムクラスでシグナルとスロットを使用するためにQtのメタオブジェクトコンパイラ (moc) によって生成されるファイルです。通常、ビルドシステムが自動的に処理します。
  • qDebug() を使って、リアルタイムでHSVとRGBの値、および色の有効性を確認できます。
  • updateColor() スロット内で、現在のスライダーの値から QColor::fromHsv() を使って新しい色を生成し、m_colorPreviewLabel の背景色を更新しています。
  • スライダーまたはスピンボックスの値が変更されるたびに updateColor() スロットが呼び出されます。
  • QSliderQSpinBox を使って、ユーザーがH, S, V, Aの値を視覚的および数値的に調整できるようにしています。


RGB (Red, Green, Blue) モデルによる色の生成

RGBは最も一般的なカラーモデルであり、Qtでも強力にサポートされています。

  • QColor::setRgb(int r, int g, int b, int a = 255) (既存のオブジェクトの変更) 既に存在する QColor オブジェクトのRGB値を変更する場合に使用します。

    #include <QColor>
    #include <QDebug>
    
    int main() {
        QColor color; // デフォルトは無効な色
        color.setRgb(255, 165, 0); // オレンジに設定
        qDebug() << "Orange (RGB):" << color.red() << color.green() << color.blue();
        return 0;
    }
    
  • QColor(int r, int g, int b, int a = 255) (コンストラクタ) QColor クラスのコンストラクタを使用して、RGB値を直接指定することもできます。これは fromRgb() とほぼ同じ機能を提供します。

    #include <QColor>
    #include <QDebug>
    
    int main() {
        QColor green(0, 255, 0); // 純粋な緑
        qDebug() << "Green (RGB):" << green.red() << green.green() << green.blue();
        return 0;
    }
    
  • QColor::fromRgb(int r, int g, int b, int a = 255) これは fromHsv() と同様に、RGB値を直接指定して QColor を作成する静的関数です。 r, g, b はそれぞれ赤、緑、青の成分で、0から255までの整数値です。a はアルファ値(透明度)で、デフォルトは255(不透明)です。

    #include <QColor>
    #include <QDebug>
    
    int main() {
        QColor red = QColor::fromRgb(255, 0, 0); // 純粋な赤
        QColor blue = QColor::fromRgb(0, 0, 255, 128); // 半透明の青
        qDebug() << "Red (RGB):" << red.red() << red.green() << red.blue();
        qDebug() << "Blue (RGBA):" << blue.red() << blue.green() << blue.blue() << blue.alpha();
        return 0;
    }
    

HSL (Hue, Saturation, Lightness) モデルによる色の生成

HSLはHSVと似ていますが、明度 (Value) の代わりに輝度 (Lightness) を使用します。HSLは、人間の知覚により近いとされ、特にWebデザインなどでよく使われます。

  • QColor::setHsl(int h, int s, int l, int a = 255) 既存の QColor オブジェクトのHSL値を変更します。

  • QColor::fromHsl(int h, int s, int l, int a = 255) Hue (色相、0-359)、Saturation (彩度、0-255)、Lightness (輝度、0-255) を指定して QColor を作成します。

    #include <QColor>
    #include <QDebug>
    
    int main() {
        // HSLでの真っ赤: Hue=0, Saturation=255, Lightness=128 (ちょうど中間の明るさ)
        QColor hslRed = QColor::fromHsl(0, 255, 128);
        qDebug() << "HSL Red (RGB):" << hslRed.red() << hslRed.green() << hslRed.blue();
    
        // 非常に明るい緑 (H=120, S=255, L=200)
        QColor brightGreen = QColor::fromHsl(120, 255, 200);
        qDebug() << "Bright Green (RGB):" << brightGreen.red() << brightGreen.green() << brightGreen.blue();
        return 0;
    }
    

CMYK (Cyan, Magenta, Yellow, Key/Black) モデルによる色の生成

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

  • QColor::setCmyk(int c, int m, int y, int k, int a = 255) 既存の QColor オブジェクトのCMYK値を変更します。

  • QColor::fromCmyk(int c, int m, int y, int k, int a = 255) Cyan (シアン)、Magenta (マゼンタ)、Yellow (イエロー)、Key (ブラック) の成分を指定して QColor を作成します。各成分は0から255までの整数値です。

    #include <QColor>
    #include <QDebug>
    
    int main() {
        // CMYKで黒 (K=255)
        QColor cmykBlack = QColor::fromCmyk(0, 0, 0, 255);
        qDebug() << "CMYK Black (RGB):" << cmykBlack.red() << cmykBlack.green() << cmykBlack.blue();
    
        // CMYKで青 (C=255, M=255)
        QColor cmykBlue = QColor::fromCmyk(255, 255, 0, 0);
        qDebug() << "CMYK Blue (RGB):" << cmykBlue.red() << cmykBlue.green() << cmykBlue.blue();
        return 0;
    }
    

色の名前を使用

Qtは、CSS/SVG1.0で定義されているような多くの標準的な色名をサポートしています。

  • QColor::setNamedColor(const QString &name) 既存の QColor オブジェクトに色名を設定します。

  • QColor(const QString &name) (コンストラクタ) 色名を文字列で指定して QColor を作成します。

    #include <QColor>
    #include <QDebug>
    
    int main() {
        QColor aliceBlue("aliceblue");
        QColor darkSlateGray("DarkSlateGray"); // 大文字小文字は区別しない
        qDebug() << "Alice Blue (RGB):" << aliceBlue.red() << aliceBlue.green() << aliceBlue.blue();
        qDebug() << "Dark Slate Gray (RGB):" << darkSlateGray.red() << darkSlateGray.green() << darkSlateGray.blue();
        return 0;
    }
    

16進数文字列を使用

Web開発で一般的な #RRGGBB#AARRGGBB 形式の16進数文字列も使用できます。

  • QColor(const QString &hexString) (コンストラクタ) 16進数文字列を直接コンストラクタに渡します。

    #include <QColor>
    #include <QDebug>
    
    int main() {
        QColor hexRed("#FF0000"); // 赤
        QColor hexSemiTransparentGreen("#8000FF00"); // 半透明の緑 (ARGB)
        qDebug() << "Hex Red (RGB):" << hexRed.red() << hexRed.green() << hexRed.blue();
        qDebug() << "Hex Semi-Transparent Green (RGBA):" << hexSemiTransparentGreen.red() << hexSemiTransparentGreen.green() << hexSemiTransparentGreen.blue() << hexSemiTransparentGreen.alpha();
        return 0;
    }
    

Qtのグローバルカラー定数を使用

Qt::GlobalColor enum には、一般的な基本色が定義されています。

  • QColor(Qt::GlobalColor color) (コンストラクタ) Qtが提供する事前定義された色定数を使用します。

    #include <QColor>
    #include <QDebug>
    #include <QtGlobal> // Qt::GlobalColor のために必要
    
    int main() {
        QColor qtBlue = Qt::blue;
        QColor qtRed = Qt::red;
        qDebug() << "Qt Blue (RGB):" << qtBlue.red() << qtBlue.green() << qtBlue.blue();
        qDebug() << "Qt Red (RGB):" << qtRed.red() << qtRed.green() << qtRed.blue();
        return 0;
    }
    

QColor オブジェクトは、既存の色から新しい色を派生させるための便利なメソッドも提供しています。

  • QColor::toHsv() const, QColor::toRgb() const, QColor::toHsl() const, QColor::toCmyk() const 現在の色を別のカラーモデルの QColor オブジェクトに変換します。これにより、一度RGBで定義した色をHSV値で操作するといったことが可能になります。

    #include <QColor>
    #include <QDebug>
    
    int main() {
        QColor originalColor = QColor::fromRgb(100, 150, 200); // 青っぽい色
        qDebug() << "Original RGB:" << originalColor.red() << originalColor.green() << originalColor.blue();
    
        QColor lighterColor = originalColor.lighter(); // 少し明るく
        qDebug() << "Lighter RGB:" << lighterColor.red() << lighterColor.green() << lighterColor.blue();
    
        QColor hsvVersion = originalColor.toHsv(); // HSVに変換
        qDebug() << "Original (HSV):" << hsvVersion.hue() << hsvVersion.saturation() << hsvVersion.value();
        return 0;
    }
    
  • QColor::darker(int factor = 200) const 既存の色を暗くします。factor は暗さの度合い(デフォルトは200%)。

  • QColor::lighter(int factor = 150) const 既存の色を明るくします。factor は明るさの度合い(デフォルトは150%)。