Qt開発者必見!QColor::fromRgb()と代替手段で実現する美しいUI

2025-05-27

QColor QColor::fromRgb() は、QtフレームワークのQColorクラスが提供する静的(static)な関数です。この関数は、赤(Red)、緑(Green)、青(Blue)の各成分と、オプションでアルファ(Alpha)成分(透明度)を指定して、新しいQColorオブジェクトを作成するために使用されます。

静的関数であることの重要性

「静的関数」であるということは、QColorクラスのインスタンス(オブジェクト)を作成せずに、直接QColor::fromRgb()という形で呼び出すことができる、ということです。例えば、myColor.fromRgb(...)のように既存のQColorオブジェクトに対して呼び出す必要はありません。

パラメータ

この関数には、通常以下のいずれかのオーバーロードが使われます。

    • r: 赤成分 (0-255)
    • g: 緑成分 (0-255)
    • b: 青成分 (0-255)
    • この場合、アルファ値はデフォルトで255(完全に不透明)になります。
  1. QColor QColor::fromRgb(int r, int g, int b, int a = 255)

    • r: 赤成分 (0-255)
    • g: 緑成分 (0-255)
    • b: 青成分 (0-255)
    • a: アルファ成分(透明度) (0-255)。0が完全に透明、255が完全に不透明です。デフォルト値は255です。
  2. QColor QColor::fromRgb(QRgb rgb)

    • rgb: QRgb型(unsigned intのtypedef)の単一の整数値で、色成分(R, G, B, およびA)がパックされたものです。この形式は、qRgb()qRgba()といったヘルパー関数を使って作成できます。ただし、注意点として、このオーバーロードは渡されたQRgb値のアルファチャネルを無視し、常に不透明な色(アルファ値255)を返します。アルファチャネルを含めて色を作成したい場合は、QColor::fromRgba()を使用する必要があります。

使い方(例)

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

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

    // 赤、緑、青の成分で色を作成(完全に不透明)
    QColor redColor = QColor::fromRgb(255, 0, 0); // 赤色

    // 赤、緑、青、アルファ成分で色を作成(半透明の青色)
    QColor semiTransparentBlue = QColor::fromRgb(0, 0, 255, 128); // 128は半透明

    // QRgb値から色を作成(アルファ値は無視されるので不透明になる)
    QRgb packedRgb = qRgb(0, 255, 0); // 緑色
    QColor greenColor = QColor::fromRgb(packedRgb);

    // QColor::fromRgba() を使ってQRgbのアルファ値を考慮した例
    QRgb packedRgba = qRgba(255, 165, 0, 100); // オレンジ色で少し透明
    QColor transparentOrange = QColor::fromRgba(packedRgba); // QColor::fromRgba() を使用

    QLabel label1("Hello Red!");
    label1.setAutoFillBackground(true);
    QPalette palette1 = label1.palette();
    palette1.setColor(QPalette::Window, redColor);
    label1.setPalette(palette1);
    label1.show();

    QLabel label2("Hello Semi-Transparent Blue!");
    label2.setAutoFillBackground(true);
    QPalette palette2 = label2.palette();
    palette2.setColor(QPalette::Window, semiTransparentBlue);
    label2.setPalette(palette2);
    label2.show();

    QLabel label3("Hello Green (from QRgb)!");
    label3.setAutoFillBackground(true);
    QPalette palette3 = label3.palette();
    palette3.setColor(QPalette::Window, greenColor);
    label3.setPalette(palette3);
    label3.show();

    QLabel label4("Hello Transparent Orange (from QRgba)! If it's too transparent, you might not see it well.");
    label4.setAutoFillBackground(true);
    QPalette palette4 = label4.palette();
    palette4.setColor(QPalette::Window, transparentOrange);
    label4.setPalette(palette4);
    label4.show();

    return app.exec();
}


QColor QColor::fromRgb()自体は非常にシンプルで安定した関数ですが、使い方や関連する部分でいくつかの落とし穴があります。

RGB値の範囲外エラー (Out of Range Error)

エラーメッセージの例
QColor::fromRgb: RGB parameters out of range

原因
fromRgb()に渡す赤(R)、緑(G)、青(B)、そしてオプションのアルファ(A)の各成分は、0から255の整数値でなければなりません。この範囲外の値を渡すと、上記の警告が出力されます。

トラブルシューティング

  • 型変換
    必要であれば、値をqBound(0, value, 255)のような関数を使って、範囲内に丸めるか、static_cast<int>(value)などで明示的に型変換を行ってください。
  • データ型の確認
    意図せず負の値や255を超える値になるような計算が行われていないか確認します。例えば、画像のピクセルデータを扱う際に、符号なし整数(unsigned charなど)ではなく符号付き整数(charint)でデータを読み込んだ場合、負の値になる可能性があります。
  • 入力値の確認
    変数や計算結果をfromRgb()に渡す前に、その値が0〜255の範囲内にあることを確認してください。デバッガを使って値を確認するのが最も確実です。

アルファチャネルの取り扱いに関する誤解 (QRgbのオーバーロード)

原因
QColor::fromRgb(QRgb rgb)というオーバーロードが存在しますが、この関数は渡されたQRgb値のアルファ(透明度)情報を無視し、常に不透明な色(アルファ値255)を生成します。もしQRgb値に透明度情報が含まれていて、それを保持したい場合は、QColor::fromRgba(QRgb rgba)を使う必要があります。


QRgb myRgbaValue = qRgba(255, 0, 0, 100); // 赤色で半透明
QColor colorFromRgb = QColor::fromRgb(myRgbaValue);   // アルファ値が255になり、不透明な赤になる
QColor colorFromRgba = QColor::fromRgba(myRgbaValue); // アルファ値100を保持し、半透明な赤になる

トラブルシューティング

  • ドキュメントの確認
    Qtのドキュメントで各関数の詳細な動作を確認することが重要です。
  • 関数名の使い分け
    QRgb型の値から色を作成し、かつアルファチャネルも考慮したい場合は、必ずQColor::fromRgba()を使用してください。

不適切な色の利用 (Invalid QColor)

原因
QColor::fromRgb()自体は、範囲内の正しい値が与えられれば常に有効なQColorオブジェクトを返します。しかし、何らかの理由で(例えば、前述の範囲外エラーを無視して続行した場合など)、無効なQColorオブジェクトが作成され、それが描画処理などに渡されると、予期せぬ結果(色が正しく表示されない、描画されないなど)になることがあります。

トラブルシューティング

  • 警告メッセージの監視
    Qtは通常、不正な引数や状態を検出すると警告メッセージを出力します。アプリケーション出力(Application Output)ウィンドウやコンソールを常に確認し、これらの警告を見逃さないようにしてください。
  • isValid()の利用
    QColorオブジェクトが有効かどうかは、QColor::isValid()関数で確認できます。特にデバッグ時や、外部からの入力値に基づいて色を生成する場合に役立ちます。
    QColor myColor = QColor::fromRgb(300, 0, 0); // これはエラーを出すが、QColorオブジェクトは生成される
    if (!myColor.isValid()) {
        qDebug() << "エラー: 無効な色です!";
    }
    

色空間の誤解 (RGB以外の色表現との混同)

原因
fromRgb()は名前の通りRGB色空間の値を扱います。しかし、HSL(色相、彩度、輝度)やHSV(色相、彩度、明度)、CMYKなどの他の色空間と混同してしまうことがあります。それぞれの色空間には異なるパラメータ範囲と意味があります。

トラブルシューティング

  • 色の変換
    既存のQColorオブジェクトを別の色空間に変換したい場合は、toHsl(), toHsv(), toCmyk()などの関数を使用します。
  • 適切なファクトリ関数の選択
    HSLやHSVの値から色を作成したい場合は、QColor::fromHsl()QColor::fromHsv()などの対応するファクトリ関数を使用してください。

Qtの描画コンテキストと色の適用

原因
QColorオブジェクト自体は正しく作成されていても、それが描画されるコンテキスト(QPainter、ウィジェットのパレットなど)に適切に適用されていない場合、色が意図通りに表示されないことがあります。

  • スタイルシート
    スタイルシートを使用している場合、CSSの構文が正しいか、およびQColorで作成した色が適切に文字列(例: "#RRGGBB")に変換されているか確認します。QColor::name()関数で色名を文字列として取得できます。
  • ウィジェットのパレット
    ウィジェットの背景色や前景色を設定する場合、QPaletteを使用し、適切な役割(QPalette::WindowQPalette::WindowTextなど)に色を設定しているか確認します。setAutoFillBackground(true)を設定し忘れていると、背景色が反映されないこともあります。
  • QPainterへの適用
    QPainter::setPen()QPainter::setBrush()を使って色を設定しているか確認します。


QColor::fromRgb() は、RGB(赤、緑、青)の各成分を指定して色を生成するための静的(static)なヘルパー関数です。主に、プログラム中で動的に色を作成したり、特定のRGB値を持つ色が必要な場合に使用されます。

基本的なRGB値からの色生成 (不透明な色)

最も一般的な使用例です。赤、緑、青の各成分を0〜255の整数で指定します。

#include <QApplication>
#include <QLabel>
#include <QColor>
#include <QPalette> // QWidgetのパレットを操作するために必要

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

    // 真っ赤な色を作成 (R=255, G=0, B=0, A=255(デフォルト))
    QColor redColor = QColor::fromRgb(255, 0, 0);

    // 鮮やかな緑色を作成
    QColor brightGreen = QColor::fromRgb(0, 255, 0);

    // 深い青色を作成
    QColor deepBlue = QColor::fromRgb(0, 0, 150);

    // QLabelを作成し、背景色を設定して表示
    QLabel label1("Red Background");
    label1.setAutoFillBackground(true); // 背景色を自動で塗る設定
    QPalette palette1 = label1.palette(); // 現在のパレットを取得
    palette1.setColor(QPalette::Window, redColor); // Windowロール(背景)に色を設定
    label1.setPalette(palette1); // 新しいパレットを適用
    label1.show();

    QLabel label2("Green Background");
    label2.setAutoFillBackground(true);
    QPalette palette2 = label2.palette();
    palette2.setColor(QPalette::Window, brightGreen);
    label2.setPalette(palette2);
    label2.show();

    QLabel label3("Deep Blue Background");
    label3.setAutoFillBackground(true);
    QPalette palette3 = label3.palette();
    palette3.setColor(QPalette::Window, deepBlue);
    label3.setPalette(palette3);
    label3.show();

    return app.exec();
}

アルファ値 (透明度) を含む色生成

4番目の引数にアルファ値を指定することで、色の透明度を設定できます。アルファ値は0(完全に透明)から255(完全に不透明)の範囲です。

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

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

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    // 半透明のオレンジ色 (R=255, G=165, B=0, A=128)
    QColor semiTransparentOrange = QColor::fromRgb(255, 165, 0, 128);

    // 完全に透明な色 (ほとんど見えないはず)
    QColor fullyTransparent = QColor::fromRgb(0, 0, 0, 0);

    // わずかに透明な水色
    QColor lightTransparentCyan = QColor::fromRgb(0, 255, 255, 200);

    QLabel *label1 = new QLabel("Semi-Transparent Orange");
    label1->setAutoFillBackground(true);
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, semiTransparentOrange);
    label1->setPalette(palette1);
    layout->addWidget(label1);

    QLabel *label2 = new QLabel("Fully Transparent (You might not see this)");
    label2->setAutoFillBackground(true);
    QPalette palette2 = label2->palette();
    palette2.setColor(QPalette::Window, fullyTransparent);
    label2->setPalette(palette2);
    layout->addWidget(label2);

    QLabel *label3 = new QLabel("Light Transparent Cyan");
    label3->setAutoFillBackground(true);
    QPalette palette3 = label3->palette();
    palette3.setColor(QPalette::Window, lightTransparentCyan);
    label3->setPalette(palette3);
    layout->addWidget(label3);

    window.setLayout(layout);
    window.setWindowTitle("Transparent Colors Example");
    window.resize(300, 200);
    window.show();

    return app.exec();
}

QRgb値からの色生成 (アルファ値に注意)

QRgbは、32ビットの符号なし整数にRGBおよびアルファ成分がパックされた型です。qRgb()qRgba()といったヘルパー関数を使って作成できます。

重要な注意点
QColor::fromRgb(QRgb rgb) は、渡されたQRgb値のアルファチャネルを無視し、常に不透明な色(アルファ値255)を返します。アルファチャネルを考慮したい場合は、QColor::fromRgba(QRgb rgba) を使用する必要があります。

#include <QApplication>
#include <QLabel>
#include <QColor>
#include <QPalette>
#include <QVBoxLayout>
#include <QWidget>
#include <QtGlobal> // qRgb, qRgba を使うために必要

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

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    // qRgb() で不透明な緑色を作成 (アルファは常に255)
    QRgb packedGreen = qRgb(0, 200, 0);
    QColor colorFromPackedRgb = QColor::fromRgb(packedGreen); // 不透明な緑

    // qRgba() で半透明な紫色を作成 (アルファ値100)
    QRgb packedPurpleWithAlpha = qRgba(128, 0, 128, 100);

    // QColor::fromRgb() を使うとアルファが無視される例
    QColor colorFromPackedRgbIgnoringAlpha = QColor::fromRgb(packedPurpleWithAlpha); // 不透明な紫になる

    // QColor::fromRgba() を使うとアルファが保持される例
    QColor colorFromPackedRgba = QColor::fromRgba(packedPurpleWithAlpha); // 半透明な紫になる

    QLabel *label1 = new QLabel("Green from packed QRgb (Opaque)");
    label1->setAutoFillBackground(true);
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, colorFromPackedRgb);
    label1->setPalette(palette1);
    layout->addWidget(label1);

    QLabel *label2 = new QLabel("Purple from packed QRgb (Alpha ignored, Opaque)");
    label2->setAutoFillBackground(true);
    QPalette palette2 = label2->palette();
    palette2.setColor(QPalette::Window, colorFromPackedRgbIgnoringAlpha);
    label2->setPalette(palette2);
    layout->addWidget(label2);

    QLabel *label3 = new QLabel("Purple from packed QRgba (Alpha kept, Semi-Transparent)");
    label3->setAutoFillBackground(true);
    QPalette palette3 = label3->palette();
    palette3.setColor(QPalette::Window, colorFromPackedRgba);
    label3->setPalette(palette3);
    layout->addWidget(label3);

    window.setLayout(layout);
    window.setWindowTitle("QRgb and QRgba Example");
    window.resize(400, 250);
    window.show();

    return app.exec();
}


QColor::fromRgb()は非常に便利ですが、Qtには他にも色を定義したり操作したりするための多様な方法が用意されています。ここでは、主な代替手段をご紹介します。

QColor コンストラクタの使用 (Constructor)

QColorクラスには、RGB値を直接受け取るコンストラクタが複数用意されています。これが最も一般的で直接的な代替方法です。

a. RGB値を直接指定するコンストラクタ
QColor(int r, int g, int b, int a = 255)

これは、fromRgb()が内部的に行っていることと非常に似ています。

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

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

    // fromRgb() の代わりにコンストラクタを使用
    QColor customRed = QColor(255, 0, 0); // 真っ赤な色
    QColor semiTransparentGreen = QColor(0, 255, 0, 128); // 半透明の緑

    QLabel label1("Custom Red (Constructor)");
    label1.setAutoFillBackground(true);
    QPalette palette1 = label1.palette();
    palette1.setColor(QPalette::Window, customRed);
    label1.setPalette(palette1);
    label1.show();

    QLabel label2("Semi-Transparent Green (Constructor)");
    label2.setAutoFillBackground(true);
    QPalette palette2 = label2.palette();
    palette2.setColor(QPalette::Window, semiTransparentGreen);
    label2.setPalette(palette2);
    label2.show();

    return app.exec();
}

b. QRgb 値を直接指定するコンストラクタ
QColor(QRgb rgb)

このコンストラクタも存在しますが、注意点として、QColor::fromRgb(QRgb rgb)と同様に、QRgb値のアルファチャネルを無視し、不透明な色(アルファ値255)を生成します。 アルファチャネルを保持したい場合は、後述のQColor(int argb)を使用します。

setRgb() / setRgba() メソッドの使用

既存のQColorオブジェクトの色を変更したい場合に便利です。

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

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

    QColor myColor; // デフォルトでは黒 (QColor(0, 0, 0, 255))

    // setRgb() で色を設定
    myColor.setRgb(255, 100, 0); // オレンジっぽい色に変更

    QLabel label1("Color changed with setRgb()");
    label1.setAutoFillBackground(true);
    QPalette palette1 = label1.palette();
    palette1.setColor(QPalette::Window, myColor);
    label1.setPalette(palette1);
    label1.show();

    // setRgba() でアルファ値も設定
    myColor.setRgba(qRgba(0, 200, 200, 80)); // 半透明なシアンに変更
    QLabel label2("Color changed with setRgba()");
    label2.setAutoFillBackground(true);
    QPalette palette2 = label2.palette();
    palette2.setColor(QPalette::Window, myColor);
    label2.setPalette(palette2);
    label2.show();

    return app.exec();
}

色の名前 (Named Colors) の使用

Qtは、CSSで定義されているような標準的な色名("red", "blue", "lightgray"など)をサポートしています。

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

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

    QColor aqua = QColor("aqua"); // 色名で指定
    QColor darkBlue = QColor("darkblue");
    QColor lightGray = QColor("lightgray");

    // 大文字小文字は区別されない
    QColor hotPink = QColor("HotPink");

    QLabel label1("Aqua Background");
    label1.setAutoFillBackground(true);
    QPalette palette1 = label1.palette();
    palette1.setColor(QPalette::Window, aqua);
    label1.setPalette(palette1);
    label1.show();

    QLabel label2("DarkBlue Background");
    label2.setAutoFillBackground(true);
    QPalette palette2 = label2.palette();
    palette2.setColor(QPalette::Window, darkBlue);
    label2.setPalette(palette2);
    label2.show();

    QLabel label3("HotPink Background");
    label3.setAutoFillBackground(true);
    QPalette palette3 = label3.palette();
    palette3.setColor(QPalette::Window, hotPink);
    label3.setPalette(palette3);
    label3.show();

    return app.exec();
}

注意点
全てのCSS色名がサポートされているわけではありません。Qtのドキュメントでサポートされている色名を確認してください。

HTMLカラーコード (Hexadecimal Strings) の使用

HTML/CSSでよく使われる16進数表記のカラーコード(例: "#RRGGBB" または "#AARRGGBB")も使用できます。

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

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

    // "#RRGGBB" 形式 (アルファ値は255)
    QColor hexGreen = QColor("#00FF00"); // 緑

    // "#AARRGGBB" 形式 (アルファ値を含む)
    QColor semiTransparentBlue = QColor("#800000FF"); // 半透明の青 (80は128に相当)

    // "#RGB" ショートハンド形式 (各成分を倍にする)
    QColor shortHandRed = QColor("#F00"); // FF0000 (赤)

    QLabel label1("Hex Green Background");
    label1.setAutoFillBackground(true);
    QPalette palette1 = label1.palette();
    palette1.setColor(QPalette::Window, hexGreen);
    label1.setPalette(palette1);
    label1.show();

    QLabel label2("Semi-Transparent Blue (Hex)");
    label2.setAutoFillBackground(true);
    QPalette palette2 = label2.palette();
    palette2.setColor(QPalette::Window, semiTransparentBlue);
    label2.setPalette(palette2);
    label2.show();

    QLabel label3("Short Hand Red (Hex)");
    label3.setAutoFillBackground(true);
    QPalette palette3 = label3.palette();
    palette3.setColor(QPalette::Window, shortHandRed);
    label3.setPalette(palette3);
    label3.show();

    return app.exec();
}

HSL / HSV / CMYK 値からの色生成

RGB以外の色空間で色を定義したい場合は、それぞれの色空間に対応する静的ファクトリ関数やコンストラクタを使用します。

  • QColor(int h, int s, int v, int a = 255, QColor::Spec spec = Hsv) (コンストラクタで色空間を指定)
  • QColor::fromCmyk(int c, int m, int y, int k, int a = 255)
  • QColor::fromHsv(int h, int s, int v, int a = 255)
  • QColor::fromHsl(int h, int s, int l, int a = 255)
#include <QApplication>
#include <QLabel>
#include <QColor>
#include <QPalette>
#include <QVBoxLayout>
#include <QWidget>

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

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    // HSL (Hue, Saturation, Lightness) から色を生成
    // H: 0-359 (色相), S: 0-255 (彩度), L: 0-255 (輝度)
    QColor hslColor = QColor::fromHsl(120, 255, 128); // 緑色のミディアムトーン

    // HSV (Hue, Saturation, Value) から色を生成
    // H: 0-359 (色相), S: 0-255 (彩度), V: 0-255 (明度)
    QColor hsvColor = QColor::fromHsv(240, 255, 200); // 明るめの青

    QLabel *label1 = new QLabel("HSL Color Background");
    label1->setAutoFillBackground(true);
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, hslColor);
    label1->setPalette(palette1);
    layout->addWidget(label1);

    QLabel *label2 = new QLabel("HSV Color Background");
    label2->setAutoFillBackground(true);
    QPalette palette2 = label2->palette();
    palette2.setColor(QPalette::Window, hsvColor);
    label2->setPalette(palette2);
    layout->addWidget(label2);

    window.setLayout(layout);
    window.setWindowTitle("Alternative Color Spaces");
    window.resize(300, 200);
    window.show();

    return app.exec();
}

どの方法を選ぶべきか?

  • 他の色空間(HSL, HSV, CMYK)で作業する場合
    • QColor::fromHsl() / fromHsv() / fromCmyk() などの対応するファクトリ関数を使用します。
  • 色名やHTMLカラーコードを使う場合
    • QColor(const QString &name) コンストラクタQColor::setNamedColor() を使用します。これにより、コードの可読性が向上する場合があります。
  • RGB値を数値で指定する場合
    • 新しく色を作成するなら、QColor(int r, int g, int b, int a) コンストラクタ または QColor::fromRgb() が適しています。どちらもほぼ同じ機能を提供しますが、コンストラクタの方が若干直接的です。
    • 既存のQColorオブジェクトの色を変更するなら、setRgb() / setRgba() が適しています。

プロジェクトの要件やコーディングスタイルに合わせて、最適な方法を選択してください。 QtプログラミングでQColor QColor::fromRgb()を使用して色を生成する以外にも、QColorオブジェクトを作成し、操作する方法はいくつか存在します。状況や要件に応じて、これらの代替手段を使い分けることが重要です。

最も直接的な代替方法は、QColorクラスのコンストラクタを使用することです。fromRgb() と同様に、RGBおよびアルファ成分を直接指定できます。

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

int main() {
    // RGB (不透明)
    QColor color1(255, 0, 0); // 真っ赤
    qDebug() << "Color 1 (Constructor RGB):" << color1.name(); // #ff0000

    // RGBA (アルファ値を含む)
    QColor color2(0, 0, 255, 128); // 半透明の青
    qDebug() << "Color 2 (Constructor RGBA):" << color2.name(QColor::HexArgb); // #800000ff (ARGB形式で出力)

    return 0;
}

fromRgb()との違い

  • 機能的にはほとんど同じですが、アルファ値を省略した場合のデフォルト値(255)も同じです。
  • コンストラクタはQColorオブジェクトを直接生成します。
  • fromRgb()は静的関数なので、QColor::として呼び出します。

setRgb() / setRgba() メソッド (既存のQColorオブジェクトを変更)

既存のQColorオブジェクトのRGB値を変更したい場合は、setRgb()またはsetRgba()メソッドを使用します。これは新しいQColorオブジェクトを作成するのではなく、既存のオブジェクトの状態を更新します。

#include <QColor>
#include <QDebug>

int main() {
    QColor myColor; // デフォルトでは無効な色、または黒
    qDebug() << "Initial color:" << myColor.name(); // #000000 (または無効な色)

    myColor.setRgb(255, 255, 0); // 色を黄色に変更
    qDebug() << "After setRgb():" << myColor.name(); // #ffff00

    myColor.setRgba(0, 255, 255, 50); // 半透明のシアンに変更
    qDebug() << "After setRgba():" << myColor.name(QColor::HexArgb); // #3200ffff

    return 0;
}

事前定義されたグローバルカラー (Qt::GlobalColor)

Qtには、よく使われる色がQt::GlobalColorという列挙型で定義されています。これらの色は名前で簡単に指定でき、特に基本的な色が必要な場合に便利です。

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

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

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    // Qt::GlobalColor を使用して色を作成
    QColor red = Qt::red;
    QColor blue = Qt::blue;
    QColor darkGreen = Qt::darkGreen;
    QColor transparent = Qt::transparent; // 完全に透明な色

    QLabel *label1 = new QLabel("Qt::red");
    label1->setAutoFillBackground(true);
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, red);
    label1->setPalette(palette1);
    layout->addWidget(label1);

    QLabel *label2 = new QLabel("Qt::blue");
    label2->setAutoFillBackground(true);
    QPalette palette2 = label2->palette();
    palette2.setColor(QPalette::Window, blue);
    label2->setPalette(palette2);
    layout->addWidget(label2);

    QLabel *label3 = new QLabel("Qt::darkGreen");
    label3->setAutoFillBackground(true);
    QPalette palette3 = label3->palette();
    palette3.setColor(QPalette::Window, darkGreen);
    label3->setPalette(palette3);
    layout->addWidget(label3);

    QLabel *label4 = new QLabel("Qt::transparent (Invisible)");
    label4->setAutoFillBackground(true);
    QPalette palette4 = label4->palette();
    palette4.setColor(QPalette::Window, transparent);
    label4->setPalette(palette4);
    layout->addWidget(label4);

    window.setLayout(layout);
    window.setWindowTitle("Global Colors Example");
    window.resize(300, 200);
    window.show();

    return app.exec();
}

名前付きカラー (QString または C文字列から)

CSSやHTMLで使われるような名前付きカラーや、16進数形式の文字列から色を生成することもできます。これは、設定ファイルから色を読み込んだり、デザイナーとの連携で色名を共有する場合に便利です。

#include <QColor>
#include <QDebug>

int main() {
    // カラーネームから色を作成 (SVG/X11カラーネームをサポート)
    QColor namedColor1("steelblue");
    qDebug() << "Named Color 1 (SteelBlue):" << namedColor1.name(); // #4682b4

    // 16進数文字列から色を作成 (RGB形式)
    QColor hexColor1("#FF4500"); // オレンジレッド
    qDebug() << "Hex Color 1 (#FF4500):" << hexColor1.name(); // #ff4500

    // 16進数文字列から色を作成 (ARGB形式 - Qt 5.x以降で`#AARRGGBB`形式も認識)
    QColor hexColor2("#80A0B0C0"); // 半透明のグレー
    qDebug() << "Hex Color 2 (#80A0B0C0):" << hexColor2.name(QColor::HexArgb); // #80a0b0c0

    // setNamedColor() を使って既存のオブジェクトを変更
    QColor myColor;
    myColor.setNamedColor("lightsalmon");
    qDebug() << "Modified color (LightSalmon):" << myColor.name(); // #ffa07a

    return 0;
}

QColorはRGBだけでなく、Hsv(色相、彩度、明度)、Hsl(色相、彩度、輝度)、Cmyk(シアン、マゼンタ、イエロー、キープレート/黒)といった他の色空間にも対応しています。それぞれの色空間から色を生成するための静的ファクトリ関数やコンストラクタが用意されています。

  • CMYK (Cyan, Magenta, Yellow, Key/Black)
    • QColor::fromCmyk(int c, int m, int y, int k, int a = 255)
    • QColor::setCmyk(int c, int m, int y, int k, int a = 255)
  • HSL (Hue, Saturation, Lightness)
    • QColor::fromHsl(int h, int s, int l, int a = 255)
    • QColor::setHsl(int h, int s, int l, int a = 255)
  • HSV (Hue, Saturation, Value)
    • QColor::fromHsv(int h, int s, int v, int a = 255)
    • QColor::setHsv(int h, int s, int v, int a = 255)
    • QColor(int h, int s, int v, int a, QColor::Hsv) (Qt 4.x)
#include <QColor>
#include <QDebug>

int main() {
    // HSVから色を作成 (h:0-359, s,v:0-255)
    QColor hsvColor = QColor::fromHsv(120, 255, 255); // 純粋な緑
    qDebug() << "HSV Color (Green):" << hsvColor.name();

    // HSLから色を作成 (h:0-359, s,l:0-255)
    QColor hslColor = QColor::fromHsl(240, 255, 128); // 純粋な青 (明るさ中程度)
    qDebug() << "HSL Color (Blue):" << hslColor.name();

    // CMYKから色を作成 (c,m,y,k:0-255)
    QColor cmykColor = QColor::fromCmyk(0, 255, 255, 0); // マゼンタとイエローで赤
    qDebug() << "CMYK Color (Red):" << cmykColor.name();

    return 0;
}