Qtプログラミング入門: QColor::fromCmykF()でCMYKカラーを操る

2025-05-27

CMYKカラーモデルとは?

CMYKは、シアン(Cyan)、マゼンタ(Magenta)、イエロー(Yellow)、キー(Key / 黒:Black)の4つの色成分で色を表現する減法混色モデルです。主に印刷業界で使われます。

  • K (Key / Black): キープレート(黒)。CMYの3色を混ぜると理論的には黒になりますが、実際には純粋な黒にならないため、Kを加えることでより深みのある黒を表現します。
  • Y (Yellow): イエロー
  • M (Magenta): マゼンタ
  • C (Cyan): シアン

QColor QColor::fromCmykF() の説明

この関数は、以下のいずれかの形式で呼び出すことができます。

  1. QColor QColor::fromCmykF(qreal c, qreal m, qreal y, qreal k)

    • c: シアン成分 (0.0 ~ 1.0)
    • m: マゼンタ成分 (0.0 ~ 1.0)
    • y: イエロー成分 (0.0 ~ 1.0)
    • k: 黒(キー)成分 (0.0 ~ 1.0)
    • この形式では、アルファ(不透明度)はデフォルトで1.0(完全に不透明)になります。
  2. QColor QColor::fromCmykF(qreal c, qreal m, qreal y, qreal k, qreal a)

    • c, m, y, k: 上記と同じ (0.0 ~ 1.0)
    • a: アルファ(不透明度)成分 (0.0 ~ 1.0)。0.0が完全に透明、1.0が完全に不透明です。

特徴:

  • コンビニエンス関数 (Convenience Function): CMYK値から QColor を簡単に作成するための便利な関数です。
  • CMYKカラーモデル: 指定されたCMYK値に基づいて QColor オブジェクトを構築します。
  • 浮動小数点数 (Floating Point): 各色成分の値は 0.0 から 1.0 の範囲の浮動小数点数で指定します。これにより、より細かい色の表現が可能です。
  • 静的関数 (Static Function): QColor クラスのインスタンスを作成せずに直接 QColor::fromCmykF(...) のように呼び出します。
#include <QColor>
#include <QDebug> // デバッグ出力用

int main() {
    // シアン100%, マゼンタ50%, イエロー0%, 黒0% の色を作成 (アルファ値はデフォルトの1.0)
    QColor color1 = QColor::fromCmykF(1.0, 0.5, 0.0, 0.0);
    qDebug() << "Color 1 (CMYK):" << color1.cmykF(); // CMYK値を確認

    // シアン0%, マゼンタ0%, イエロー100%, 黒0%, アルファ値0.5(半透明)の色を作成
    QColor color2 = QColor::fromCmykF(0.0, 0.0, 1.0, 0.0, 0.5);
    qDebug() << "Color 2 (CMYK with Alpha):" << color2.cmykF() << "Alpha:" << color2.alphaF();

    // 黒色の例
    QColor blackColor = QColor::fromCmykF(0.0, 0.0, 0.0, 1.0);
    qDebug() << "Black Color (CMYK):" << blackColor.cmykF();

    // 白色の例 (CMYKでは、すべての成分が0.0に近いと白になる)
    QColor whiteColor = QColor::fromCmykF(0.0, 0.0, 0.0, 0.0);
    qDebug() << "White Color (CMYK):" << whiteColor.cmykF();

    return 0;
}


入力値の範囲外エラー

問題: fromCmykF() は、各CMYK成分(シアン、マゼンタ、イエロー、黒)およびアルファ値を 0.0 から 1.0 の間の qreal (通常 double または float) で受け取ります。この範囲外の値を渡すと、予期せぬ結果や色のクリッピングが発生する可能性があります。

:

// 間違い: 1.0より大きい値
QColor color = QColor::fromCmykF(1.2, 0.5, 0.3, 0.1);
// 間違い: 0.0より小さい値
QColor anotherColor = QColor::fromCmykF(-0.1, 0.5, 0.3, 0.1);

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

  • ユーザー入力など、外部からの値を受け取る場合は、必ずバリデーション(検証)を行い、範囲内に収めるように処理します。
  • 入力値を 0.0 から 1.0 の範囲にクランプ(制限)します。qBound()qMin(), qMax() などのQtユーティリティ関数を使用できます。

CMYKとRGBの変換の違いによる色のズレ

問題: CMYKは減法混色モデルであり、印刷の色を表現するのに適しています。一方、スクリーン表示はRGB(光の三原色)の加法混色モデルに基づいています。QColor::fromCmykF() で作成された色は内部的にRGBに変換されて表示されるため、CMYKで厳密に指定した色が、スクリーン上で期待通りに再現されないことがあります。特に、CMYKのK(黒)成分はRGBには直接対応しないため、色の変換で微妙な違いが生じやすいです。

: 純粋なCMYKの黒 (C:0, M:0, Y:0, K:1.0) は、RGBでは (R:0, G:0, B:0) になりますが、QColorがどのように内部変換を行うか、また表示デバイスの色域によって、厳密な再現性は異なります。

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

  • 表示されている色が期待と異なる場合、QColor::toRgb()QColor::getRgbF() を使って、QColor オブジェクトが内部で持っているRGB値を確認し、どの程度変換誤差があるかを把握します。
  • これはエラーというよりはカラーマネジメントの問題です。正確な色再現が必要な場合は、ICCプロファイルなどのカラーマネジメントシステムを導入することを検討してください。

qreal の精度問題

問題: qreal はプラットフォームによって float または double に解決されます。ほとんどの場合 double ですが、float の場合は精度が低く、非常に微細な色の違いを表現しようとすると、丸め誤差が発生する可能性があります。

: 0.33333333333333330.3333333333333334 のような非常に近い値を指定した場合、float では同じ値として扱われることがあります。

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

  • Qt 6以降は、qreal が常に double であると保証されるため、この問題はより少なくなっています。Qt 5以前を使用している場合は注意が必要です。
  • 通常の使用では問題になりにくいですが、科学計算や高精度なグラフィックアプリケーションで色の厳密な制御が必要な場合は、この可能性を考慮し、丸め誤差が許容できる範囲内にあるか確認します。

問題: CMYKモデルの特性を十分に理解していない場合、RGBと同じ感覚で値を指定してしまい、意図しない色になることがあります。

  • : RGBでは (0,0,0) ですが、CMYKでは純粋な黒は K:1.0 (C:0, M:0, Y:0, K:1.0) で表現されます。CMYを混ぜた黒 (C:1.0, M:1.0, Y:1.0, K:0) は、印刷では「リッチブラック」と呼ばれ、真っ黒ではなく濃い茶色や灰色に見えることがあります(Qtの内部変換でどう扱われるかは実装による)。
  • : RGBでは (255,255,255) または (1.0,1.0,1.0) ですが、CMYKでは (C:0, M:0, Y:0, K:0) です(インクが全くない状態)。
  • RGBの各成分は「光の量」を表します。値が高いほどその色の光が多く、結果的に明るくなります。
  • CMYKの各成分は「色のインクの量」を表します。値が高いほどその色のインクが多く、結果的に暗くなります。

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

  • 色見本やカラーピッカーツールでCMYK値を指定し、それをQtに適用してみることで、感覚を掴むことができます。
  • QColor オブジェクトを作成した後、QColor::toRgb()QColor::name() メソッドを使って、変換されたRGB値や色の名前を確認し、期待通りの色になっているかデバッグ出力で確認します。
  • CMYKカラーモデルの基本を理解します。特に、減法混色と加法混色の違いを意識することが重要です。


この関数は、主に印刷業界などで使われるCMYKカラーモデルで色を指定したい場合に便利です。各成分は 0.0(0%)から 1.0(100%)の範囲で指定します。

基本的なCMYK色の作成(アルファ値デフォルト)

最もシンプルな使用例です。アルファ値を指定しない場合、デフォルトで 1.0 (完全に不透明) になります。

#include <QApplication>
#include <QLabel>
#include <QColor>
#include <QPalette> // QColorをウィジェットに適用するために必要
#include <QDebug>   // デバッグ出力用

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

    // シアン100%, マゼンタ50%, イエロー0%, 黒0% の色を作成
    // これは鮮やかな青紫のような色になります
    QColor cmykColor = QColor::fromCmykF(1.0, 0.5, 0.0, 0.0);

    qDebug() << "CMYK Color (C, M, Y, K):"
             << cmykColor.cyanF() << cmykColor.magentaF()
             << cmykColor.yellowF() << cmykColor.blackF();
    qDebug() << "Converted RGB Color:"
             << cmykColor.red() << cmykColor.green() << cmykColor.blue();

    QLabel label;
    label.setText("CMYK Color Example");
    label.setFixedSize(200, 100);

    QPalette palette = label.palette();
    palette.setColor(QPalette::Window, cmykColor); // 背景色を設定
    label.setAutoFillBackground(true); // 背景色で塗りつぶす設定を有効にする
    label.setPalette(palette);

    label.show();

    return app.exec();
}

解説:

  • QLabel の背景色として作成した QColor を適用し、GUIで色を確認できるようにしています。
  • qDebug() を使って、作成された QColor のCMYK値と、Qtが内部的に変換したRGB値を確認しています。CMYKは減法混色なので、RGB値は一般的にCMYKとは異なる数値になります。
  • QColor::fromCmykF(1.0, 0.5, 0.0, 0.0) でCMYK値を指定して QColor オブジェクトを作成します。

CMYKとアルファ値の指定

4つのCMYK成分に加えて、アルファ値(不透明度)を 0.0(完全透明)から 1.0(完全不透明)の範囲で指定できます。

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

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

    // シアン0%, マゼンタ0%, イエロー100%, 黒0%, アルファ値0.5(半透明)
    // これは半透明の黄色になります
    QColor semiTransparentYellow = QColor::fromCmykF(0.0, 0.0, 1.0, 0.0, 0.5);

    qDebug() << "Semi-Transparent Yellow (CMYK, Alpha):"
             << semiTransparentYellow.cyanF() << semiTransparentYellow.magentaF()
             << semiTransparentYellow.yellowF() << semiTransparentYellow.blackF()
             << semiTransparentYellow.alphaF();
    qDebug() << "Converted RGB Color (including alpha):"
             << semiTransparentYellow.red() << semiTransparentYellow.green()
             << semiTransparentYellow.blue() << semiTransparentYellow.alpha();

    QLabel label;
    label.setText("Semi-Transparent CMYK Color");
    label.setFixedSize(200, 100);

    QPalette palette = label.palette();
    palette.setColor(QPalette::Window, semiTransparentYellow);
    label.setAutoFillBackground(true);
    label.setPalette(palette);

    label.show();

    return app.exec();
}

解説:

  • 半透明の色は、その下の要素と混ざり合って表示されます。
  • QColor::fromCmykF(0.0, 0.0, 1.0, 0.0, 0.5) のように5番目の引数でアルファ値を指定します。

異なるCMYK値の色の比較

いくつかの異なるCMYK値を持つ色を作成し、その特性を比較します。

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

// 色を表示するカスタムウィジェット
class ColorDisplayWidget : public QWidget {
public:
    ColorDisplayWidget(const QColor &color, const QString &name, QWidget *parent = nullptr)
        : QWidget(parent) {
        setFixedSize(250, 80);
        QPalette pal = palette();
        pal.setColor(QPalette::Window, color);
        setAutoFillBackground(true);
        setPalette(pal);

        QLabel *nameLabel = new QLabel(name, this);
        nameLabel->setAlignment(Qt::AlignCenter);
        nameLabel->setStyleSheet("color: white; font-weight: bold;"); // 文字色を白に
        // 背景色によって文字色を自動的に黒または白に切り替えることも可能
        // (例: QColor::lightnessF() > 0.5 ? Qt::black : Qt::white)

        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(nameLabel);
        setLayout(layout);

        // デバッグ出力
        qDebug() << name << "CMYK:"
                 << color.cyanF() << color.magentaF()
                 << color.yellowF() << color.blackF()
                 << "Alpha:" << color.alphaF();
        qDebug() << name << "RGB:"
                 << color.red() << color.green() << color.blue()
                 << "Alpha:" << color.alpha();
    }
};

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

    QWidget window;
    window.setWindowTitle("CMYK Color Examples");
    QVBoxLayout *mainLayout = new QVBoxLayout(&window);

    // 純粋な黒 (Kのみ)
    QColor pureBlack = QColor::fromCmykF(0.0, 0.0, 0.0, 1.0);
    mainLayout->addWidget(new ColorDisplayWidget(pureBlack, "Pure Black (K:1.0)"));

    // リッチブラック (CMYも含む黒)
    // 印刷でより深みのある黒を出すために使われることが多い
    QColor richBlack = QColor::fromCmykF(0.75, 0.68, 0.67, 0.90);
    mainLayout->addWidget(new ColorDisplayWidget(richBlack, "Rich Black (CMYK mix)"));

    // 純粋な白 (CMYKすべて0.0)
    QColor pureWhite = QColor::fromCmykF(0.0, 0.0, 0.0, 0.0);
    mainLayout->addWidget(new ColorDisplayWidget(pureWhite, "Pure White (CMYK:0.0)"));

    // シアン100%
    QColor cyan = QColor::fromCmykF(1.0, 0.0, 0.0, 0.0);
    mainLayout->addWidget(new ColorDisplayWidget(cyan, "Cyan (C:1.0)"));

    // マゼンタ100%
    QColor magenta = QColor::fromCmykF(0.0, 1.0, 0.0, 0.0);
    mainLayout->addWidget(new ColorDisplayWidget(magenta, "Magenta (M:1.0)"));

    // イエロー100%
    QColor yellow = QColor::fromCmykF(0.0, 0.0, 1.0, 0.0);
    mainLayout->addWidget(new ColorDisplayWidget(yellow, "Yellow (Y:1.0)"));

    window.setLayout(mainLayout);
    window.show();

    return app.exec();
}

解説:

  • CMYの原色も同様に作成し、表示しています。
  • 白はすべてのCMYK成分が0.0で表現されます。
  • CMYKモデルにおける「黒」の表現として、純粋な黒(Kのみ)と「リッチブラック」(CMYも混ぜる)の2つの例を示しています。印刷ではリッチブラックがよく使われますが、画面上では純粋な黒と区別がつきにくいかもしれません。
  • ColorDisplayWidget クラスを作成し、各色を視覚的に表示しています。

CMYKスライダーと色のリアルタイム表示

UI要素(スライダー)を使ってCMYK値を調整し、リアルタイムで色をプレビューするアプリケーションの例です。

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

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

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

        // 色表示エリア
        colorDisplayLabel = new QLabel("Adjust CMYK to see the color");
        colorDisplayLabel->setFixedSize(300, 150);
        colorDisplayLabel->setAlignment(Qt::AlignCenter);
        colorDisplayLabel->setAutoFillBackground(true); // 背景色で塗りつぶす
        mainLayout->addWidget(colorDisplayLabel);

        // CMYKスライダーとラベル
        cyanSlider = createSlider("Cyan:", mainLayout);
        magentaSlider = createSlider("Magenta:", mainLayout);
        yellowSlider = createSlider("Yellow:", mainLayout);
        blackSlider = createSlider("Black:", mainLayout);
        alphaSlider = createSlider("Alpha:", mainLayout); // アルファスライダーも追加

        // スライダーの初期値設定(0.0-1.0を0-100にマッピング)
        cyanSlider->setValue(0);
        magentaSlider->setValue(0);
        yellowSlider->setValue(0);
        blackSlider->setValue(0);
        alphaSlider->setValue(100); // デフォルトは完全に不透明

        // スライダーの値が変更されたときに色を更新する
        connect(cyanSlider, &QSlider::valueChanged, this, &CmykColorAdjuster::updateColor);
        connect(magentaSlider, &QSlider::valueChanged, this, &CmykColorAdjuster::updateColor);
        connect(yellowSlider, &QSlider::valueChanged, this, &CmykColorAdjuster::updateColor);
        connect(blackSlider, &QSlider::valueChanged, this, &CmykColorAdjuster::updateColor);
        connect(alphaSlider, &QSlider::valueChanged, this, &CmykColorAdjuster::updateColor);

        // 初期色の更新
        updateColor();
    }

private slots:
    void updateColor() {
        // スライダーの値を0.0-1.0のqrealに変換
        qreal c = cyanSlider->value() / 100.0;
        qreal m = magentaSlider->value() / 100.0;
        qreal y = yellowSlider->value() / 100.0;
        qreal k = blackSlider->value() / 100.0;
        qreal a = alphaSlider->value() / 100.0;

        // QColor::fromCmykF() を使って色を作成
        QColor currentColor = QColor::fromCmykF(c, m, y, k, a);

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

        // テキストの色を背景色に合わせて変更
        if (currentColor.lightnessF() > 0.5) { // 明度が高い場合は黒文字
            colorDisplayLabel->setStyleSheet("color: black; font-weight: bold;");
        } else { // 明度が低い場合は白文字
            colorDisplayLabel->setStyleSheet("color: white; font-weight: bold;");
        }

        // デバッグ出力 (オプション)
        qDebug() << QString("CMYK: (%1, %2, %3, %4) Alpha: %5 -> RGB: (%6, %7, %8) Alpha: %9")
                        .arg(c, 0, 'f', 2).arg(m, 0, 'f', 2).arg(y, 0, 'f', 2).arg(k, 0, 'f', 2)
                        .arg(a, 0, 'f', 2)
                        .arg(currentColor.red()).arg(currentColor.green()).arg(currentColor.blue())
                        .arg(currentColor.alpha());
    }

private:
    QLabel *colorDisplayLabel;
    QSlider *cyanSlider;
    QSlider *magentaSlider;
    QSlider *yellowSlider;
    QSlider *blackSlider;
    QSlider *alphaSlider;

    QSlider* createSlider(const QString& labelText, QVBoxLayout* layout) {
        QHBoxLayout *hLayout = new QHBoxLayout();
        QLabel *label = new QLabel(labelText);
        QSlider *slider = new QSlider(Qt::Horizontal);
        slider->setRange(0, 100); // 0%から100%
        slider->setSingleStep(1);

        hLayout->addWidget(label);
        hLayout->addWidget(slider);
        layout->addLayout(hLayout);
        return slider;
    }
};

#include "main.moc" // mocファイルを含める (Qt CreatorやCMakeが自動生成)

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

    CmykColorAdjuster adjuster;
    adjuster.setWindowTitle("CMYK Color Adjuster");
    adjuster.show();

    return app.exec();
}

解説:

  • 文字色を背景色の明度に応じて自動的に白または黒に切り替えることで、常にテキストが読めるようにしています。
  • QLabel の背景色をリアルタイムで更新し、色の変化を視覚的に確認できます。
  • updateColor() スロットでは、スライダーの整数値を 100.0 で割って 0.0 から 1.0qreal 値に変換し、QColor::fromCmykF() に渡しています。
  • QSlider を使ってCMYKとアルファの各成分を 0 から 100 の整数値で操作します。


QColor::setCmykF() メソッドを使用する

fromCmykF() が新しい QColor オブジェクトを返す静的関数であるのに対し、setCmykF() は既存の QColor オブジェクトの色を変更するためのメンバ関数です。

特徴:

  • 戻り値なし: void 型なので、新しい QColor オブジェクトは返しません。
  • 既存オブジェクトの変更: 既に存在する QColor インスタンスの色を変更したい場合に適しています。

構文: void QColor::setCmykF(qreal c, qreal m, qreal y, qreal k, qreal a = 1.0)

:

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

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

    QColor myColor; // デフォルトコンストラクタでQColorオブジェクトを初期化
    myColor.setCmykF(0.0, 0.8, 1.0, 0.0, 0.7); // 既存のオブジェクトにCMYK値を設定(半透明のオレンジに近い色)

    qDebug() << "Updated CMYK Color (C, M, Y, K, A):"
             << myColor.cyanF() << myColor.magentaF()
             << myColor.yellowF() << myColor.blackF() << myColor.alphaF();

    QLabel label;
    label.setText("Color set with setCmykF()");
    label.setFixedSize(250, 100);

    QPalette palette = label.palette();
    palette.setColor(QPalette::Window, myColor);
    label.setAutoFillBackground(true);
    label.setPalette(palette);

    label.show();

    return app.exec();
}

使い分け:

  • setCmykF(): 既に存在する QColor オブジェクトの色を動的に変更したい場合。
  • fromCmykF(): 新しい QColor オブジェクトを作成したい場合。

CMYK整数値を使用する QColor::fromCmyk() および QColor::setCmyk()

fromCmykF() が浮動小数点数(qreal)を使用するのに対し、CMYK成分を 0 から 255 の整数値で指定するバージョンも存在します。

構文:

  • void QColor::setCmyk(int c, int m, int y, int k, int a = 255)
  • QColor QColor::fromCmyk(int c, int m, int y, int k, int a = 255)

特徴:

  • 浮動小数点数との変換: 内部的には浮動小数点数に変換されます (value / 255.0)。
  • 整数値指定: CMYK成分を 0 から 255 の範囲で指定します。アルファ値も同様です。

:

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

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

    // fromCmyk() を使用して色を作成 (シアン255, マゼンタ0, イエロー255, 黒0)
    // これは鮮やかな赤紫色に近い色になります
    QColor cmykIntColor = QColor::fromCmyk(255, 0, 255, 0);

    qDebug() << "CMYK (int) Color (C, M, Y, K):"
             << cmykIntColor.cyan() << cmykIntColor.magenta()
             << cmykIntColor.yellow() << cmykIntColor.black();
    qDebug() << "Converted RGB Color:"
             << cmykIntColor.red() << cmykIntColor.green() << cmykIntColor.blue();

    QLabel label;
    label.setText("Color from Cmyk (int)");
    label.setFixedSize(250, 100);

    QPalette palette = label.palette();
    palette.setColor(QPalette::Window, cmykIntColor);
    label.setAutoFillBackground(true);
    label.setPalette(palette);

    label.show();

    return app.exec();
}

使い分け:

  • fromCmyk() / setCmyk(): CMYK成分を 0255 の整数値として扱う場合に適しています。一部のカラーピッカーや古いAPIではこの形式が使われることがあります。
  • fromCmykF() / setCmykF(): CMYK成分を 0.01.0 の範囲で浮動小数点数として扱う場合に適しています。より高い精度が求められる場合や、計算結果をそのまま渡したい場合に便利です。

他のカラーモデルから変換する

CMYK値を直接指定する代わりに、他のカラーモデル(RGBやHSV/HSL)で色を定義し、必要に応じてCMYKに変換することも可能です。Qtはこれらの変換を自動的に行ってくれます。

特徴:

  • 内部変換: Qtが最適な変換を実行します。ただし、CMYKとRGBの色域の違いにより、完璧な再現は保証されません。
  • より一般的なカラーモデル: RGBはスクリーン表示、HSVは直感的な色選択によく使われます。

:

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

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

    // 1. RGBからQColorを作成
    QColor rgbColor(0, 128, 255); // 中程度の青

    qDebug() << "RGB Color (R, G, B, A):"
             << rgbColor.red() << rgbColor.green() << rgbColor.blue() << rgbColor.alpha();

    // 2. 作成したQColorをCMYKに変換して値を取得
    qreal c, m, y, k, a;
    rgbColor.getCmykF(&c, &m, &y, &k, &a);

    qDebug() << "Converted CMYK (C, M, Y, K, A):"
             << c << m << y << k << a;

    QLabel label;
    label.setText("Color from RGB, then converted to CMYK internally");
    label.setFixedSize(300, 100);

    QPalette palette = label.palette();
    palette.setColor(QPalette::Window, rgbColor); // 元のRGB色を適用
    label.setAutoFillBackground(true);
    label.setPalette(palette);

    label.show();

    return app.exec();
}

解説:

  • ユーザーがRGBやHSVで色を操作する場合、内部でCMYKに変換して表示・処理するというワークフローで使われます。
  • rgbColor.getCmykF(&c, &m, &y, &k, &a); を使用して、この色のCMYK浮動小数点数成分を取得します。
  • QColor rgbColor(0, 128, 255); のように、RGB値で QColor を初期化します。

Qtは多くの標準的な色名(CSS/SVGの色名に準拠)をサポートしており、これらを使用して色を作成できます。

特徴:

  • 事前定義: 非常に一般的な色に限定されます。
  • 可読性: "red" や "blue" などの分かりやすい名前で色を指定できます。

構文: QColor QColor(const QString &name) QColor QColor(Qt::GlobalColor color)

:

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

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

    QColor namedColor("darkcyan"); // 色名でQColorを作成
    // Qt::GlobalColor enumを使用する場合: QColor globalColor(Qt::magenta);

    qDebug() << "Named Color (CMYK):"
             << namedColor.cyanF() << namedColor.magentaF()
             << namedColor.yellowF() << namedColor.blackF();
    qDebug() << "Named Color (RGB):"
             << namedColor.red() << namedColor.green() << namedColor.blue();

    QLabel label;
    label.setText("Color from Name: Dark Cyan");
    label.setFixedSize(250, 100);

    QPalette palette = label.palette();
    palette.setColor(QPalette::Window, namedColor);
    label.setAutoFillBackground(true);
    label.setPalette(palette);

    label.show();

    return app.exec();
}

使い分け:

  • CMYK値を直接指定するほどの厳密さが必要ない場合。
  • コードの可読性を高めたい場合や、特定の標準色を使いたい場合に便利です。