【Qt入門】QColor::fromRgbF()で始める高精度カラープログラミング

2025-05-27

QColor QColor::fromRgbF() は、Qt の QColor クラスが提供する静的(static)な関数です。この関数は、指定された浮動小数点数のR(赤)、G(緑)、B(青)およびA(アルファ、透明度)の各成分から新しい QColor オブジェクトを作成して返します。

特徴

  • アルファ値(透明度): オプションでアルファ値(透明度)を指定できます。アルファ値も0.0(完全な透明)から1.0(完全な不透明)までの範囲で指定します。アルファ値を省略した場合、デフォルトで1.0(完全な不透明)が設定されます。
  • 静的関数: QColor クラスのインスタンスを作成せずに直接呼び出すことができます(例: QColor::fromRgbF(0.5, 0.2, 0.8, 1.0))。
  • 浮動小数点数(qreal または double)を使用: 通常の fromRgb() 関数が0から255までの整数値で色成分を指定するのに対し、fromRgbF()0から1.0までの浮動小数点数 で色成分(赤、緑、青、アルファ)を指定します。

なぜ浮動小数点数を使うのか?

浮動小数点数を使用する利点はいくつかあります。

  1. より高い精度: 整数値(0-255)では256段階の表現しかできませんが、浮動小数点数(0.0-1.0)を使うことで、よりきめ細やかな色の指定が可能になります。これは、色の計算や補間を行う際に特に役立ちます。
  2. 他のシステムとの互換性: OpenGLなどのグラフィックスAPIでは、色成分を0.0から1.0の浮動小数点数で扱うのが一般的です。そのため、fromRgbF() を使うことで、Qtアプリケーションとこれらのシステムとの間で色の値をより簡単にやり取りできます。

関数のシグネチャ

QColor QColor::fromRgbF(qreal r, qreal g, qreal b, qreal a = 1.0)
  • a: アルファ成分 (0.0 ~ 1.0, デフォルトは 1.0)
  • b: 青成分 (0.0 ~ 1.0)
  • g: 緑成分 (0.0 ~ 1.0)
  • r: 赤成分 (0.0 ~ 1.0)

使用例

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

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

    // 赤成分0.5 (中程度の赤), 緑成分0.2, 青成分0.8 の色を作成
    // アルファ値はデフォルトの1.0 (完全な不透明)
    QColor myColor1 = QColor::fromRgbF(0.5, 0.2, 0.8);

    // 赤成分0.9, 緑成分0.1, 青成分0.1 で、アルファ値0.5 (半透明) の色を作成
    QColor myColor2 = QColor::fromRgbF(0.9, 0.1, 0.1, 0.5);

    QLabel label1("Hello QColor fromRgbF! (Opaque)");
    QPalette palette1 = label1.palette();
    palette1.setColor(QPalette::Window, myColor1);
    label1.setAutoFillBackground(true);
    label1.setPalette(palette1);
    label1.setGeometry(100, 100, 300, 50);

    QLabel label2("Hello QColor fromRgbF! (Semi-transparent)");
    QPalette palette2 = label2.palette();
    palette2.setColor(QPalette::Window, myColor2);
    label2.setAutoFillBackground(true);
    label2.setPalette(palette2);
    label2.setGeometry(100, 160, 300, 50);

    label1.show();
    label2.show();

    return app.exec();
}

この例では、2つの QLabel を作成し、それぞれ異なる QColor::fromRgbF() で作成した色で背景を設定しています。一つは不透明な色、もう一つは半透明な色です。



範囲外の浮動小数点数を与える

QColor::fromRgbF() の最も一般的な誤用は、色成分(R, G, B, A)に 0から1.0の範囲外の浮動小数点数 を与えてしまうことです。

エラーの症状:

  • 警告メッセージ: Qt のデバッグ出力に「QColor::fromRgbF: RGB parameters out of range」のような警告が表示されることがあります。ただし、この警告は必ずしもプログラムのクラッシュを引き起こすわけではありません。
  • 期待する色にならない: 例えば、1.5 のように1.0を超える値を与えると、色が期待よりも明るくなったり、白っぽくなったりします。負の数を与えると、黒っぽくなることがあります。

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

  • 計算結果のクランプ: 色成分を計算で導き出す場合、計算結果が範囲外になる可能性があります。その場合、qBound()std::clamp() (C++17以降) を使用して、値を0.0から1.0の間に「クランプ(clamp)」してください。

    #include <QColor>
    #include <QtMath> // qBound() を使用する場合
    #include <algorithm> // std::clamp() を使用する場合
    
    // ...
    
    qreal calculatedRed = someValue / maxValue; // 例えば計算結果が1.5になる可能性
    qreal clampedRed = qBound(0.0, calculatedRed, 1.0); // 0.0と1.0の間にクランプ
    // あるいは
    // qreal clampedRed = std::clamp(calculatedRed, 0.0, 1.0);
    
    QColor myColor = QColor::fromRgbF(clampedRed, greenValue, blueValue);
    
  • 入力値の確認: fromRgbF() に渡す r, g, b, a の各引数が、常に 0から1.0の範囲内 にあることを確認してください。

整数値の fromRgb() と混同する

QColor::fromRgbF() は浮動小数点数を使用しますが、QColor::fromRgb() は0から255までの整数値を使用します。これらを混同すると、予期せぬ色になります。

エラーの症状:

  • 色が非常に暗い/明るい: 例えば、QColor::fromRgbF(255, 0, 0) のように指定すると、255 は1.0をはるかに超えるため、非常に明るい(ほぼ白に近い)赤になるか、あるいは警告が出て期待通りの赤になりません。

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

  • 変換: 整数値から浮動小数点数に変換する場合は、各成分を255.0で割ることを忘れないでください。

    int r_int = 255;
    int g_int = 128;
    int b_int = 0;
    
    QColor colorFromInt = QColor::fromRgb(r_int, g_int, b_int); // 整数値でオレンジ
    
    // 浮動小数点数に変換
    qreal r_float = r_int / 255.0;
    qreal g_float = g_int / 255.0;
    qreal b_float = b_int / 255.0;
    
    QColor colorFromFloat = QColor::fromRgbF(r_float, g_float, b_float); // 浮動小数点数でオレンジ
    
  • 関数の使い分け: 0-255の整数値で色を指定したい場合は QColor::fromRgb() を、0.0-1.0の浮動小数点数で指定したい場合は QColor::fromRgbF() を正しく使い分けてください。

アルファチャンネルの無視または誤解

fromRgbF() の最後の引数 a はアルファチャンネル(透明度)を表し、デフォルト値は 1.0(完全な不透明)です。これを意識しないと、意図しない透明度になることがあります。

エラーの症状:

  • 色が重なって見える: 背景色と混ざり合い、期待する色合いと異なる見た目になることがあります。
  • 色が薄い/消える: 透明度を考慮せずにコードを書くと、オブジェクトが予期せず半透明になったり、完全に透明になったりして表示されません。

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

  • 描画コンテキストの確認: 透明な色を QPainter で描画する場合、描画先の QPaintDeviceQWidgetQPixmap など)がアルファチャンネルをサポートしているか、および QPainter のブレンドモードが適切に設定されているかを確認してください。

    // 半透明な赤
    QColor semiTransparentRed = QColor::fromRgbF(1.0, 0.0, 0.0, 0.5);
    
    // QPainter で描画する場合
    QPainter painter(this); // 例えば QWidget の paintEvent 内
    painter.setBrush(semiTransparentRed);
    painter.drawRect(50, 50, 100, 100);
    
  • 明示的なアルファ値の指定: 透明度を制御したい場合は、必ず a 引数を明示的に指定してください。

浮動小数点精度による微細な誤差

qreal (通常は double) は浮動小数点数であるため、ごくわずかな計算誤差が生じることがあります。これは通常視覚的に問題になることは少ないですが、厳密な色の比較などを行う場合に注意が必要です。

エラーの症状:

  • 色の比較が失敗する: QColor オブジェクト同士を == 演算子で比較した場合、目視では同じに見える色でも、内部的な浮動小数点数の微細な誤差によって false が返されることがあります。

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

  • 色の比較には QColor::isValid()QColor::rgb() を利用: 厳密な浮動小数点数の比較は避け、QColor の内部的な整数表現(QRgb)に変換してから比較するか、色の妥当性を isValid() で確認する方が安全です。または、許容誤差範囲内での比較ロジックを実装します。

    QColor color1 = QColor::fromRgbF(0.123456789, 0.987654321, 0.5);
    QColor color2 = QColor::fromRgbF(0.123456788, 0.987654320, 0.5);
    
    if (color1 == color2) {
        // 浮動小数点誤差でfalseになる可能性がある
    }
    
    // より安全な比較方法
    if (color1.rgb() == color2.rgb()) {
        // QRgb 形式で比較
    }
    

QML と C++ 間での QColor の受け渡し

QML と C++ の間で QColor オブジェクトをやり取りする場合、型変換やプロパティのバインディングに関する問題が発生することがあります。

エラーの症状:

  • 「TypeError: Type error.」などのQML実行時エラー: 特にQMLのバージョンや文法に誤りがある場合に発生しやすい。
  • QML側で色が表示されない、またはエラーが発生する: QColorQ_PROPERTYQ_INVOKABLE 関数で公開しているにもかかわらず、QML側で色が正しく設定されない。

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

  • Qt のバージョンを確認: 使用している Qt のバージョンによって、QML と C++ の連携の挙動が異なる場合があります。
  • QVariant 経由での受け渡し: QColor を直接渡すのが難しい場合は、QVariant にラップして渡すことも可能ですが、多くの場合、直接渡す方が推奨されます。
  • QML 側でのアクセス: QML 側では、C++ オブジェクトのプロパティとして直接アクセスできます(例: myCppObject.colorName)。
  • Q_PROPERTY の設定: C++ 側で QColor をプロパティとして公開する場合は、Q_PROPERTY(QColor colorName READ getColorName WRITE setColorName NOTIFY colorNameChanged) のように正しく定義されているか確認します。
  • QColor の直接受け渡し: Qt は通常、C++ の QColor を QML の color 型に自動的に変換してくれます。特別な変換ロジックは不要なことが多いです。


基本的な色の作成と表示

最も基本的な使用例です。QLabel の背景色を設定してみます。

#include <QApplication>
#include <QLabel>
#include <QColor>
#include <QPalette> // QWidget の背景色を設定するために必要

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

    // 完全な赤 (R: 1.0, G: 0.0, B: 0.0)
    QColor redColor = QColor::fromRgbF(1.0, 0.0, 0.0);

    // 半透明な青 (R: 0.0, G: 0.0, B: 1.0, Alpha: 0.5)
    QColor semiTransparentBlue = QColor::fromRgbF(0.0, 0.0, 1.0, 0.5);

    // ラベル1: 赤色
    QLabel label1("Solid Red");
    QPalette palette1 = label1.palette(); // 現在のパレットを取得
    palette1.setColor(QPalette::Window, redColor); // Windowロールの背景色を設定
    label1.setAutoFillBackground(true); // 背景色を自動で塗りつぶす設定
    label1.setPalette(palette1); // 新しいパレットをラベルに適用
    label1.setGeometry(50, 50, 200, 50); // 位置とサイズを設定
    label1.show();

    // ラベル2: 半透明な青色
    QLabel label2("Semi-transparent Blue");
    QPalette palette2 = label2.palette();
    palette2.setColor(QPalette::Window, semiTransparentBlue);
    label2.setAutoFillBackground(true);
    label2.setPalette(palette2);
    label2.setGeometry(50, 120, 200, 50);
    label2.show();

    return app.exec();
}

解説:

  • QPalette を使用して、ウィジェットの背景色を変更しています。setAutoFillBackground(true) を設定することで、QPalette::Window ロールに設定された色がウィジェットの背景に適用されます。
  • QColor::fromRgbF(0.0, 0.0, 1.0, 0.5) は、青成分が最大、赤と緑がゼロ、アルファ値が 0.5 (半透明) の青色を作成します。
  • QColor::fromRgbF(1.0, 0.0, 0.0) は、赤成分が最大 (1.0)、緑と青がゼロ (0.0) の完全に不透明な赤色を作成します。

スライダーで色を動的に変更する

QSlider を使って、ユーザーがリアルタイムで色成分を調整できるようにする例です。

#include <QApplication>
#include <QWidget>
#include <QSlider>
#include <QLabel>
#include <QVBoxLayout>
#include <QColor>
#include <QPalette>
#include <QtDebug> // デバッグ出力用

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

public:
    ColorChangerWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        redSlider = new QSlider(Qt::Horizontal, this);
        greenSlider = new QSlider(Qt::Horizontal, this);
        blueSlider = new QSlider(Qt::Horizontal, this);
        alphaSlider = new QSlider(Qt::Horizontal, this);
        colorDisplayLabel = new QLabel("Color Preview", this);

        // スライダーの範囲を0から100に設定し、後で0.0-1.0にマッピングします
        redSlider->setRange(0, 100);
        greenSlider->setRange(0, 100);
        blueSlider->setRange(0, 100);
        alphaSlider->setRange(0, 100);

        // 初期値を設定
        redSlider->setValue(100); // 赤を最大に
        greenSlider->setValue(0);
        blueSlider->setValue(0);
        alphaSlider->setValue(100); // 不透明に

        // レイアウトの設定
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(new QLabel("Red:", this));
        layout->addWidget(redSlider);
        layout->addWidget(new QLabel("Green:", this));
        layout->addWidget(greenSlider);
        layout->addWidget(new QLabel("Blue:", this));
        layout->addWidget(blueSlider);
        layout->addWidget(new QLabel("Alpha:", this));
        layout->addWidget(alphaSlider);
        layout->addWidget(colorDisplayLabel);

        // シグナルとスロットの接続
        connect(redSlider, &QSlider::valueChanged, this, &ColorChangerWidget::updateColor);
        connect(greenSlider, &QSlider::valueChanged, this, &ColorChangerWidget::updateColor);
        connect(blueSlider, &QSlider::valueChanged, this, &ColorChangerWidget::updateColor);
        connect(alphaSlider, &QSlider::valueChanged, this, &ColorChangerWidget::updateColor);

        // 初期表示色の更新
        updateColor();

        setWindowTitle("QColor fromRgbF() Demo");
        resize(300, 400);
    }

private slots:
    void updateColor()
    {
        // スライダーの整数値を 0.0-1.0 の浮動小数点数に変換
        qreal r = redSlider->value() / 100.0;
        qreal g = greenSlider->value() / 100.0;
        qreal b = blueSlider->value() / 100.0;
        qreal a = alphaSlider->value() / 100.0;

        // QColor::fromRgbF() で新しい色を作成
        QColor currentColor = QColor::fromRgbF(r, g, b, a);

        // QLabel の背景色を更新
        QPalette palette = colorDisplayLabel->palette();
        palette.setColor(QPalette::Window, currentColor);
        colorDisplayLabel->setAutoFillBackground(true);
        colorDisplayLabel->setPalette(palette);

        // デバッグ出力でRGBF値を確認
        qDebug() << QString("R: %1, G: %2, B: %3, A: %4").arg(r).arg(g).arg(b).arg(a);
    }

private:
    QSlider *redSlider;
    QSlider *greenSlider;
    QSlider *blueSlider;
    QSlider *alphaSlider;
    QLabel *colorDisplayLabel;
};

#include "main.moc" // Q_OBJECT マクロを使用する場合に必要

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ColorChangerWidget widget;
    widget.show();
    return app.exec();
}

解説:

  • Q_OBJECT マクロと main.moc ファイルのインクルードは、シグナルとスロットのメカニズムを機能させるために必要です。
  • 変換された浮動小数点数を使用して QColor::fromRgbF() で新しい QColor オブジェクトを作成し、colorDisplayLabel の背景色として設定します。
  • 各スライダーは0から100の範囲で値を持ち、updateColor() スロットで value() / 100.0 の計算によって 0.0から1.0の浮動小数点数に変換されます。
  • ColorChangerWidget クラスを定義し、4つの QSlider と1つの QLabel を配置しています。

QPainter を使用して、描画イベント内で QColor::fromRgbF() で作成した色を適用する例です。

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QColor>
#include <QTimer> // アニメーション用

class DrawingWidget : public QWidget
{
    Q_OBJECT

public:
    DrawingWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        setWindowTitle("QPainter fromRgbF() Demo");
        resize(400, 300);

        // アニメーション用のタイマー
        animationTimer = new QTimer(this);
        connect(animationTimer, &QTimer::timeout, this, &DrawingWidget::animateColor);
        animationTimer->start(50); // 50ミリ秒ごとに色を更新
        hue = 0.0; // 色相の初期値
    }

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

        // 背景を薄いグレーで塗りつぶす
        painter.fillRect(rect(), Qt::lightGray);

        // 浮動小数点数を使って色を生成
        // 例1: 固定の明るい緑
        QColor brightGreen = QColor::fromRgbF(0.2, 0.9, 0.2);
        painter.setBrush(brightGreen);
        painter.drawEllipse(50, 50, 100, 100);

        // 例2: 半透明なシアン
        QColor semiTransparentCyan = QColor::fromRgbF(0.0, 1.0, 1.0, 0.6); // 60%不透明
        painter.setBrush(semiTransparentCyan);
        painter.drawRect(180, 70, 100, 80);

        // 例3: アニメーションする色(HSV から RGBF に変換)
        // QColor::fromHsvF() を使って色相を変化させ、fromRgbF() で描画します
        QColor animatedColor = QColor::fromHsvF(hue, 1.0, 1.0); // 色相 (0.0-1.0), 彩度 (1.0), 明度 (1.0)
        painter.setBrush(animatedColor);
        painter.drawRoundedRect(50, 180, 200, 80, 20, 20);

        // 色の名前とRGBF値をテキストで表示
        painter.setPen(Qt::black);
        painter.drawText(60, 120, "Bright Green (0.2, 0.9, 0.2)");
        painter.drawText(190, 140, "Semi-transparent Cyan (0.0, 1.0, 1.0, 0.6)");
        painter.drawText(60, 230, QString("Animated Color (Hue: %1)").arg(static_cast<int>(hue * 360)));
    }

private slots:
    void animateColor()
    {
        hue += 0.01; // 色相を少しずつ変化させる
        if (hue > 1.0) {
            hue = 0.0; // 1.0を超えたら0.0に戻す
        }
        update(); // paintEvent を再描画させる
    }

private:
    QTimer *animationTimer;
    qreal hue; // 色相 (0.0 - 1.0)
};

#include "main.moc" // Q_OBJECT マクロを使用する場合に必要

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    DrawingWidget widget;
    widget.show();
    return app.exec();
}

解説:

  • この例では、色の生成に QColor::fromHsvF() も使って、色相が変化するアニメーションを示しています。fromHsvF()fromRgbF() と同様に浮動小数点数で色成分を指定します。
  • animateColor() スロットでは、hue の値を徐々に変化させ、update() を呼び出すことで paintEvent が再描画され、アニメーションが実現されます。
  • painter.setBrush() を使って塗りつぶしの色を設定します。ここで QColor::fromRgbF() で作成した色を渡します。
  • paintEvent 関数内で QPainter を使用して図形を描画します。


整数値でのRGB指定: QColor::fromRgb() またはコンストラクタ

最も一般的な代替方法は、各色成分を0から255までの整数値で指定することです。

  • QColor::fromRgb(QRgb rgb) / QColor::fromRgba(QRgb rgba): QRgb 型は、ARGB (Alpha, Red, Green, Blue) の各成分を1つの unsigned int にパックしたものです。 qRgb()qRgba() 関数を使って QRgb 値を作成し、それを fromRgb()fromRgba() に渡すこともできます。

    QRgb packedColor = qRgba(100, 150, 200, 255); // AARRGGBB形式
    QColor customColor = QColor::fromRgba(packedColor);
    
  • QColor::QColor(int r, int g, int b, int a = 255) (コンストラクタ): QColor オブジェクトを直接インスタンス化する際に、RGB とアルファ値を整数で指定できます。fromRgb() とほぼ同じ使い勝手です。

    QColor greenColor(0, 255, 0); // 完全な緑
    QColor lightGray(200, 200, 200); // 薄い灰色
    
  • QColor QColor::fromRgb(int r, int g, int b, int a = 255): fromRgbF() と同様に静的関数で、赤、緑、青、アルファ値をそれぞれ0から255の整数で指定します。アルファ値はオプションで、デフォルトは255(完全な不透明)です。

    QColor redColor = QColor::fromRgb(255, 0, 0); // 完全な赤
    QColor semiTransparentBlue = QColor::fromRgb(0, 0, 255, 128); // 半透明な青
    

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

HSV モデルは、色相 (Hue)、彩度 (Saturation)、明度 (Value) で色を表し、人間が色を認識する方法により近いため、色のバリエーションを生成したり、色相を変化させたりするのに適しています。

  • QColor QColor::fromHsvF(qreal h, qreal s, qreal v, qreal a = 1.0): 色相、彩度、明度、アルファをそれぞれ0.0から1.0の浮動小数点数で指定します。fromRgbF() のHSV版です。

    // 完全に飽和した明るいマゼンタ
    // Hue: 0.833 (300度), Saturation: 1.0, Value: 1.0
    QColor magentaHsvF = QColor::fromHsvF(0.833, 1.0, 1.0);
    
  • QColor QColor::fromHsv(int h, int s, int v, int a = 255): 色相 (0-359度)、彩度 (0-255)、明度 (0-255)、アルファ (0-255) を整数で指定します。

    // 完全に飽和した明るい黄色
    // Hue: 60度 (黄色), Saturation: 255 (完全な飽和), Value: 255 (最大の明度)
    QColor yellowHsv = QColor::fromHsv(60, 255, 255);
    

HSL (Hue, Saturation, Lightness) モデルでの指定

HSL モデルもHSVに似ていますが、明度 (Lightness) の概念が異なります。0.0が黒、0.5が純色、1.0が白になります。

  • QColor QColor::fromHslF(qreal h, qreal s, qreal l, qreal a = 1.0): 色相、彩度、明度、アルファをそれぞれ0.0から1.0の浮動小数点数で指定します。

    // 中程度の明るさの緑 (HSL)
    // Hue: 0.333 (120度), Saturation: 1.0, Lightness: 0.5
    QColor greenHslF = QColor::fromHslF(0.333, 1.0, 0.5);
    
  • QColor QColor::fromHsl(int h, int s, int l, int a = 255): 色相 (0-359度)、彩度 (0-255)、明度 (0-255)、アルファ (0-255) を整数で指定します。

CMYK (Cyan, Magenta, Yellow, Black) モデルでの指定

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

  • QColor QColor::fromCmykF(qreal c, qreal m, qreal y, qreal k, qreal a = 1.0): シアン、マゼンタ、イエロー、ブラック、アルファを浮動小数点数 (0.0-1.0) で指定します。

    // 純粋なシアン (CMYK)
    QColor cyanCmykF = QColor::fromCmykF(1.0, 0.0, 0.0, 0.0);
    
  • QColor QColor::fromCmyk(int c, int m, int y, int k, int a = 255): シアン、マゼンタ、イエロー、ブラック、アルファを整数 (0-255) で指定します。

事前定義された色 (Qt::GlobalColor)

Qt には、Qt::redQt::blue のように、よく使われる色が Qt::GlobalColor 列挙型として定義されています。

QColor predefinedRed = Qt::red;
QColor predefinedLightGray = Qt::lightGray;
QColor predefinedTransparent = Qt::transparent; // 完全な透明色

色の名前から作成: QColor::QColor(const QString &name) または QColor::setNamedColor() / QColor::fromString()

CSS や X11 で使われるような名前付きの色(例: "blue", "darkgreen", "LightGoldenRodYellow")を文字列で指定できます。

  • QColor QColor::fromString(QAnyStringView name) (Qt 6.4 以降): よりモダンな文字列からの色作成関数です。

    QColor namedColor2 = QColor::fromString("#FF00FF"); // 16進数RGB
    QColor namedColor3 = QColor::fromString("rgba(255, 0, 0, 128)"); // CSS形式
    
  • void QColor::setNamedColor(const QString &name): 既存の QColor オブジェクトの色を変更します。

    QColor myColor;
    myColor.setNamedColor("DarkSlateGray");
    
  • コンストラクタ:

    QColor namedColor1("steelblue"); // "steelblue" という名前の色
    

既存のQColorオブジェクトを変更するsetter関数

既に作成されている QColor オブジェクトの各成分を個別に変更することもできます。これには setRgbF(), setRgb(), setHsvF(), setHsv(), setAlphaF(), setAlpha() などのメソッドがあります。

QColor myColor = QColor::fromRgbF(0.5, 0.5, 0.5); // グレーで初期化

myColor.setRedF(0.9); // 赤成分だけ変更
myColor.setAlphaF(0.3); // 透明度を変更
myColor.setHsv(120, 200, 200); // HSV形式で色全体を変更 (整数値)

QColor::fromRgbF() は浮動小数点数でRGBを厳密に指定したい場合に非常に強力ですが、Qt の QColor クラスは、開発の要件や色の表現方法に応じて、他にも多くの柔軟な色指定・操作方法を提供しています。

  • setter関数: 既存の色の特定成分を微調整するのに便利。
  • 名前付きの色: 可読性が高く、標準的な色を簡単に指定できる。
  • CMYK: 印刷関連のアプリケーションで利用される。
  • HSV/HSL: 人間の色認識に近い表現で、動的な色生成やUIでの色選択に適している。
  • 整数値のRGB: 最もシンプルで一般的な方法。