QRgbだけじゃない!Qtで色を扱う代替メソッドとQColorの活用
QRgb qRgb()
とは?
QRgb qRgb()
は、Qtフレームワークで色を表現するために使われる関数と型です。
-
qRgba(int r, int g, int b, int a)
(関数):qRgb
と同様に、赤、緑、青の成分に加えて、アルファ(a)成分(0〜255の整数値、0が完全な透明、255が完全な不透明)を指定してQRgb
型の値を作成する関数です。 -
qRgb(int r, int g, int b)
(関数): このグローバル関数は、指定された赤(r)、緑(g)、青(b)の各成分(それぞれ0〜255の整数値)からQRgb
型の値を作成して返します。この関数で作成されるQRgb
値は、アルファ値が255(完全に不透明)に設定されます。
なぜQRgb qRgb()
を使うのか?
QtにはQColor
という、より高機能で柔軟な色を扱うクラスがありますが、QRgb
とqRgb()
関数は、特に次のような場合に便利です。
- 効率的な色の表現:
QRgb
は単一のunsigned int
で色を表すため、QColor
オブジェクトよりも軽量です。ピクセルデータのように大量の色情報を扱う際に、メモリ効率が良い場合があります。 - 低レベルなピクセル操作:
QImage
などの画像データを直接操作する際、ピクセル単位で色を設定したり取得したりするのにQRgb
がよく使われます。例えば、QImage::setPixel()
関数はQRgb
値を引数に取ります。 - RGB値の直接的な操作:
qRed()
,qGreen()
,qBlue()
,qAlpha()
といった関数を使って、QRgb
値から個々の色成分を簡単に抽出できます。
QColor
とQRgb
の関係
QColor
クラスは、RGB、HSV、CMYKなどの複数の色モデルをサポートし、色名の指定や、より高度な色の操作(明るくする、暗くする、変換など)を提供します。
QColor
とQRgb
は相互に変換可能です。
QRgb
値からQColor
オブジェクトを作成するには、QColor
のコンストラクタ(例:QColor(QRgb color)
)や、静的メソッドQColor::fromRgb()
またはQColor::fromRgba()
を使用します。QColor
オブジェクトからQRgb
値を取得するには、QColor::rgb()
またはQColor::rgba()
メソッドを使用します。
注意点: QColor(QRgb)
コンストラクタやQColor::fromRgb()
は、渡されたQRgb
値のアルファチャンネルを無視し、不透明(アルファ値255)として扱うことがあります。アルファチャンネルを保持したい場合は、必ずQColor::fromRgba()
を使用するようにしてください。
#include <QImage>
#include <QColor>
#include <QRgb> // qRgb()関数などを使うために必要
#include <QDebug> // デバッグ出力用
int main() {
// qRgb() を使ってQRgb値を作成(アルファは自動的に255)
QRgb myRgbColor = qRgb(255, 0, 0); // 純粋な赤
// qRgba() を使ってQRgb値を作成(アルファを指定)
QRgb semiTransparentBlue = qRgba(0, 0, 255, 128); // 半透明の青
qDebug() << "My RGB Color (Red):" << qRed(myRgbColor);
qDebug() << "My RGB Color (Green):" << qGreen(myRgbColor);
qDebug() << "My RGB Color (Blue):" << qBlue(myRgbColor);
qDebug() << "My RGB Color (Alpha):" << qAlpha(myRgbColor); // 255が出力されるはず
qDebug() << "Semi-Transparent Blue (Alpha):" << qAlpha(semiTransparentBlue); // 128が出力されるはず
// QImageのピクセルを設定する例
QImage image(10, 10, QImage::Format_ARGB32); // ARGB32形式の画像を作成
image.setPixel(0, 0, myRgbColor); // (0,0)のピクセルを赤に設定
image.setPixel(1, 0, semiTransparentBlue); // (1,0)のピクセルを半透明の青に設定
// QRgb値からQColorオブジェクトを作成する例
QColor colorFromRgb(myRgbColor);
qDebug() << "QColor from QRgb (Red):" << colorFromRgb.red();
// アルファ値を保持してQColorを作成する場合
QColor colorFromRgba = QColor::fromRgba(semiTransparentBlue);
qDebug() << "QColor from QRgba (Alpha):" << colorFromRgba.alpha();
return 0;
}
QRgb
は色を効率的に扱うための便利な型ですが、使い方を誤ると予期せぬ挙動やエラーにつながることがあります。
コンパイルエラー: qRgbが見つからない、またはQRgbが型として認識されない
エラーの症状
error: use of undeclared identifier 'qRgb'
error: 'QRgb' does not name a type
error: 'qRgb' was not declared in this scope
原因
qRgb()
関数やQRgb
型は、特定のヘッダーファイルに定義されています。このヘッダーファイルがインクルードされていない場合に発生します。
トラブルシューティング
コードの先頭に以下のインクルードを追加します。
#include <QColor> // QColorクラスと一緒にQRgbやqRgb()が定義されていることが多い
// または、より具体的に色関連の関数が定義されているヘッダーをインクルード
// #include <qcolor.h> // 古いQtバージョンや特定の環境ではこちら
Qtのモジュール構成によっては、QImage
など色を扱う他のクラスを使用する際に自動的にインクルードされることもありますが、明示的に追加するのが最も確実です。
アルファチャンネルの消失または誤った透明度
エラーの症状
QRgb
値からQColor
に変換したり、文字列に変換したりすると、透明度(アルファチャンネル)が失われたり、常に不透明になったりする。
原因
- qRgb()関数の使用
qRgb(r, g, b)
関数は、アルファ値を常に255(不透明)としてQRgb
値を生成します。透明度が必要な場合はqRgba()
を使う必要があります。 - QColor::name()の使用
QColor::name()
メソッドは、デフォルトでアルファチャンネル情報を含まない"#RRGGBB"形式の文字列を返します。 - QColor(QRgb)コンストラクタの使用
QColor
のコンストラクタにQRgb
を渡すと、そのQRgb
が持っているアルファチャンネル情報が無視され、デフォルトで完全に不透明(アルファ値255)として扱われることがあります。これはQColor::fromRgb()
が内部的に呼ばれるためです。
トラブルシューティング
- 透明度を持つQRgbが必要な場合
qRgba(r, g, b, a)
関数を使用します。QRgb transparentRed = qRgba(255, 0, 0, 0); // 完全な透明の赤
- アルファチャンネルを含む文字列形式が必要な場合
QColor::name(QColor::HexArgb)
を使用します。これにより、"#AARRGGBB"形式の文字列が得られます。QColor color(255, 0, 0, 128); // 半透明の赤 QString hexArgbString = color.name(QColor::HexArgb); // "#80FF0000" のような文字列
- アルファチャンネルを保持してQColorを作成する場合
QColor::fromRgba(QRgb)
静的メソッドを使用します。QRgb myColorWithAlpha = qRgba(255, 0, 0, 128); // 半透明の赤 QColor convertedColor = QColor::fromRgba(myColorWithAlpha); // convertedColor.alpha() は 128 になります。
不適切な画像フォーマットでのピクセル操作
エラーの症状
QImage::setPixel()
やQImage::pixel()
を使ってピクセルを操作する際に、色が正しく設定されない、またはクラッシュする。
原因
QImage
オブジェクトがQRgb
値を直接扱う形式(例: QImage::Format_ARGB32
, QImage::Format_RGB32
)でない場合に、これらの関数を使うと問題が発生します。特に、インデックスカラー形式(例: QImage::Format_Indexed8
)の画像に対してQRgb
を直接設定しようとすると、カラーテーブルのインデックスと色の値が一致しないため、予期せぬ結果になります。
トラブルシューティング
- インデックスカラー形式の場合
インデックスカラー形式の画像(例: 8ビット画像)では、QRgb
値を直接ピクセルに設定するのではなく、まずカラーテーブルに色を追加し、その色のインデックスをピクセルに設定する必要があります。QImage image(100, 100, QImage::Format_Indexed8); QVector<QRgb> colorTable; colorTable.append(qRgb(0, 0, 0)); // インデックス0: 黒 colorTable.append(qRgb(255, 255, 255)); // インデックス1: 白 image.setColorTable(colorTable); image.setPixel(10, 10, 1); // インデックス1(白)のピクセルを設定
- QRgbを直接扱うフォーマットを使用する
QImage::Format_ARGB32
またはQImage::Format_RGB32
など、32ビットのRGBまたはARGBフォーマットで画像を作成または変換してからピクセル操作を行います。QImage image(100, 100, QImage::Format_ARGB32); image.setPixel(10, 10, qRgb(0, 255, 0)); // 緑のピクセルを設定
- QImageのフォーマットを確認する
QImage::format()
メソッドで現在の画像のフォーマットを確認します。
QRgb値を直接ビットシフトで操作する際の混乱
エラーの症状
QRgb
はunsigned int
であるため、ビットシフトを使って各色成分を抽出・合成しようとすると、期待する結果にならないことがある。
原因
QRgb
のビットレイアウトは通常、ARGB (Alpha, Red, Green, Blue) の順で各8ビットが割り当てられています。しかし、エンディアンの問題や、自分でビットシフトする際の誤りが発生することがあります。
トラブルシューティング
- qRgb()やqRgba()で合成する
同様に、各成分からQRgb
値を合成する場合も、qRgb()
やqRgba()
を使用するのが最も安全です。QRgb newColor = qRgb(r_val, g_val, b_val);
- Qt提供のユーティリティ関数を使用する
qRed()
,qGreen()
,qBlue()
,qAlpha()
といった関数は、QRgb
値から安全に各色成分を抽出できます。これらの関数は内部で正しいビットシフトとマスクを行ってくれるため、手動でビット操作するよりも安全で読みやすいコードになります。QRgb color = qRgb(10, 20, 30); int r = qRed(color); // 10 int g = qGreen(color); // 20 int b = qBlue(color); // 30
Qtのバージョンによる違い
エラーの症状
古いQtのコードを新しいバージョンでコンパイルするとエラーが出たり、その逆のケースで問題が発生したりする。
原因
Qtのバージョンアップにより、一部のAPIが変更されたり、推奨される方法が変わったりすることがあります。特にQt4からQt5、Qt6への移行では、いくつかの変更がありました。
- 使用しているQtのバージョンに合わせたドキュメントを参照する
Qt公式ドキュメントは、バージョンごとにAPIリファレンスが提供されています。使用しているQtのバージョンに正確に合致するドキュメントを参照することが重要です。
例1: 基本的なQRgb
値の生成と成分の抽出
この例では、qRgb()
とqRgba()
を使って色を生成し、qRed()
, qGreen()
, qBlue()
, qAlpha()
を使って各色成分を抽出する方法を示します。
#include <QDebug> // デバッグ出力用
#include <QColor> // QRgb, qRgb(), qRgba() などの定義が含まれる
int main() {
// 1. qRgb() を使って不透明な色を生成 (アルファ値は自動的に255)
QRgb redColor = qRgb(255, 0, 0); // 純粋な赤 (R=255, G=0, B=0, A=255)
// 各成分を抽出
qDebug() << "--- Red Color ---";
qDebug() << "Red:" << qRed(redColor); // 255
qDebug() << "Green:" << qGreen(redColor); // 0
qDebug() << "Blue:" << qBlue(redColor); // 0
qDebug() << "Alpha:" << qAlpha(redColor); // 255
// 2. qRgba() を使って透明度を持つ色を生成
QRgb semiTransparentBlue = qRgba(0, 0, 255, 128); // 半透明の青 (R=0, G=0, B=255, A=128)
// 各成分を抽出
qDebug() << "\n--- Semi-Transparent Blue Color ---";
qDebug() << "Red:" << qRed(semiTransparentBlue); // 0
qDebug() << "Green:" << qGreen(semiTransparentBlue); // 0
qDebug() << "Blue:" << qBlue(semiTransparentBlue); // 255
qDebug() << "Alpha:" << qAlpha(semiTransparentBlue); // 128
// 3. QRgb値の直接的な比較
QRgb anotherRed = qRgb(255, 0, 0);
if (redColor == anotherRed) {
qDebug() << "\nRed colors are equal.";
} else {
qDebug() << "\nRed colors are NOT equal.";
}
return 0;
}
例2: QImage
でのピクセル操作
QRgb
は、QImage
のピクセルデータを直接操作する際に非常に便利です。
#include <QApplication> // QApplicationが必要(GUIアプリケーションの場合)
#include <QImage>
#include <QLabel>
#include <QRgb>
#include <QPainter> // QPainterを使う場合
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
// 1. 新しいQImageを作成 (ARGB32形式がQRgbを直接扱うのに最適)
// 幅200px, 高さ200px の画像
QImage image(200, 200, QImage::Format_ARGB32);
// 2. 画像全体を白で初期化
image.fill(Qt::white);
// 3. qRgb() と setPixel() でピクセルを設定
// 左上に赤色の正方形を描画
for (int y = 0; y < 50; ++y) {
for (int x = 0; x < 50; ++x) {
image.setPixel(x, y, qRgb(255, 0, 0)); // 赤色
}
}
// 4. qRgba() と setPixel() で透明度を持つピクセルを設定
// 右上に半透明の青色の正方形を描画
for (int y = 0; y < 50; ++y) {
for (int x = 150; x < 200; ++x) {
image.setPixel(x, y, qRgba(0, 0, 255, 128)); // 半透明の青
}
}
// 5. pixel() で既存のピクセル色を取得し、変更する
// 画像の中央に線を描画 (元の色を反転させる)
for (int x = 0; x < 200; ++x) {
QRgb originalPixel = image.pixel(x, 100);
int r = qRed(originalPixel);
int g = qGreen(originalPixel);
int b = qBlue(originalPixel);
// 色を反転
image.setPixel(x, 100, qRgb(255 - r, 255 - g, 255 - b));
}
// 画像を表示するためのQLabel
QLabel label;
label.setPixmap(QPixmap::fromImage(image));
label.setWindowTitle("QImage with QRgb Pixels");
label.show();
return a.exec();
}
例3: QColor
とQRgb
の相互変換
QColor
とQRgb
は相互に変換できます。アルファチャンネルの扱いには注意が必要です。
#include <QDebug>
#include <QColor>
#include <QRgb>
int main() {
// 1. QColorからQRgbへ
QColor qtColor(100, 150, 200, 50); // 半透明の灰色
// QColor::rgb() はアルファを無視してRGB値のみを返す (通常、不透明として扱われる)
QRgb rgbOnly = qtColor.rgb();
qDebug() << "--- QColor to QRgb (rgb()) ---";
qDebug() << "Original Alpha (QColor):" << qtColor.alpha(); // 50
qDebug() << "Extracted Alpha (QRgb from rgb()):" << qAlpha(rgbOnly); // 255 (アルファが無視されるため不透明になる)
// QColor::rgba() はアルファを含むQRgb値を返す
QRgb rgbaWithAlpha = qtColor.rgba();
qDebug() << "\n--- QColor to QRgb (rgba()) ---";
qDebug() << "Extracted Alpha (QRgb from rgba()):" << qAlpha(rgbaWithAlpha); // 50
// 2. QRgbからQColorへ
QRgb myRgb = qRgb(200, 50, 10); // 不透明な色
QRgb myRgba = qRgba(10, 20, 30, 60); // 半透明な色
// QColor(QRgb) コンストラクタ: アルファを無視し、不透明として扱う可能性が高い
QColor colorFromRgbConst(myRgb);
qDebug() << "\n--- QRgb to QColor (constructor) ---";
qDebug() << "QColor from myRgb (Alpha):" << colorFromRgbConst.alpha(); // 255
// QColor::fromRgb(QRgb): アルファを無視し、不透明として扱う
QColor colorFromRgbStatic = QColor::fromRgb(myRgba);
qDebug() << "\n--- QRgb to QColor (fromRgb()) ---";
qDebug() << "QColor from myRgba (Alpha, via fromRgb()):" << colorFromRgbStatic.alpha(); // 255
// QColor::fromRgba(QRgb): アルファチャンネルを保持
QColor colorFromRgbaStatic = QColor::fromRgba(myRgba);
qDebug() << "\n--- QRgb to QColor (fromRgba()) ---";
qDebug() << "QColor from myRgba (Alpha, via fromRgba()):" << colorFromRgbaStatic.alpha(); // 60
return 0;
}
例4: QPainter
での使用 (ブラシとペン)
QPainter
で描画する際に、QRgb
値をQColor
に変換してブラシやペンに設定することができます。
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QRgb>
// カスタムウィジェットの定義
class CustomPaintWidget : public QWidget {
public:
CustomPaintWidget(QWidget *parent = nullptr) : QWidget(parent) {
setWindowTitle("QPainter with QRgb");
resize(300, 200);
}
protected:
void paintEvent(QPaintEvent *event) override {
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); // アンチエイリアスを有効に
// 1. qRgb() で色を生成し、QColor経由でブラシに設定
QRgb fillColor = qRgb(0, 150, 255); // 少し青みがかった色
painter.setBrush(QColor(fillColor)); // QRgbからQColorへ変換
painter.setPen(Qt::NoPen); // 枠線なし
painter.drawRect(20, 20, 100, 80); // 長方形を描画
// 2. qRgba() で透明度を持つ色を生成し、ペンに設定
QRgb penColor = qRgba(255, 0, 0, 100); // 半透明の赤
QPen pen(QColor::fromRgba(penColor)); // アルファチャンネルを保持してQColorへ変換
pen.setWidth(5); // ペンの太さ
painter.setPen(pen);
// 新しいブラシを作成(QColor直接指定)
painter.setBrush(QColor(255, 255, 0, 180)); // 半透明の黄色
painter.drawEllipse(150, 50, 120, 100); // 円を描画
// 3. 別の図形に、前の図形から取得した色を適用
QRgb rectColor = painter.device()->pixel(25, 25); // 長方形内のピクセル色を取得
// 取得した色を使って、別のブラシを設定(少し暗くする)
painter.setBrush(QColor::fromRgb(qRed(rectColor) / 2,
qGreen(rectColor) / 2,
qBlue(rectColor) / 2));
painter.setPen(Qt::NoPen);
painter.drawRect(50, 120, 80, 50); // 別の長方形を描画
}
};
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
CustomPaintWidget widget;
widget.show();
return a.exec();
}
QColorクラスの使用
最も一般的で推奨される代替方法です。
QColor
はQtが提供する色の表現に特化したクラスで、QRgb
よりもはるかに高機能で柔軟性があります。
特徴
- QRgbとの相互変換
QColor::rgb()
、QColor::rgba()
でQRgb
値を取得したり、QColor::fromRgb(QRgb)
、QColor::fromRgba(QRgb)
でQRgb
からQColor
を生成できます。 - 色操作のメソッド
lighter()
,darker()
,toHsv()
,toCmyk()
などの便利なメソッドが提供されています。 - 多様なコンストラクタ
- RGB成分を直接指定:
QColor(int r, int g, int b, int a = 255)
- 色名を指定:
QColor("red")
,QColor("#FF0000")
,QColor("lightgray")
- グローバルカラーを指定:
QColor(Qt::red)
,QColor(Qt::white)
- 既存の
QRgb
から変換:QColor(QRgb color)
(ただし、アルファチャンネルの扱いに注意が必要な場合がある)
- RGB成分を直接指定:
- 複数の色モデルをサポート
RGB(赤、緑、青)だけでなく、HSV(色相、彩度、明度)、CMYK(シアン、マゼンタ、イエロー、キープレート)、HSL(色相、彩度、輝度)などの色モデルで色を表現・操作できます。
利用ケース
- 色に名前を付けて管理したい場合。
- 異なる色モデル間での変換が必要な場合。
- ユーザーが色を選択するダイアログ(
QColorDialog
など)との連携。 - UI要素(ウィジェット、グラフィックシーンアイテムなど)の色設定。
コード例
#include <QDebug>
#include <QColor> // QColorクラスを使用するために必要
int main() {
// RGB成分を直接指定してQColorを作成 (アルファはデフォルトで255)
QColor myColor1(255, 128, 0); // オレンジ
qDebug() << "My Color 1 (RGB):" << myColor1.red() << myColor1.green() << myColor1.blue() << myColor1.alpha();
// アルファ成分も指定してQColorを作成
QColor semiTransparentGreen(0, 255, 0, 100); // 半透明の緑
qDebug() << "Semi-Transparent Green (RGBA):" << semiTransparentGreen.red() << semiTransparentGreen.green() << semiTransparentGreen.blue() << semiTransparentGreen.alpha();
// 色名でQColorを作成
QColor blueColor("blue");
qDebug() << "Blue Color (Named):" << blueColor.red() << blueColor.green() << blueColor.blue();
// Qt::GlobalColor 列挙体でQColorを作成
QColor redColor = Qt::red;
qDebug() << "Red Color (GlobalColor):" << redColor.red() << redColor.green() << redColor.blue();
// 色をHSVで操作
QColor hsvColor;
hsvColor.setHsv(120, 255, 200); // 色相:緑, 彩度:最大, 明度:中
qDebug() << "HSV Color (RGB):" << hsvColor.red() << hsvColor.green() << hsvColor.blue();
// QColorを明るくする
QColor lighterBlue = blueColor.lighter(150); // 150%明るくする
qDebug() << "Lighter Blue (RGB):" << lighterBlue.red() << lighterBlue.green() << lighterBlue.blue();
return 0;
}
Qt::GlobalColor列挙体の使用
Qtには、よく使われる色の定数がQt::GlobalColor
列挙体として定義されています。これらはQColor
オブジェクトとして直接利用できます。
特徴
QColor
オブジェクトを生成する際のシンプルで便利な方法です。- コードの可読性が向上します。
- 事前に定義された基本的な色(例:
Qt::red
,Qt::blue
,Qt::black
,Qt::white
,Qt::transparent
など)にアクセスできます。
利用ケース
- 簡単な描画処理で色を直接指定したい場合。
- GUI要素の基本的な色設定。
コード例
#include <QApplication>
#include <QLabel>
#include <QPainter> // 描画にQPainterを使用する場合
#include <QPen>
#include <QBrush>
class MyWidget : public QWidget {
protected:
void paintEvent(QPaintEvent *event) override {
Q_UNUSED(event);
QPainter painter(this);
// Qt::red を使用して塗りつぶし
painter.setBrush(Qt::red);
painter.drawRect(10, 10, 80, 50);
// Qt::blue を使用して枠線
QPen bluePen(Qt::blue);
bluePen.setWidth(3);
painter.setPen(bluePen);
painter.drawEllipse(100, 10, 80, 50);
// Qt::transparent を使用 (透明な背景)
// 例えば、背景を透明にしたQImageに描画する際などに有用
// 実際にはQt::transparentなQColorを設定すると、背景は通常描画されないか、
// 下にあるものが透けて見えるようになる(グラフィック要素やレンダリングコンテキストによる)
}
};
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MyWidget widget;
widget.show();
return a.exec();
}
CSS/スタイルシートによる色の設定
Qtのウィジェットは、CSS(Cascading Style Sheets)に似た構文のスタイルシートを使用して外観をカスタマイズできます。色もスタイルシートで指定できます。
特徴
- 標準的なCSSの色指定方法(色名、HEXコード、RGB関数など)が使えます。
- ウィジェットやそのサブコントロールに対して柔軟な色の指定が可能です。
- UIの外観をコードから分離し、テーマ設定などを容易にします。
利用ケース
- ユーザーによるカスタマイズ機能の実装。
- 個々のウィジェットやクラス、IDに基づくスタイルの適用。
- アプリケーションのテーマ設定や外観の統一。
コード例
#include <QApplication>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
int main(int argc, char *argv[]) {
QApplication a(argc(argv), argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QPushButton *button1 = new QPushButton("Red Button");
// 赤色の背景、白色のテキスト
button1->setStyleSheet("background-color: red; color: white;");
layout->addWidget(button1);
QPushButton *button2 = new QPushButton("Styled Button");
// HEXコードとRGBA関数を使ったより複雑なスタイル
button2->setStyleSheet(
"QPushButton {"
" background-color: #33AABB;" // HEXコード
" color: rgb(255, 255, 255);" // RGB関数
" border: 2px solid rgba(0, 0, 0, 150);" // RGBA関数 (半透明の黒い枠線)
" border-radius: 5px;"
"}"
"QPushButton:hover {" // ホバー時のスタイル
" background-color: #55CCDD;"
"}"
);
layout->addWidget(button2);
QLineEdit *lineEdit = new QLineEdit("Text input");
lineEdit->setStyleSheet("background-color: lightgray; border: 1px solid darkgray;");
layout->addWidget(lineEdit);
window.setLayout(layout);
window.setWindowTitle("Qt Style Sheets for Colors");
window.show();
return a.exec();
}
QRgba64 (Qt 5.14以降)
QRgb
が各色成分を8ビットで表現するのに対し、QRgba64
は各色成分を16ビットで表現します。これにより、より広い色域や高い精度が必要な場合に利用されます。
特徴
QColor
からQRgba64
へ、またその逆の変換も可能です。- HDR(High Dynamic Range)画像や、精密な画像処理に適しています。
- 各成分が
unsigned short
で表現されるため、0~65535の範囲の色を扱えます。
利用ケース
- より正確な色の表現が求められる科学・医療系の画像処理。
- 色深度が高い画像処理アプリケーション。
- HDR画像の読み込み、処理、表示。
#include <QDebug>
#include <QColor>
#include <QRgba64> // QRgba64型を使用するために必要
int main() {
// QRgba64を直接作成 (ushort値を使用)
QRgba64 highPrecisionRed = qRgba64(65535, 0, 0, 65535); // 純粋な赤 (最高精度)
qDebug() << "High Precision Red (Red):" << highPrecisionRed.red(); // 65535
qDebug() << "High Precision Red (Alpha):" << highPrecisionRed.alpha(); // 65535
// QColorからQRgba64へ変換
QColor vividGreen(0, 255, 0, 200); // 8ビットの緑
QRgba64 vividGreen64 = vividGreen.rgba64();
qDebug() << "\nVivid Green (QColor -> QRgba64):";
qDebug() << "Red (16-bit):" << vividGreen64.red(); // 約0
qDebug() << "Green (16-bit):" << vividGreen64.green(); // 約65535 (255 * 257)
qDebug() << "Blue (16-bit):" << vividGreen64.blue(); // 約0
qDebug() << "Alpha (16-bit):" << vividGreen64.alpha(); // 約51400 (200 * 257)
// QRgba64からQColorへ変換
QColor convertedColor = QColor::fromRgba64(vividGreen64);
qDebug() << "\nConverted back to QColor (8-bit):";
qDebug() << "Red:" << convertedColor.red(); // 0
qDebug() << "Green:" << convertedColor.green(); // 255
qDebug() << "Blue:" << convertedColor.blue(); // 0
qDebug() << "Alpha:" << convertedColor.alpha(); // 200
return 0;
}
- より高い色深度が必要な場合は
QRgba64
を検討します。 - UIのカスタマイズにはスタイルシートが強力です。
- 低レベルなピクセル操作(特に
QImage
との連携)や、特定のカラー形式の入出力にはQRgb
が引き続き有用です。 ただし、qRgb()
関数自体はアルファチャンネルを常に不透明に設定することに注意し、透明度が必要な場合はqRgba()
を使用します。 - 一般的なUIや抽象的な色操作には
QColor
が最も推奨されます。