Qt Widgetsで影効果を作成する方法:QGraphicsDropShadowEffectを徹底解説


QGraphicsDropShadowEffect::draw() は、Qt Widgetsライブラリで影効果を生成するために使用される重要な関数です。この関数は、影のオフセット、ぼかし半径、色などの影の特性に基づいて、対象オブジェクトの周囲に影を描画します。

機能

draw() 関数は、QPainter オブジェクトを引数として受け取り、そのオブジェクトを使用して影を描画します。影は、対象オブジェクトの形状を複製し、影の色で塗りつぶし、影のオフセットでオフセットすることで作成されます。ぼかし半径は、影の境界線のぼかし具合を制御するために使用されます。

コード例

QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect();
shadowEffect->setBlurRadius(10.0);
shadowEffect->setOffset(5, 5);
shadowEffect->setColor(QColor(Qt::black));

QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap);
item->setGraphicsEffect(shadowEffect);

scene->addItem(item);

このコード例では、以下の操作が行われます。

  1. QGraphicsDropShadowEffect オブジェクトが作成されます。
  2. ぼかし半径が 10.0 に設定されます。
  3. 影のオフセットが (5, 5) に設定されます。
  4. 影の色が黒に設定されます。
  5. QGraphicsPixmapItem オブジェクトが作成され、ピクセルマップが設定されます。
  6. QGraphicsDropShadowEffect オブジェクトが QGraphicsPixmapItem オブジェクトに設定されます。
  7. QGraphicsPixmapItem オブジェクトがシーンに追加されます。

注意事項

QGraphicsDropShadowEffect::draw() 関数は保護されているため、直接呼び出すことはできません。代わりに、QGraphicsItem オブジェクトに QGraphicsDropShadowEffect オブジェクトを設定することで、この関数を間接的に呼び出すことができます。

  • QGraphicsDropShadowEffect クラスは、Qt Widgets ライブラリの一部です。
  • QGraphicsEffect クラスは、グラフィック効果を定義するための抽象クラスです。
  • QGraphicsDropShadowEffect クラスは、QGraphicsEffect クラスを継承しています。


#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsPixmapItem>
#include <QGraphicsDropShadowEffect>

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

  // シーンとビューを作成
  QGraphicsScene scene;
  QGraphicsView view(&scene);

  // ピクセルマップを作成
  QPixmap pixmap("image.png");

  // ピクセルマップアイテムを作成
  QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap);

  // 影効果を作成
  QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect();
  shadowEffect->setBlurRadius(10.0);
  shadowEffect->setOffset(5, 5);
  shadowEffect->setColor(QColor(Qt::black));

  // アイテムに影効果を設定
  item->setGraphicsEffect(shadowEffect);

  // シーンにアイテムを追加
  scene.addItem(item);

  // ビューをウィジェットとして設定
  view.showMaximized();

  return app.exec();
}
  1. QApplication オブジェクトが作成されます。
  2. QGraphicsScene オブジェクトと QGraphicsView オブジェクトが作成されます。
  3. ピクセルマップ "image.png" が作成されます。
  4. QGraphicsPixmapItem オブジェクトが作成され、ピクセルマップが設定されます。
  5. QGraphicsDropShadowEffect オブジェクトが作成されます。
  6. ぼかし半径が 10.0 に設定されます。
  7. 影のオフセットが (5, 5) に設定されます。
  8. 影の色が黒に設定されます。
  9. QGraphicsDropShadowEffect オブジェクトが QGraphicsPixmapItem オブジェクトに設定されます。
  10. QGraphicsPixmapItem オブジェクトがシーンに追加されます。
  11. QGraphicsView オブジェクトがウィジェットとして設定され、最大化表示されます。

例 2: グラデーション影

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsPixmapItem>
#include <QGraphicsDropShadowEffect>

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

  // シーンとビューを作成
  QGraphicsScene scene;
  QGraphicsView view(&scene);

  // ピクセルマップを作成
  QPixmap pixmap("image.png");

  // ピクセルマップアイテムを作成
  QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap);

  // グラデーション影効果を作成
  QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect();
  shadowEffect->setBlurRadius(10.0);
  shadowEffect->setOffset(5, 5);

  // グラデーションを作成
  QLinearGradient gradient(0, 0, 10, 10);
  gradient.setColorAt(0, QColor(Qt::black));
  gradient.setColorAt(1, QColor(Qt::transparent));

  // グラデーションを影の色に設定
  shadowEffect->setColor(gradient);

  // アイテムに影効果を設定
  item->setGraphicsEffect(shadowEffect);

  // シーンにアイテムを追加
  scene.addItem(item);

  // ビューをウィジェットとして設定
  view.showMaximized();

  return app.exec();
}

このコード例では、例の 1 と同様に操作が行われ、影の色がグラデーションに変更されています。

説明

これらのコード例では、QGraphicsDropShadowEffect オブジェクトを使用して、ピクセルマップアイテムに影効果を追加する方法を示しています。影効果の設定方法に関する詳細については、上記のコード例と API ドキュメントを参照してください。

  • Qt Widgets ライブラリには、影効果以外にもさまざまなグラフィック効果が含まれています。
  • より複雑な影効果を作成するには、QGraphicsEffect クラスの他の機能を使用できます。
  • これらのコード例は、Qt Widgets ライブラリの基本的な使用方法を示すものです。


QPainter を使用して影を描く

QPainter クラスを使用して、影を手動で描画することができます。この方法は、柔軟性と制御性に優れていますが、複雑な影効果を作成するには時間がかかり、コード量が多くなります。

利点

  • 複雑な影効果を作成できる
  • 柔軟性と制御性に優れている

欠点

  • 時間とコード量がかかる


void drawShadow(QPainter *painter, const QRectF &rect, qreal blurRadius,
                const QColor &color) {
  // 影のオフセットを設定
  QPointF offset(blurRadius, blurRadius);

  // ぼかし用のパスを作成
  QPainterPath path = rect.adjusted(-blurRadius, -blurRadius, blurRadius,
                                  blurRadius);

  // ぼかし用のマスクを作成
  QGraphicsBlurEffect blurEffect(blurRadius);
  QPixmap blurPixmap = blurEffect.apply(rect);

  // 影を描画
  painter->setOpacity(0.5);
  painter->setRenderHint(QPainter::Antialiasing);
  painter.translate(offset);
  painter.drawPixmap(rect, blurPixmap);
}

QGraphicsBlurEffect と QGraphicsColorizeEffect を組み合わせて使用する

QGraphicsBlurEffectQGraphicsColorizeEffect を組み合わせて使用することで、シンプルな影効果を作成することができます。この方法は、QPainter を使用する方法よりも簡単ですが、QGraphicsDropShadowEffect ほど柔軟ではありません。

利点

  • QPainter を使用するよりも簡単

欠点

  • QGraphicsDropShadowEffect ほど柔軟ではない


QGraphicsBlurEffect *blurEffect = new QGraphicsBlurEffect(10.0);
blurEffect->setBlurStrength(0.5);

QGraphicsColorizeEffect *colorizeEffect = new QGraphicsColorizeEffect(QColor(Qt::black));

QGraphicsEffect *shadowEffect = new QGraphicsParallelEffect(blurEffect,
                                                          colorizeEffect);

item->setGraphicsEffect(shadowEffect);

CSS を使用して影を表現する

Qt Widgets 5.11 以降では、CSS を使用して影を表現することができます。この方法は、他の方法よりも簡潔で、コードをメンテナンスしやすいという利点があります。

利点

  • 簡潔でメンテナンスしやすい

欠点

  • Qt Widgets 5.11 以降でのみ使用可能


QGraphicsPixmapItem {
  border-image: url("image.png") 1 0 1 0 stretch;
  border-radius: 5px;
  box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
}

サードパーティ製のライブラリを使用する

Qt には、影表現に特化したサードパーティ製のライブラリがいくつかあります。これらのライブラリは、より高度な影効果を作成するために使用することができます。

利点

  • より高度な影効果を作成できる

欠点

  • サードパーティ製のライブラリを使用する必要がある


上記のように、Qt で影表現を行う方法はいくつかあります。どの方法を選択するかは、ニーズと要件によって異なります。

  • より高度な影効果が必要な場合は、サードパーティ製のライブラリを使用することを検討してください。
  • コードをメンテナンスしやすいようにしたい場合は、CSS を使用する方法が適しています。
  • シンプルな影効果が必要な場合は、QGraphicsBlurEffectQGraphicsColorizeEffect を組み合わせて使用する方が簡単です。
  • 柔軟性と制御性に優れた影効果が必要な場合は、QPainter を使用する方法が適しています。