QColor::lighter()でQtアプリの色を鮮やかに!基本から応用まで

2025-05-27

QtプログラミングにおけるQColor QColor::lighter()は、既存のQColorオブジェクトの色をより明るくする際に使用する関数です。

QColor::lighter()は、呼び出されたQColorオブジェクト自身を変更するのではなく、元の色よりも明るい新しいQColorオブジェクトを返します。

使い方

通常、引数なしで呼び出すと、デフォルトで色が明るくなります。引数として整数factorを指定することもできます。

QColor originalColor(Qt::red); // 元の色は赤
QColor lighterColor = originalColor.lighter(); // デフォルトで明るくする
// lighterColor は元の赤色よりも明るい赤色になります

QColor evenLighterColor = originalColor.lighter(200); // factorを200に指定してさらに明るくする
// factor が大きいほど、より明るくなります。
// デフォルトの factor は通常150です。

factorについて

factorは明るさの度合いを制御します。

  • factorが100より小さい場合: 色はより暗くなります。この場合、darker()関数を使うことをQtは推奨しています。
  • factorが100より大きい場合: 色はより明るくなります。factorの値が大きいほど、より明るい色になります。
  • factorが100の場合: 元の色と全く同じ色が返されます(明るさの変更なし)。

内部的な処理

lighter()関数は、内部的に色をHSV(Hue-Saturation-Value: 色相-彩度-明度)モデルに変換し、V(明度)の値を増やして色を明るくしています。その後、再びRGBモデルに変換して新しいQColorオブジェクトを生成します。

特定のウィジェットの背景色を、マウスカーソルが上に乗ったときに少し明るくしたい場合などに便利です。

// 例えば、QWidget::paintEvent(QPaintEvent*) の中で
void MyWidget::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    QColor backgroundColor = Qt::blue; // 青色を基準とする

    if (mouseOver) { // マウスがウィジェットの上にいる場合
        backgroundColor = backgroundColor.lighter(120); // 少し明るくする
    }

    painter.fillRect(rect(), backgroundColor);
}


よくあるエラーと問題

    • 問題: QColor(Qt::black).lighter()を呼び出しても、ほとんど変化しない、または完全に黒のままになることがあります。
    • 理由: lighter()は内部的に色をHSV(Hue-Saturation-Value)モデルに変換し、V(明度)の値を増やして色を明るくします。しかし、Vが0(完全に黒)の場合、いくら乗算してもVは0のままであり、色が明るくなることはありません。同様に、非常に暗い色もVの値が小さいため、わずかにしか明るくなりません。
    • トラブルシューティング:
      • 完全に黒のままにしたくない場合は、最初にわずかに明るい基本色から始めることを検討してください。
      • 極端に暗い色を明るくしたい場合は、lighter()factorを非常に大きくするか、色をHSVに変換し、V値を直接加算するなどして、より根本的に明度を操作することを検討してください。
  1. lighter()を繰り返し適用すると色が白に近づきすぎる

    • 問題: UI要素のホバーエフェクトなどで、lighter()を何度も適用すると、色が最終的に白に非常に近くなってしまい、元の色の特徴が失われることがあります。
    • 理由: lighter()は常に色を明るい方向にシフトさせるため、繰り返し適用すると当然ながら白に近づきます。
    • トラブルシューティング:
      • 元の色をどこかに保存し、ホバー解除時にその色に戻すようにします。
      • lighter()を適用する回数を制限するか、factorの値を小さくして、明るさの変化を緩やかにします。
      • 明るさの変化を線形的に制御したい場合は、QColor::toHsv()でHSVに変換し、H(色相)とS(彩度)を保ちつつ、V(明度)を直接計算で操作する方法も有効です。
  2. アルファチャンネル(透明度)の扱い

    • 問題: lighter()は、色のRGB成分を明るくしますが、アルファチャンネルには影響を与えません。元の色が半透明だった場合、明るくなっても半透明のままです。
    • 理由: lighter()は色の視覚的な明るさに焦点を当てており、透明度はその考慮外です。
    • トラブルシューティング:
      • もし明るくする際に透明度も変更したい場合は、QColor::setAlpha()またはQColor::setAlphaF()を別途呼び出す必要があります。
  3. 期待した色にならない(HSVとRGBの変換の影響)

    • 問題: 特定のRGB値で作成した色をlighter()で明るくした結果が、直感的に期待したものと異なることがあります。
    • 理由: lighter()は内部的にRGBからHSVへの変換、V値の変更、HSVからRGBへの再変換を行っています。この変換過程で、ごくわずかな数値の丸め誤差や、色のモデル間の表現の違いにより、元のRGB値の比率が完全に保たれないことがあります。特に、鮮やかな色や彩度の高い色で顕著になることがあります。
    • トラブルシューティング:
      • 厳密な色の再現性が必要な場合は、lighter()ではなく、QColor::red(), green(), blue()で各成分を取得し、手動で明るさの計算(例: 各成分に定数を乗算し、255を超えないようにクリッピングする)を行うことを検討してください。ただし、この方法は色相が変化してしまう可能性があるため注意が必要です。
      • QColor::toHsv()でHSVに変換し、V値を直接操作する方が、色相を保ちつつ明るさを調整する際にはより予測可能な結果が得られます。
  4. lighter()darker()の非対称性

    • 問題: originalColor.lighter(factor).darker(factor)を実行しても、元のoriginalColorに戻らない場合があります。
    • 理由: lighter()darker()は、それぞれV値を特定のfactorで乗算または除算することで明るさを調整します。これらの操作は逆演算ではないため、元の色に正確に戻る保証はありません。
    • トラブルシューティング:
      • 明るくしたり暗くしたりした後に元の色に戻す必要がある場合は、元のQColorオブジェクトを別途保存しておき、必要なときにそれを使用するようにします。
      • 例:
        QColor baseColor(Qt::blue);
        QColor currentHoverColor;
        
        // マウスエンター時
        currentHoverColor = baseColor.lighter(120);
        
        // マウスリーブ時
        currentHoverColor = baseColor; // 元の色に戻す
        
  • シンプルな例で試す: 問題が発生した場合は、複雑なUIから切り離し、ごくシンプルなコードでQColor::lighter()の挙動を再現し、原因を特定します。
  • ドキュメントを確認する: Qtの公式ドキュメント(QColorクラスリファレンス)を改めて確認し、lighter()の具体的な挙動やfactorに関する記述を再確認します。
  • HSV値を確認する: QColor::toHsv()を使ってHSV値を抽出し、H, S, Vそれぞれの値がどのように変化しているかを理解すると、色の変化がより明確になります。
  • デバッグ出力で色を確認する: QColor::name()QColor::getRgb()などを使用して、lighter()適用前後のRGB値や色名を出力し、期待通りの値になっているか確認します。


例1:基本的な色の明るさ調整

最も基本的な使い方です。元の色から単に明るい色を生成します。

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

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

    QWidget window;
    window.setWindowTitle("QColor::lighter() の基本");

    QVBoxLayout *layout = new QVBoxLayout(&window);

    // 元の色(青)
    QColor originalColor(Qt::blue);

    // lighter() で明るくした色(デフォルトのfactor 150)
    QColor defaultLighterColor = originalColor.lighter();

    // factor を指定してさらに明るくした色(factor 200)
    QColor muchLighterColor = originalColor.lighter(200);

    // ラベルを作成し、それぞれの色を背景に設定
    QLabel *originalLabel = new QLabel("元の色 (青)");
    originalLabel->setAutoFillBackground(true); // 背景を塗る設定
    QPalette originalPalette = originalLabel->palette();
    originalPalette.setColor(QPalette::Window, originalColor);
    originalLabel->setPalette(originalPalette);
    originalLabel->setAlignment(Qt::AlignCenter);
    originalLabel->setFixedHeight(50);

    QLabel *defaultLighterLabel = new QLabel("lighter() で明るくした色 (factor 150)");
    defaultLighterLabel->setAutoFillBackground(true);
    QPalette defaultLighterPalette = defaultLighterLabel->palette();
    defaultLighterPalette.setColor(QPalette::Window, defaultLighterColor);
    defaultLighterLabel->setPalette(defaultLighterPalette);
    defaultLighterLabel->setAlignment(Qt::AlignCenter);
    defaultLighterLabel->setFixedHeight(50);

    QLabel *muchLighterLabel = new QLabel("lighter(200) で明るくした色");
    muchLighterLabel->setAutoFillBackground(true);
    QPalette muchLighterPalette = muchLighterLabel->palette();
    muchLighterPalette.setColor(QPalette::Window, muchLighterColor);
    muchLighterLabel->setPalette(muchLighterPalette);
    muchLighterLabel->setAlignment(Qt::AlignCenter);
    muchLlighterLabel->setFixedHeight(50);

    layout->addWidget(originalLabel);
    layout->addWidget(defaultLighterLabel);
    layout->addWidget(muchLighterLabel);

    window.resize(400, 300);
    window.show();

    return a.exec();
}

解説: この例では、3つのQLabelウィジェットを作成し、それぞれに異なる青色を背景色として設定しています。

  1. originalColor: 基本となる青色
  2. defaultLighterColor: originalColor.lighter()(引数なし)で生成された、デフォルトのfactor(通常150)で明るくされた青色。
  3. muchLighterColor: originalColor.lighter(200)で生成された、より大きなfactor(200)でさらに明るくされた青色。

実行すると、青、少し明るい青、そしてさらに明るい青の3つの色の帯が表示され、lighter()の効果が視覚的にわかります。

例2:ホバーエフェクトでの利用(QGraphicsEffectを使用)

UI要素にマウスが乗ったときに色を明るくする、といったホバーエフェクトはlighter()の一般的な使用例です。ここではQGraphicsColorizeEffectを使用して、よりモダンな方法で実現します。

#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QColor>
#include <QGraphicsColorizeEffect> // 色を変更するエフェクト
#include <QPropertyAnimation>    // アニメーション用

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

    QWidget window;
    window.setWindowTitle("QColor::lighter() とホバーエフェクト");
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QPushButton *button = new QPushButton("ホバーで色が変わるボタン");
    button->setFixedSize(200, 50);
    button->setStyleSheet("QPushButton { background-color: #6A5ACD; color: white; border: none; border-radius: 5px; font-size: 16px; }"); // 基本的なスタイル

    // QGraphicsColorizeEffect をボタンに設定
    QGraphicsColorizeEffect *colorizeEffect = new QGraphicsColorizeEffect(button);
    colorizeEffect->setColor(QColor(Qt::white)); // 白で色付け(明るくする効果)
    colorizeEffect->setStrength(0.0); // 初期状態では効果なし
    button->setGraphicsEffect(colorizeEffect);

    // アニメーションオブジェクトを作成
    QPropertyAnimation *animation = new QPropertyAnimation(colorizeEffect, "strength");
    animation->setDuration(200); // アニメーション時間 (ms)

    // マウスがボタンに乗ったときの処理
    QObject::connect(button, &QPushButton::entered, [&]() {
        // ボタンの現在の背景色を取得
        QColor originalBgColor = button->palette().color(QPalette::Button);
        // 背景色を少し明るくした色をエフェクトの色として設定
        // QGraphicsColorizeEffectを使う場合、Strengthを調整することで明るさを制御します
        // lighter()を直接使う代わりに、strengthを0.0から1.0の間で制御することで明るさの変化をアニメーションさせます
        // ここでは、ボタンの背景色をそのまま使い、Strengthを調整します。
        // もしlighter()で直接色を明るくしたい場合は、QPushButton::setStyleSheet()を直接変更する必要があります。
        // この例では、QGraphicsColorizeEffectの'strength'プロパティをアニメーションさせて視覚的な明るさの変化を表現します。
        
        // lighter() の概念を QGraphicsColorizeEffect で表現するために、
        // strength のアニメーションで「明るくする」効果をシミュレートします。
        animation->setStartValue(0.0);
        animation->setEndValue(0.3); // 0.3 の強さで明るくする (色の混ぜ具合)
        animation->start();
    });

    // マウスがボタンから離れたときの処理
    QObject::connect(button, &QPushButton::left, [&]() {
        animation->setStartValue(colorizeEffect->strength());
        animation->setEndValue(0.0); // 効果を解除
        animation->start();
    });

    layout->addWidget(button, 0, Qt::AlignCenter); // ボタンを中央に配置
    window.resize(300, 150);
    window.show();

    return a.exec();
}

解説: この例では、QPushButtonにマウスカーソルが乗ったときに、QGraphicsColorizeEffectQPropertyAnimationを組み合わせてボタンを明るくする効果を実現しています。

  • lighter()との関連: 直接lighter()を呼んでボタンの背景色をsetStyleSheet()で変更することもできますが、QGraphicsEffectを使うとより滑らかなアニメーションを実現できます。lighter()計算された明るい色そのものを返すのに対し、QGraphicsColorizeEffect効果の強さを調整することで明るさの変化を表現します。この例では、lighter()が返すような「明るくなった色」という結果を、エフェクトとアニメーションで視覚的に再現しています。
  • QPropertyAnimation: colorizeEffectstrengthプロパティをアニメーションさせ、0.0(効果なし)から0.3(ある程度明るくする)の間でスムーズに変化させます。
  • QGraphicsColorizeEffect: ウィジェットの色に別の色を混ぜる効果を提供します。setStrength()でその混ぜ具合を調整します。

色のランダム性とlighter()の組み合わせは、例えばカラフルなグラフの要素を強調表示する際などに役立ちます。

#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <QColor>
#include <QRandomGenerator> // Qt 5.10 以降
#include <QPalette>

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

    QWidget window;
    window.setWindowTitle("ランダムな色と lighter()");
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QLabel *originalColorLabel = new QLabel("元のランダムな色");
    originalColorLabel->setAutoFillBackground(true);
    originalColorLabel->setAlignment(Qt::AlignCenter);
    originalColorLabel->setFixedHeight(50);

    QLabel *lighterColorLabel = new QLabel("lighter() で明るくした色");
    lighterColorLabel->setAutoFillBackground(true);
    lighterColorLabel->setAlignment(Qt::AlignCenter);
    lighterColorLabel->setFixedHeight(50);

    QPushButton *generateButton = new QPushButton("新しい色を生成");

    layout->addWidget(originalColorLabel);
    layout->addWidget(lighterColorLabel);
    layout->addWidget(generateButton);

    // ボタンがクリックされたときの処理
    QObject::connect(generateButton, &QPushButton::clicked, [&]() {
        // ランダムな色を生成 (QColor::fromRgb でRGB値を直接指定)
        QColor randomColor(
            QRandomGenerator::global()->generate() % 256,
            QRandomGenerator::global()->generate() % 256,
            QRandomGenerator::global()->generate() % 256
        );

        // 生成した色を元のラベルに設定
        QPalette originalPalette = originalColorLabel->palette();
        originalPalette.setColor(QPalette::Window, randomColor);
        originalColorLabel->setPalette(originalPalette);
        originalColorLabel->setText(QString("元のランダムな色 (RGB: %1, %2, %3)")
                                       .arg(randomColor.red())
                                       .arg(randomColor.green())
                                       .arg(randomColor.blue()));

        // lighter() で明るくした色を生成
        QColor lighterRandomColor = randomColor.lighter();

        // 明るくした色を明るいラベルに設定
        QPalette lighterPalette = lighterColorLabel->palette();
        lighterPalette.setColor(QPalette::Window, lighterRandomColor);
        lighterColorLabel->setPalette(lighterPalette);
        lighterColorLabel->setText(QString("lighter() で明るくした色 (RGB: %1, %2, %3)")
                                      .arg(lighterRandomColor.red())
                                      .arg(lighterRandomColor.green())
                                      .arg(lighterRandomColor.blue()));
    });

    // アプリケーション起動時に一度色を生成
    generateButton->click();

    window.resize(500, 300);
    window.show();

    return a.exec();
}

解説: この例では、「新しい色を生成」ボタンをクリックするたびに、以下の処理が行われます。

  1. QRandomGeneratorを使用して、ランダムなRGB値で新しいQColorオブジェクトを作成します。
  2. そのランダムな色を1つ目のQLabelの背景に設定します。
  3. randomColor.lighter()を呼び出して、ランダムな色のより明るいバージョンを作成します。
  4. その明るい色を2つ目のQLabelの背景に設定します。

これにより、さまざまな元の色に対してlighter()がどのように機能するかが動的に確認できます。特に、非常に暗い色がどれくらい明るくなるか、またはすでに明るい色がさらに明るくなるか(そして白に近づくか)を観察できます。



HSV (Hue-Saturation-Value) モデルを直接操作する

QColor::lighter()は内部的にHSVモデルのValue(明度)成分を操作しています。そのため、直接HSV成分を操作することで、より柔軟な明るさ調整が可能です。

  • setHsv() / setHsvF() でV値を調整: V値を増減させることで、明るさを調整できます。
  • value() / valueF(): 現在の色のV成分を取得します。
  • setHsv() / setHsvF(): HSV値を設定して新しいQColorオブジェクトを作成します。
  • toHsv(): 現在のQColorオブジェクトをHSVモデルに変換します。

利点:

  • lighter()では対応できない、色の「暗くする」操作(V値を減らす)も同じロジックで実現できます。
  • 明るさの変化を線形的に制御したり、最大値(255または1.0)でクリッピングする際の挙動を細かく調整できます。
  • 色相(Hue)と彩度(Saturation)を保ちつつ、明度のみを正確に制御できます。

欠点:

  • RGB値を直接操作するよりも、少しコードが複雑になります。

コード例:

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

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

    QWidget window;
    window.setWindowTitle("HSVモデルで明るさ調整");

    QVBoxLayout *layout = new QVBoxLayout(&window);

    QColor originalColor(100, 150, 200); // 元の色 (RGB)

    // HSVに変換
    QColor hsvColor = originalColor.toHsv();
    int h = hsvColor.hue();
    int s = hsvColor.saturation();
    int v = hsvColor.value(); // 明度成分を取得

    // V値を増やして明るくする (最大255)
    int newV = qMin(255, v + 50); // 50だけ明度を増やす
    QColor brighterColorHsv;
    brighterColorHsv.setHsv(h, s, newV);

    // QColor::lighter() と比較用
    QColor lighterBuiltin = originalColor.lighter();

    // ラベルの作成と色の設定
    QLabel *originalLabel = new QLabel("元の色 (RGB)");
    originalLabel->setAutoFillBackground(true);
    QPalette originalPalette = originalLabel->palette();
    originalPalette.setColor(QPalette::Window, originalColor);
    originalLabel->setPalette(originalPalette);
    originalLabel->setAlignment(Qt::AlignCenter);
    originalLabel->setFixedHeight(50);

    QLabel *hsvBrighterLabel = new QLabel(QString("HSV調整で明るくした色 (V: %1 -> %2)").arg(v).arg(newV));
    hsvBrighterLabel->setAutoFillBackground(true);
    QPalette hsvBrighterPalette = hsvBrighterLabel->palette();
    hsvBrighterPalette.setColor(QPalette::Window, brighterColorHsv);
    hsvBrighterLabel->setPalette(hsvBrighterPalette);
    hsvBrighterLabel->setAlignment(Qt::AlignCenter);
    hsvBrighterLabel->setFixedHeight(50);

    QLabel *builtinLighterLabel = new QLabel("QColor::lighter()で明るくした色");
    builtinLighterLabel->setAutoFillBackground(true);
    QPalette builtinLighterPalette = builtinLighterLabel->palette();
    builtinLighterPalette.setColor(QPalette::Window, lighterBuiltin);
    builtinLighterLabel->setPalette(builtinLighterPalette);
    builtinLighterLabel->setAlignment(Qt::AlignCenter);
    builtinLighterLabel->setFixedHeight(50);

    layout->addWidget(originalLabel);
    layout->addWidget(hsvBrighterLabel);
    layout->addWidget(builtinLighterLabel);

    window.resize(500, 300);
    window.show();

    return a.exec();
}

HSL (Hue-Saturation-Lightness) モデルを直接操作する

HSVと似ていますが、HSLモデルは「Lightness(明度)」という成分を持ち、これは人間の知覚に近い明るさの表現を提供します。QColor::lighter()はHSVのValueを操作するのに対し、HSLのLightnessはまた異なる明るさの概念です。

  • lightness() / lightnessF(): 現在の色のL成分を取得します。
  • setHsl() / setHslF(): HSL値を設定して新しいQColorオブジェクトを作成します。
  • toHsl(): 現在のQColorオブジェクトをHSLモデルに変換します。

利点:

  • 非常に暗い色や明るい色でも、より自然な変化を期待できる場合があります。
  • 人間の知覚に近い明るさ調整が可能です。

欠点:

  • HSV同様、コードが少し複雑になります。

コード例:

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

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

    QWidget window;
    window.setWindowTitle("HSLモデルで明るさ調整");

    QVBoxLayout *layout = new QVBoxLayout(&window);

    QColor originalColor(100, 150, 200); // 元の色 (RGB)

    // HSLに変換
    QColor hslColor = originalColor.toHsl();
    int h = hslColor.hue();
    int s = hslColor.saturation();
    int l = hslColor.lightness(); // 明度成分を取得

    // L値を増やして明るくする (最大255)
    int newL = qMin(255, l + 70); // 70だけ明度を増やす
    QColor brighterColorHsl;
    brighterColorHsl.setHsl(h, s, newL);

    // ラベルの作成と色の設定
    QLabel *originalLabel = new QLabel("元の色 (RGB)");
    originalLabel->setAutoFillBackground(true);
    QPalette originalPalette = originalLabel->palette();
    originalPalette.setColor(QPalette::Window, originalColor);
    originalLabel->setPalette(originalPalette);
    originalLabel->setAlignment(Qt::AlignCenter);
    originalLabel->setFixedHeight(50);

    QLabel *hslBrighterLabel = new QLabel(QString("HSL調整で明るくした色 (L: %1 -> %2)").arg(l).arg(newL));
    hslBrighterLabel->setAutoFillBackground(true);
    QPalette hslBrighterPalette = hslBrighterLabel->palette();
    hslBrighterPalette.setColor(QPalette::Window, brighterColorHsl);
    hslBrighterLabel->setPalette(hslBrighterPalette);
    hslBrighterLabel->setAlignment(Qt::AlignCenter);
    hslBrighterLabel->setFixedHeight(50);

    layout->addWidget(originalLabel);
    layout->addWidget(hslBrighterLabel);

    window.resize(500, 200);
    window.show();

    return a.exec();
}

RGB成分を直接操作する

これは最も直接的な方法で、各RGB成分を個別に増減させることで色を明るくします。

利点:

  • HSV/HSL変換による微細な色の変化を避けたい場合に有効。
  • 非常にシンプルで、計算コストが低い。

欠点:

  • 各成分が255を超えないようにクリッピングする必要があり、クリッピングが発生すると元の色の比率が崩れ、色相がさらに変化する可能性があります。
  • R, G, Bの各成分を均等に増減させると、色相が変化してしまう可能性があります(例:青が白に近づく過程でシアンやマゼンタを帯びる)。

コード例:

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

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

    QWidget window;
    window.setWindowTitle("RGB直接操作で明るさ調整");

    QVBoxLayout *layout = new QVBoxLayout(&window);

    QColor originalColor(50, 100, 150); // 元の色 (RGB)

    int r = originalColor.red();
    int g = originalColor.green();
    int b = originalColor.blue();

    // 各RGB成分を定数で増やす(例: 50)
    int increaseAmount = 50;
    int newR = qMin(255, r + increaseAmount);
    int newG = qMin(255, g + increaseAmount);
    int newB = qMin(255, b + increaseAmount);

    QColor brighterColorRgb(newR, newG, newB);

    // ラベルの作成と色の設定
    QLabel *originalLabel = new QLabel("元の色 (RGB)");
    originalLabel->setAutoFillBackground(true);
    QPalette originalPalette = originalLabel->palette();
    originalPalette.setColor(QPalette::Window, originalColor);
    originalLabel->setPalette(originalPalette);
    originalLabel->setAlignment(Qt::AlignCenter);
    originalLabel->setFixedHeight(50);

    QLabel *rgbBrighterLabel = new QLabel(QString("RGB直接調整で明るくした色 (R:%1->%2, G:%3->%4, B:%5->%6)")
                                            .arg(r).arg(newR).arg(g).arg(newG).arg(b).arg(newB));
    rgbBrighterLabel->setAutoFillBackground(true);
    QPalette rgbBrighterPalette = rgbBrighterLabel->palette();
    rgbBrighterPalette.setColor(QPalette::Window, brighterColorRgb);
    rgbBrighterLabel->setPalette(rgbBrighterPalette);
    rgbBrighterLabel->setAlignment(Qt::AlignCenter);
    rgbBrighterLabel->setFixedHeight(50);

    layout->addWidget(originalLabel);
    layout->addWidget(rgbBrighterLabel);

    window.resize(500, 200);
    window.show();

    return a.exec();
}
  • パフォーマンスが最重要で、色相の変化を許容できる場合: RGB成分を直接操作する方法も選択肢に入りますが、色の見た目の品質に注意が必要です。
  • 人間の知覚に近い明るさ変化を重視する場合: HSLモデルを直接操作する方法を検討してください。特に、暗い色から明るい色へのグラデーションなどで、より自然な見た目が必要な場合に有効です。
  • 色相を保ちつつ、明度のみを正確に制御したい場合: HSVモデルを直接操作する方法が最も推奨されます。QColor::lighter()の内部処理に最も近いため、予測可能な結果が得られやすいです。
  • 最も単純な明るさ調整で、色相の変化を気にしない場合: QColor::lighter() が最も簡単で適切です。