QColor::setRgb()のよくある落とし穴と解決策:Qt色設定のトラブルシューティング

2025-05-27

QtプログラミングにおけるQColor::setRgb()は、QColorオブジェクトの色をRGB (Red, Green, Blue) 値で設定するためのメソッドです。

RGBとは?

RGBは、光の三原色(赤、緑、青)を組み合わせることで様々な色を表現する色空間モデルです。それぞれの色の強さを数値で指定します。

setRgb()の機能

QColor::setRgb()メソッドは、以下のオーバーロード(引数の異なる同名関数)があります。

  1. void setRgb(int r, int g, int b, int a = 255)

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

    この形式では、赤、緑、青の各成分を個別の整数値で指定します。オプションでアルファ成分も指定できます。

  2. void setRgb(QRgb rgb)

    • rgb: 赤、緑、青、およびアルファ成分がパックされた単一のQRgb型(通常はunsigned int)の値。

    この形式では、QRgbという特殊な型を使って色を指定します。QRgbは、通常、RRGGBB(赤、緑、青)またはAARRGGBB(アルファ、赤、緑、青)の16進数形式で表現される色の値を保持します。Qtには、qRgb()qRgba()といった関数があり、個別のR, G, B, A値からQRgbを作成できます。

setRgbF()について

QColorには、浮動小数点数で色を設定するsetRgbF()というメソッドもあります。

  • void setRgbF(qreal r, qreal g, qreal b, qreal a = 1.0)
    • r, g, b, a: それぞれ0.0〜1.0の範囲で指定します。

これは、より細かい色の指定が必要な場合や、他のシステムとの連携で浮動小数点数の色値を使用する場合に便利です。

#include <QColor>
#include <QDebug>

int main() {
    QColor color;

    // 例1: 個別のRGB値とアルファ値で色を設定
    color.setRgb(255, 0, 0, 128); // 赤、半透明
    qDebug() << "Color 1 (RGBA):" << color.red() << color.green() << color.blue() << color.alpha();

    // 例2: 個別のRGB値(アルファ値はデフォルトの255)
    color.setRgb(0, 255, 0); // 緑、不透明
    qDebug() << "Color 2 (RGB):" << color.red() << color.green() << color.blue();

    // 例3: QRgb値で色を設定
    QRgb myRgbValue = qRgb(0, 0, 255); // 青
    color.setRgb(myRgbValue);
    qDebug() << "Color 3 (QRgb):" << color.red() << color.green() << color.blue();

    // 例4: 浮動小数点数で色を設定 (setRgbF)
    color.setRgbF(0.5, 0.5, 0.0, 1.0); // 黄土色、不透明
    qDebug() << "Color 4 (RGBF):" << color.redF() << color.greenF() << color.blueF() << color.alphaF();

    return 0;
}


QColor::setRgb()のよくあるエラーとトラブルシューティング

QColor::setRgb()は比較的単純なメソッドですが、使い方を誤ると意図しない色の表示になったり、コンパイルエラーや実行時エラーにつながることがあります。

色が期待通りに表示されない

これが最も一般的な問題です。

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

    • qDebug()で確認
      QColorオブジェクトのred(), green(), blue(), alpha()メソッドを使用して、実際に設定されている色成分の値を確認します。
      QColor color;
      color.setRgb(255, 0, 0, 100); // 半透明の赤を設定
      qDebug() << "Red:" << color.red()
               << "Green:" << color.green()
               << "Blue:" << color.blue()
               << "Alpha:" << color.alpha();
      
    • アルファ値を調整
      透明度が必要な場合は、アルファ値を0から254の範囲で調整してみます。完全に不透明にしたい場合は255を指定します。
    • 描画順序の確認
      複数の要素を描画している場合は、描画順序を確認し、意図しない重ね合わせがないか調べます。
    • シンプルなテスト
      最小限のコードで目的の色を設定し、それが正しく表示されるかテストします。これにより、問題がsetRgb()の使用方法にあるのか、それとも描画コンテキストや他の部分にあるのかを切り分けられます。
    • QRgb使用時の確認
      qRgb()qRgba()QRgb値を生成する際、引数の順序(R, G, B, A)を間違えていないか確認します。
      QRgb myRgb = qRgb(255, 0, 0); // 赤
      QColor color;
      color.setRgb(myRgb);
      // qDebug()で確認
      
    • RGB値の範囲外
      各成分(赤、緑、青、アルファ)は通常0から255の整数値を取ります(setRgbFの場合は0.0から1.0)。この範囲外の値を指定すると、Qtが内部的に値をクリップ(切り詰める)するため、期待と異なる色になります。例えば、setRgb(300, 0, 0)とすると、赤は255にクリップされ、純粋な赤(255, 0, 0)になります。
    • アルファ値の誤解
      アルファ値は0(完全透明)から255(完全不透明)の範囲です。もしオブジェクトが透明であるべきなのに不透明に見える場合、アルファ値が255になっている可能性があります。逆に、不透明であるべきなのに透明に見える場合、アルファ値が0に近い可能性があります。
    • 色の重ね合わせ
      描画している要素の上に別の要素が重なっている場合、期待する色が見えなくなることがあります。特に透過色の場合に顕著です。
    • カラープロファイルやディスプレイ設定
      非常に稀ですが、使用しているディスプレイのカラープロファイルやOSのディスプレイ設定が、Qtアプリケーションの色の表示に影響を与えることがあります。
    • 色の表現形式の混同
      setRgb()setRgbF()、あるいはQRgbと個別の引数を混同している可能性があります。

コンパイルエラー

setRgb()の引数や型の不一致でコンパイルエラーが発生することがあります。

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

    • エラーメッセージを読む
      コンパイラのエラーメッセージには、どのファイル、どの行で、どのような問題が発生しているかが詳しく記載されています。特に"no matching function for call to"のようなメッセージは、引数の型や数が間違っていることを示唆しています。
    • ドキュメントを参照
      Qtの公式ドキュメントでQColor::setRgb()のシグネチャ(引数の型と数)を確認します。
    • 型キャスト
      必要に応じて、static_cast<int>()などを用いて型変換を明示的に行います。ただし、多くの場合は適切なメソッド(setRgbFなど)を使用すべきです。
  • エラーの原因

    • 引数の型が間違っている
      setRgb()は整数値(int)を受け取ります。浮動小数点数(float, double)を直接渡そうとするとエラーになるか、暗黙の型変換で警告が出る場合があります。浮動小数点数を使いたい場合はsetRgbF()を使用します。
      // 誤った例
      // color.setRgb(0.5, 0.5, 0.5); // コンパイルエラーまたは警告
      
      // 正しい例
      color.setRgb(128, 128, 128); // 整数値
      color.setRgbF(0.5, 0.5, 0.5); // 浮動小数点数
      
    • 必要なヘッダーファイルの不足
      QColorを使用するためには、<QColor>ヘッダーファイルをインクルードする必要があります。
      #include <QColor> // これが必要
      
    • 引数の数の間違い
      setRgb()には通常3つまたは4つの引数が必要です。引数の数が足りなかったり、多すぎたりするとコンパイルエラーになります。
      // 誤った例
      // color.setRgb(255, 0); // 引数が足りない
      
      // 正しい例
      color.setRgb(255, 0, 0);
      color.setRgb(255, 0, 0, 255);
      

実行時エラー / クラッシュ

setRgb()自体が直接アプリケーションをクラッシュさせることは稀ですが、無効なQColorオブジェクトに対して操作を行おうとすると問題が発生する可能性があります。

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

    • ポインタのNULLチェック
      QColorオブジェクトをポインタで扱っている場合は、使用前にnullptrでないことを確認します。
    • デバッガの使用
      クラッシュが発生した場合は、デバッガ(Qt Creatorに統合されているGDBなど)を使用して、どこでクラッシュしているかを特定します。スタックトレースを確認し、どの関数呼び出しが問題を引き起こしているかを突き止めます。
  • エラーの原因

    • 無効なQColorオブジェクト
      QColorオブジェクトが正しく初期化されていない場合や、無効なメモリ領域を指している場合に、そのメンバー関数を呼び出そうとするとクラッシュする可能性があります。これは、ポインタがnullptrである場合や、既に解放されたメモリを指している場合によく起こります。
      QColor *colorPtr = nullptr;
      // colorPtr->setRgb(255, 0, 0); // クラッシュの可能性
      

これらの点に注意することで、QColor::setRgb()を効果的に、かつエラーなく使用できるはずです。ほとんどの問題は、引数の値の範囲、型の不一致、または描画コンテキストの理解不足に起因します。 Qt の QColor::setRgb() は非常に便利なメソッドですが、誤った使い方をすると予期せぬ結果やエラーにつながることがあります。以下に、よくあるエラーとそのトラブルシューティングを説明します。

RGB値の範囲外エラー

問題
最も一般的なエラーは、RGB各成分(赤、緑、青、アルファ)に0〜255の範囲外の値を指定することです。Qtは通常、このような場合でもクラッシュせず、警告メッセージを出すか、値を自動的にクリッピングして有効な範囲に収めます。しかし、意図しない色になる可能性があります。

エラーメッセージの例 (QColor::fromRgb の例ですが、setRgb も同様の警告が出ることがあります)

QColor::fromRgb: RGB parameters out of range

原因

  • データの読み込みミスなどで、不正な数値が渡された。
  • 計算結果が255を超えた。
  • 計算結果が負の値になった。

トラブルシューティング

  • データソースの確認
    値の取得元(ファイル、ネットワーク、ユーザー入力など)に問題がないか確認します。
  • デバッグ出力
    qDebug() を使って、setRgb() に渡される直前の各RGB値を出力し、不正な値がないか確認します。
  • 入力値の検証
    setRgb() を呼び出す前に、r, g, b, a の各値が0〜255の範囲内にあることを確認します。
    int r = some_value_r;
    int g = some_value_g;
    int b = some_value_b;
    int a = some_value_a;
    
    // 範囲チェックとクリッピング
    r = qBound(0, r, 255);
    g = qBound(0, g, 255);
    b = qBound(0, b, 255);
    a = qBound(0, a, 255);
    
    color.setRgb(r, g, b, a);
    
    qBound(min, value, max) は、valuemin より小さければ min を、max より大きければ max を返し、それ以外の場合は value を返す便利な関数です。

QRgb 型の使用ミス

問題
QColor::setRgb(QRgb rgb) のオーバーロードを使用する場合、QRgb 型の値の生成方法を間違えると、意図しない色になります。

原因

  • 16進数で色を指定する際に、バイトオーダーやアルファ値の配置を誤った場合。QRgb は通常 AARRGGBB の形式(アルファ、赤、緑、青の順で各8ビット)でパックされています。
  • qRgb()qRgba() を使わずに、直接整数値を渡そうとした場合。

トラブルシューティング

  • 16進数リテラルの確認
    16進数で直接QRgb値を指定する場合は、バイトオーダーを意識し、意図した通りの色になっているか確認します。
    // 16進数で青色、不透明を指定 (0xAARRGGBB)
    color.setRgb(0xFF0000FF);
    
  • qRgb() または qRgba() の利用
    ほとんどの場合、個別のR, G, B, A値からQRgbを生成するには、qRgb()またはqRgba()関数を使用するのが最も安全で推奨される方法です。
    // 個別の値からQRgbを生成
    QRgb myPackedRgb = qRgba(255, 0, 0, 255); // 赤、不透明
    color.setRgb(myPackedRgb);
    

QColor::setRgbF() (浮動小数点数) の誤解

問題
setRgbF() は0.0〜1.0の範囲で値を指定しますが、整数値のsetRgb()と混同して、0〜255の値を渡してしまうことがあります。

原因

  • 他のライブラリやデータソースが0.0〜1.0の範囲で色を提供しているにもかかわらず、誤ってsetRgb()を使ってしまった。
  • setRgb()setRgbF() の違いを理解していない。

トラブルシューティング

  • 値の正規化/スケール変換
    必要に応じて、値の範囲を変換します。
    double r_double = some_double_value_0_to_1;
    double g_double = some_double_value_0_to_1;
    double b_double = some_double_value_0_to_1;
    
    // setRgbF を使用
    color.setRgbF(r_double, g_double, b_double);
    
    // あるいは、setRgb のために0-255に変換
    int r_int = static_cast<int>(r_double * 255.0);
    int g_int = static_cast<int>(g_double * 255.0);
    int b_int = static_cast<int>(b_double * 255.0);
    color.setRgb(r_int, g_int, b_int);
    
  • 正しいメソッドの選択
    0〜255の整数値を使用する場合はsetRgb()を、0.0〜1.0の浮動小数点数を使用する場合はsetRgbF()を使い分けます。

設定した色がUIに反映されない

問題
setRgb() で色を設定しても、ウィジェットの背景やテキストの色が変わらない、といった問題。

原因

  • ウィジェットのプロパティが正しく設定されていない。
  • スタイルシートの適用順序や優先順位の問題。
  • QColor オブジェクトを設定しただけで、その色を実際にウィジェットに適用する処理が抜けている。

トラブルシューティング

  • update() / repaint() の呼び出し
    UIの変更を強制的に再描画させるために、myWidget->update()myWidget->repaint() を呼び出す必要がある場合があります。特に paintEvent の中で色を変更している場合は重要です。
  • スタイルシートの優先順位
    スタイルシートは、パレットよりも優先される場合があります。もしスタイルシートが設定されている場合、パレットによる色の変更が反映されないことがあります。
  • 色の適用
    QColor はあくまで色を表すオブジェクトであり、それをウィジェットに適用するには通常、QPaletteQBrush、あるいはスタイルシートを使用します。
    • QPalette を使う場合 (一般的なウィジェットの背景、前景など)
      QColor myColor;
      myColor.setRgb(255, 0, 0); // 赤
      
      QPalette palette = myWidget->palette();
      palette.setColor(QPalette::Window, myColor); // 背景色として設定
      // あるいは QPalette::WindowText でテキスト色など
      myWidget->setPalette(palette);
      myWidget->setAutoFillBackground(true); // 背景色を適用するために必要
      
    • QBrush を使う場合 (QPainter で描画する場合など)
      QColor myColor;
      myColor.setRgb(0, 0, 255); // 青
      
      QPainter painter(this); // 例えば QWidget::paintEvent 内
      QBrush brush(myColor);
      painter.setBrush(brush);
      painter.drawRect(10, 10, 50, 50);
      
    • スタイルシートを使う場合
      QPushButton *button = new QPushButton("My Button");
      button->setStyleSheet("background-color: rgb(255, 0, 0); color: rgb(0, 255, 0);"); // 赤い背景、緑のテキスト
      

問題
まれに、特に古いQtバージョンや特定のコンパイラ設定で、QColorのコンストラクタやsetRgbメソッドに対して「曖昧な呼び出し」のようなコンパイルエラーが発生することがあります。

原因
これは、コンパイラがどのオーバーロードを使うべきか判断できない場合に起こります。例えば、単一の整数リテラルを渡す場合に、それがRGB値として解釈されるのか、それともポインタなど別の意味で解釈されるのかが曖昧になることがあります。

トラブルシューティング

  • 推奨されるコンストラクタの使用
    QColor(int r, int g, int b, int a = 255) のコンストラクタや setRgb(int, int, int, int) メソッドを直接使うのが最も一般的で、この種のエラーを避けやすいです。
  • 明示的な型変換
    最も確実なのは、引数の型を明示的に指定することです。
    // QColor(QRgb color) コンストラクタの場合
    selectedShape->shapeColour = QColor(static_cast<QRgb>(0x000000)); // 黒
    // setRgb(int r, int g, int b, int a) の場合
    color.setRgb(static_cast<int>(0), static_cast<int>(0), static_cast<int>(0));
    


基本的なRGB値とアルファ値の設定

最も一般的な使用法は、赤、緑、青の各成分と、オプションでアルファ(透明度)成分を整数で指定する方法です。各成分は0(最小)から255(最大)の範囲で指定します。アルファ値は0(完全な透明)から255(完全な不透明)です。

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QColor>
#include <QPalette> // QColorをウィジェットに適用するために必要

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

    QWidget *window = new QWidget();
    window->setWindowTitle("QColor::setRgb() Examples");

    QVBoxLayout *layout = new QVBoxLayout(window);

    // 例1: 完全な赤色(不透明)
    QLabel *label1 = new QLabel("Red (Opaque)");
    QColor redColor;
    redColor.setRgb(255, 0, 0); // 赤:255, 緑:0, 青:0
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, redColor);
    label1->setPalette(palette1);
    label1->setAutoFillBackground(true); // 背景色を適用するために必要
    layout->addWidget(label1);

    // 例2: 半透明の緑色
    QLabel *label2 = new QLabel("Green (Semi-Transparent)");
    QColor greenColor;
    greenColor.setRgb(0, 255, 0, 128); // 赤:0, 緑:255, 青:0, アルファ:128 (半透明)
    QPalette palette2 = label2->palette();
    palette2.setColor(QPalette::Window, greenColor);
    label2->setPalette(palette2);
    label2->setAutoFillBackground(true);
    layout->addWidget(label2);

    // 例3: カスタムカラー(紫がかった青)
    QLabel *label3 = new QLabel("Custom Color (Purple-ish Blue)");
    QColor customColor;
    customColor.setRgb(100, 50, 200); // 赤:100, 緑:50, 青:200
    QPalette palette3 = label3->palette();
    palette3.setColor(QPalette::Window, customColor);
    label3->setPalette(palette3);
    label3->setAutoFillBackground(true);
    layout->addWidget(label3);

    window->show();

    return app.exec();
}

解説

  • QPalette を使用して、設定した色をQLabelの背景色として適用しています。setAutoFillBackground(true) は、パレットの背景色がウィジェットに描画されるために重要です。
  • QColor オブジェクトを作成し、setRgb() を使って色を設定しています。

QRgb 型を使用した設定

QRgb は、赤、緑、青、およびアルファ成分を単一のunsigned int値にパックしたQtの型です。qRgb()qRgba()ヘルパー関数を使って簡単にQRgb値を生成できます。

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QColor>
#include <QPalette>
#include <QDebug> // qRgbやqRgbaの値を表示するため

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

    QWidget *window = new QWidget();
    window->setWindowTitle("QColor::setRgb(QRgb) Example");

    QVBoxLayout *layout = new QVBoxLayout(window);

    // 例1: qRgb() を使用してQRgb値を生成(不透明)
    QLabel *label1 = new QLabel("Blue via qRgb()");
    QRgb blueRgb = qRgb(0, 0, 255); // RGB値からQRgbを生成
    qDebug() << "Blue QRgb value:" << QString("0x%1").arg(blueRgb, 8, 16, QChar('0'));

    QColor blueColor;
    blueColor.setRgb(blueRgb);
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, blueColor);
    label1->setPalette(palette1);
    label1->setAutoFillBackground(true);
    layout->addWidget(label1);

    // 例2: qRgba() を使用してQRgb値を生成(アルファ含む)
    QLabel *label2 = new QLabel("Yellow via qRgba() (Semi-Transparent)");
    QRgb yellowRgba = qRgba(255, 255, 0, 150); // RGBA値からQRgbを生成
    qDebug() << "Yellow QRgb value:" << QString("0x%1").arg(yellowRgba, 8, 16, QChar('0'));

    QColor yellowColor;
    yellowColor.setRgb(yellowRgba);
    QPalette palette2 = label2->palette();
    palette2.setColor(QPalette::Window, yellowColor);
    label2->setPalette(palette2);
    label2->setAutoFillBackground(true);
    layout->addWidget(label2);

    // 例3: 直接16進数でQRgb値を指定 (AARRGGBB形式)
    QLabel *label3 = new QLabel("Cyan via Hex QRgb");
    QRgb cyanHexRgb = 0xFF00FFFF; // FF (不透明) 00 (赤) FF (緑) FF (青)
    qDebug() << "Cyan Hex QRgb value:" << QString("0x%1").arg(cyanHexRgb, 8, 16, QChar('0'));

    QColor cyanColor;
    cyanColor.setRgb(cyanHexRgb);
    QPalette palette3 = label3->palette();
    palette3.setColor(QPalette::Window, cyanColor);
    label3->setPalette(palette3);
    label3->setAutoFillBackground(true);
    layout->addWidget(label3);

    window->show();

    return app.exec();
}

解説

  • QRgbは通常AARRGGBBの形式で内部的にビットが配置されるため、直接16進数で指定する場合はこの順序を考慮する必要があります。
  • qRgba() はアルファ値を含むRGBA値からQRgbを生成します。
  • qRgb() はアルファ値を含まないRGB値からQRgbを生成します(アルファはデフォルトで不透明になります)。

QColorには、0.0から1.0の範囲の浮動小数点数で色を設定するsetRgbF()メソッドもあります。これは、例えばOpenGLのような他のグラフィックライブラリと連携する場合に便利です。

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

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

    QWidget *window = new QWidget();
    window->setWindowTitle("QColor::setRgbF() Example");

    QVBoxLayout *layout = new QVBoxLayout(window);

    // 例1: 0.0〜1.0の浮動小数点数で色を設定 (濃い赤)
    QLabel *label1 = new QLabel("Dark Red (Float)");
    QColor darkRedColor;
    darkRedColor.setRgbF(0.5, 0.0, 0.0); // 赤:0.5, 緑:0.0, 青:0.0
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, darkRedColor);
    label1->setPalette(palette1);
    label1->setAutoFillBackground(true);
    layout->addWidget(label1);

    // 例2: 浮動小数点数で半透明のシアン
    QLabel *label2 = new QLabel("Semi-Transparent Cyan (Float)");
    QColor semiTransparentCyanColor;
    semiTransparentCyanColor.setRgbF(0.0, 1.0, 1.0, 0.7); // 赤:0.0, 緑:1.0, 青:1.0, アルファ:0.7
    QPalette palette2 = label2->palette();
    palette2.setColor(QPalette::Window, semiTransparentCyanColor);
    label2->setPalette(palette2);
    label2->setAutoFillBackground(true);
    layout->addWidget(label2);

    window->show();

    return app.exec();
}
  • このメソッドを使用する場合、各色の値は0.0から1.0の範囲で正規化された値として扱われます。
  • setRgbF() は各成分をqreal型(通常はdouble)で受け取ります。


コンストラクタによる初期化

QColorオブジェクトを宣言と同時にRGB値を指定して初期化できます。これは、特に一度だけ色を設定する場合にコードを簡潔にするのに役立ちます。

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

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

    QWidget *window = new QWidget();
    window->setWindowTitle("QColor Constructor Examples");
    QVBoxLayout *layout = new QVBoxLayout(window);

    // RGB値を直接渡すコンストラクタ
    QColor aquaColor(0, 255, 255); // シアン
    QLabel *label1 = new QLabel("Aqua (Constructor)");
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, aquaColor);
    label1->setPalette(palette1);
    label1->setAutoFillBackground(true);
    layout->addWidget(label1);

    // アルファ値も含むコンストラクタ
    QColor transparentPurple(128, 0, 128, 100); // 半透明の紫
    QLabel *label2 = new QLabel("Transparent Purple (Constructor)");
    QPalette palette2 = label2->palette();
    palette2.setColor(QPalette::Window, transparentPurple);
    label2->setPalette(palette2);
    label2->setAutoFillBackground(true);
    layout->addWidget(label2);

    window->show();
    return app.exec();
}

解説

  • QColor color(r, g, b, a); の形式で、R, G, B, (A) の値を直接渡して QColor オブジェクトを生成します。

静的ファクトリ関数 QColor::fromRgb() など

QColorクラスは、様々な色空間からQColorオブジェクトを生成するための静的ファクトリメソッドを提供しています。これらは、既存のRGB値や他の色空間の値から新しいQColorオブジェクトを作成する際に特に便利です。

  • QColor QColor::fromRgbF(qreal r, qreal g, qreal b, qreal a = 1.0)
  • QColor QColor::fromRgb(QRgb rgb)
  • QColor QColor::fromRgb(int r, int g, int b, int a = 255)

これらは setRgb() と機能的には似ていますが、新しいQColorオブジェクトを返す点が異なります。

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

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

    QWidget *window = new QWidget();
    window->setWindowTitle("QColor::fromRgb() Example");
    QVBoxLayout *layout = new QVBoxLayout(window);

    // fromRgb() を使用して色を作成
    QColor orangeColor = QColor::fromRgb(255, 165, 0); // オレンジ
    QLabel *label1 = new QLabel("Orange (fromRgb)");
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, orangeColor);
    label1->setPalette(palette1);
    label1->setAutoFillBackground(true);
    layout->addWidget(label1);

    // fromRgbF() を使用して色を作成 (浮動小数点)
    QColor darkBlueColor = QColor::fromRgbF(0.0, 0.0, 0.5); // 濃い青
    QLabel *label2 = new QLabel("Dark Blue (fromRgbF)");
    QPalette palette2 = label2->palette();
    palette2.setColor(QPalette::Window, darkBlueColor);
    label2->setPalette(palette2);
    label2->setAutoFillBackground(true);
    layout->addWidget(label2);

    window->show();
    return app.exec();
}

解説

  • QColor::fromRgb() は、指定されたRGB値から新しい QColor オブジェクトを生成して返します。既存のQColorオブジェクトの値を変更するのではなく、新しいオブジェクトを作成したい場合に便利です。

色名 (setNamedColor() またはコンストラクタ)

Qtは、CSS/SVGの標準的な色名(例: "red", "blue", "lightgray"など)をサポートしています。文字列として色名を指定することで、直感的に色を設定できます。

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

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

    QWidget *window = new QWidget();
    window->setWindowTitle("Named Colors Example");
    QVBoxLayout *layout = new QVBoxLayout(window);

    // コンストラクタで色名を指定
    QColor tomatoColor("tomato");
    QLabel *label1 = new QLabel("Tomato");
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, tomatoColor);
    label1->setPalette(palette1);
    label1->setAutoFillBackground(true);
    layout->addWidget(label1);

    // setNamedColor() を使用
    QColor steelBlueColor;
    steelBlueColor.setNamedColor("steelblue");
    QLabel *label2 = new QLabel("SteelBlue");
    QPalette palette2 = label2->palette();
    palette2.setColor(QPalette::Window, steelBlueColor);
    label2->setPalette(palette2);
    label2->setAutoFillBackground(true);
    layout->addWidget(label2);

    // 16進数文字列 (#RRGGBB または #AARRGGBB) も色名として認識されます
    QColor hexColor("#800080"); // 紫
    QLabel *label3 = new QLabel("Purple (Hex String)");
    QPalette palette3 = label3->palette();
    palette3.setColor(QPalette::Window, hexColor);
    label3->setPalette(palette3);
    label3->setAutoFillBackground(true);
    layout->addWidget(label3);

    window->show();
    return app.exec();
}

解説

  • "#RRGGBB""#AARRGGBB" の形式の16進数文字列も認識されます。
  • QColor color("colorName"); または QColor::setNamedColor("colorName"); を使用します。

Qt::GlobalColor 列挙型

Qtは、よく使われる色のためのグローバルな列挙型Qt::GlobalColorを提供しています。これにより、タイプセーフで読みやすい方法で基本的な色を指定できます。

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

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

    QWidget *window = new QWidget();
    window->setWindowTitle("Qt::GlobalColor Example");
    QVBoxLayout *layout = new QVBoxLayout(window);

    // Qt::GlobalColor を使用
    QColor blackColor(Qt::black);
    QLabel *label1 = new QLabel("Black (Qt::black)");
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, blackColor);
    label1->setPalette(palette1);
    label1->setAutoFillBackground(true);
    layout->addWidget(label1);

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

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

    window->show();
    return app.exec();
}

解説

  • Qt::red, Qt::blue, Qt::white, Qt::black, Qt::transparent など、一般的な色が事前に定義されています。

HSV (Hue, Saturation, Value) / HSL (Hue, Saturation, Lightness) モデル

RGBはハードウェア指向の色モデルですが、HSVやHSLは人間の知覚により近い色モデルです。色相(Hue)、彩度(Saturation)、明度/輝度(Value/Lightness)で色を指定します。

  • 静的ファクトリ関数: QColor::fromHsv(), QColor::fromHsl() など
  • void setHslF(qreal h, qreal s, qreal l, qreal a = 1.0)
  • void setHsl(int h, int s, int l, int a = 255)
  • void setHsvF(qreal h, qreal s, qreal v, qreal a = 1.0)
  • void setHsv(int h, int s, int v, int a = 255)
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QColor>
#include <QPalette>

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

    QWidget *window = new QWidget();
    window->setWindowTitle("HSV/HSL Examples");
    QVBoxLayout *layout = new QVBoxLayout(window);

    // HSV で色を設定 (鮮やかなマゼンタ)
    QLabel *label1 = new QLabel("Vivid Magenta (HSV)");
    QColor hsvColor;
    hsvColor.setHsv(300, 255, 255); // 色相:300度 (マゼンタ), 彩度:255, 明度:255
    QPalette palette1 = label1->palette();
    palette1.setColor(QPalette::Window, hsvColor);
    label1->setPalette(palette1);
    label1->setAutoFillBackground(true);
    layout->addWidget(label1);

    // HSL で色を設定 (明るい緑)
    QLabel *label2 = new QLabel("Light Green (HSL)");
    QColor hslColor;
    hslColor.setHsl(120, 200, 180); // 色相:120度 (緑), 彩度:200, 明度:180
    QPalette palette2 = label2->palette();
    palette2.setColor(QPalette::Window, hslColor);
    label2->setPalette(palette2);
    label2->setAutoFillBackground(true);
    layout->addWidget(label2);

    window->show();
    return app.exec();
}

解説

  • L (Lightness) は明度を表し、0(黒)から255(白)の範囲です。
  • V (Value/Brightness) は明度/輝度を表し、0(黒)から255(最も明るい)の範囲です。
  • S (Saturation) は彩度を表し、0(灰色)から255(最も鮮やか)の範囲です。
  • H (Hue) は色相を表し、0〜359の度数で円周上の位置を指定します(赤が0度、緑が120度、青が240度)。

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

  • 静的ファクトリ関数: QColor::fromCmyk() など
  • void setCmykF(qreal c, qreal m, qreal y, qreal k, qreal a = 1.0)
  • void setCmyk(int c, int m, int y, int k, int a = 255)
// CMYK の例は、UIで直接視覚的に分かりにくいので、ここではコードのみ示します。
// QColor cmykColor;
// cmykColor.setCmyk(0, 100, 100, 0); // マゼンタ
// あるいは
// QColor cmykBlack = QColor::fromCmyk(0, 0, 0, 100); // 純粋な黒 (キー)

QColor::setRgb()は非常に汎用性が高いですが、Qtは色の設定に関して他にも多くの強力なオプションを提供しています。

  • 印刷用
    setCmyk() が利用できます。
  • 人間の知覚に基づいた色選択
    setHsv()setHsl() が適しています。
  • 新しいQColorオブジェクトの作成
    QColor::fromRgb() などの静的ファクトリ関数が適しています。
  • 簡単な固定色
    Qt::GlobalColor 列挙型や色名(setNamedColor() またはコンストラクタ)が便利です。