Qt WidgetsにおけるQGraphicsBlurEffect::blurRadiusChanged()の解説


QGraphicsBlurEffect::blurRadiusChanged() は、Qt Widgetsライブラリで提供されるQGraphicsBlurEffectクラスのシグナルです。このシグナルは、QGraphicsBlurEffectインスタンスのblurRadiusプロパティが変更されたときに発行されます。

用途

blurRadiusChanged()シグナルは、QGraphicsBlurEffectインスタンスが適用するぼかし効果の強さを監視するために使用されます。例えば、スライダなどのユーザーインターフェイス要素を使用してぼかし半径を動的に調整する場合、このシグナルを接続して、ぼかし効果がリアルタイムに更新されるようにすることができます。

シグナルの接続

blurRadiusChanged()シグナルを接続するには、以下のコードのようにQObject::connect()関数を使用します。

QGraphicsBlurEffect *effect = new QGraphicsBlurEffect(this);
connect(effect, &QGraphicsBlurEffect::blurRadiusChanged, this, &MyClass::onblurRadiusChanged);

このコードでは、effectという名前のQGraphicsBlurEffectインスタンスが作成され、MyClassクラスのonblurRadiusChanged()スロットにblurRadiusChanged()シグナルが接続されています。

シグナルハンドラ

blurRadiusChanged()シグナルのスロットは、qreal型の引数を受け取ります。この引数は、新しいぼかし半径を表します。

void MyClass::onblurRadiusChanged(qreal radius)
{
    // ぼかし半径が変更されたときの処理を記述する
    qDebug() << "Blur radius changed to:" << radius;
}

このコードでは、onblurRadiusChanged()スロットは、新しいぼかし半径をコンソールに出力します。

以下のコードは、スライダを使用してQGraphicsBlurEffectインスタンスのぼかし半径を動的に調整する例です。

#include <QApplication>
#include <QGraphicsEffect>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QHBoxLayout>
#include <QSlider>

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

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

    // ぼかし効果を作成
    QGraphicsBlurEffect *effect = new QGraphicsBlurEffect;

    // ぼかし効果をアイテムに適用
    QGraphicsItem *item = scene.addRect(0, 0, 100, 100);
    item->setGraphicsEffect(effect);

    // スライダを作成
    QSlider slider(Qt::Horizontal);
    slider.setRange(0, 20);
    slider.setValue(effect->blurRadius());

    // スライダとシグナルを接続
    connect(slider, &QSlider::valueChanged, effect, &QGraphicsBlurEffect::setBlurRadius);

    // レイアウトを作成
    QHBoxLayout layout;
    layout.addWidget(&view);
    layout.addWidget(&slider);

    // ウィジェットを作成
    QWidget widget;
    widget.setLayout(&layout);

    // ウィジェットを表示
    widget.show();

    return app.exec();
}

このコードでは、QSliderを使用してぼかし半径を0から20ピクセルの範囲で調整することができます。スライダの値が変更されると、valueChanged()シグナルが発行され、シグナルハンドラはQGraphicsBlurEffect::setBlurRadius()関数を呼び出してぼかし半径を設定します。

  • QGraphicsBlurEffectクラスは、CPU または GPU を使用してぼかし効果をレンダリングすることができます。レンダリングエンジンは、システム構成に応じて自動的に選択されます。
  • QGraphicsBlurEffectクラスは、パフォーマンスと品質のバランスを調整するためのヒントプロパティも提供しています。ヒントプロパティを設定することで、レンダリング速度とぼかし効果の品質を調整することができます。


#include <QApplication>
#include <QGraphicsEffect>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QHBoxLayout>
#include <QSlider>

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

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

    // ぼかし効果を作成
    QGraphicsBlurEffect *effect = new QGraphicsBlurEffect;

    // ぼかし効果をアイテムに適用
    QGraphicsItem *item = scene.addRect(0, 0, 100, 100);
    item->setGraphicsEffect(effect);

    // スライダを作成
    QSlider slider(Qt::Horizontal);
    slider.setRange(0, 20);
    slider.setValue(effect->blurRadius());

    // スライダとシグナルを接続
    connect(slider, &QSlider::valueChanged, effect, &QGraphicsBlurEffect::setBlurRadius);

    // レイアウトを作成
    QHBoxLayout layout;
    layout.addWidget(&view);
    layout.addWidget(&slider);

    // ウィジェットを作成
    QWidget widget;
    widget.setLayout(&layout);

    // ウィジェットを表示
    widget.show();

    return app.exec();
}

例2:ぼかし半径の変化をログに記録

この例では、blurRadiusChanged()シグナルを接続して、ぼかし半径の変化をコンソールにログ記録する方法を示します。

#include <QApplication>
#include <QGraphicsEffect>
#include <QGraphicsScene>
#include <QGraphicsView>

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

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

    // ぼかし効果を作成
    QGraphicsBlurEffect *effect = new QGraphicsBlurEffect;

    // ぼかし効果をアイテムに適用
    QGraphicsItem *item = scene.addRect(0, 0, 100, 100);
    item->setGraphicsEffect(effect);

    // blurRadiusChanged()シグナルを接続
    connect(effect, &QGraphicsBlurEffect::blurRadiusChanged, [](qreal radius) {
        qDebug() << "Blur radius changed to:" << radius;
    });

    // アイテムを追加
    scene.addItem(item);

    // ビューを表示
    view.show();

    return app.exec();
}

例3:ぼかし半径の変化に応じてアイテムの色を変更

この例では、blurRadiusChanged()シグナルを接続して、ぼかし半径の変化に応じてアイテムの色を変更する方法を示します。

#include <QApplication>
#include <QGraphicsEffect>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QColor>

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

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

    // ぼかし効果を作成
    QGraphicsBlurEffect *effect = new QGraphicsBlurEffect;

    // ぼかし効果をアイテムに適用
    QGraphicsItem *item = scene.addRect(0, 0, 100, 100);
    item->setGraphicsEffect(effect);

    // blurRadiusChanged()シグナルを接続
    connect(effect, &QGraphicsBlurEffect::blurRadiusChanged, [item](qreal radius) {
        QColor color = QColor(Qt::red);
        color.setAlphaF(1 - radius / 20);
        item->setBrush(color);
    });

    // アイテムを追加
    scene.addItem(item);

    // ビューを表示
    view.show();

    return app.exec();
}

これらの例は、QGraphicsBlurEffect::blurRadiusChanged()シグナルを使用して、様々な効果を実現する方法を示しています。

  • これらの例は、Qt Widgetsライブラリの基本的な機能のみを示しています。より複雑な機能を実装するには、追加のコードが必要になる場合があります


しかし、blurRadiusChanged()シグナルを使用する代わりに、以下の代替方法を検討することができます。

QProperty::valueChanged()シグナルを使用する

QGraphicsBlurEffectクラスは、blurRadiusプロパティをQPropertyとして公開しています。QProperty::valueChanged()シグナルを接続することで、blurRadiusプロパティの変更を監視することができます。

QGraphicsBlurEffect *effect = new QGraphicsBlurEffect;

connect(effect->property("blurRadius"), &QProperty::valueChanged, this, &MyClass::onBlurRadiusChanged);

タイマーを使用する

一定間隔でblurRadiusプロパティの値をポーリングすることで、ぼかし効果の強さを監視することができます。

QGraphicsBlurEffect *effect = new QGraphicsBlurEffect;

QTimer timer;
timer.setInterval(100); // 100ミリ秒ごとにポーリング
connect(&timer, &QTimer::timeout, this, [&effect]() {
    qreal radius = effect->blurRadius();
    // ぼかし半径が変更されたときの処理を記述する
    qDebug() << "Blur radius changed to:" << radius;
});
timer.start();

このコードでは、effectという名前のQGraphicsBlurEffectインスタンスが作成され、100ミリ秒ごとにblurRadiusプロパティの値をポーリングするタイマーが作成されます。タイマーのtimeout()シグナルは、onblurRadiusChanged()スロットに接続されており、ぼかし半径が変更されたときに処理を実行します。

カスタムプロパティを使用する

QGraphicsBlurEffectクラスにカスタムプロパティを追加して、ぼかし効果の強さを監視することができます。

class MyBlurEffect : public QGraphicsBlurEffect
{
public:
    MyBlurEffect(QObject *parent = nullptr) : QGraphicsBlurEffect(parent) {}

    Q_PROPERTY(qreal blurRadius READ blurRadius WRITE setBlurRadius NOTIFY blurRadiusChanged)

private:
    void setBlurRadius(qreal radius) {
        QGraphicsBlurEffect::setBlurRadius(radius);
        emit blurRadiusChanged(radius);
    }

signals:
    void blurRadiusChanged(qreal radius);
};

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

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

    // ぼかし効果を作成
    MyBlurEffect *effect = new MyBlurEffect;

    // ぼかし効果をアイテムに適用
    QGraphicsItem *item = scene.addRect(0, 0, 100, 100);
    item->setGraphicsEffect(effect);

    // blurRadiusChanged()シグナルを接続
    connect(effect, &MyBlurEffect::blurRadiusChanged, [](qreal radius) {
        qDebug() << "Blur radius changed to:" << radius;
    });

    // アイテムを追加
    scene.addItem(item);

    // ビューを表示
    view.show();

    return app.exec();
}

このコードでは、MyBlurEffectという名前のカスタムクラスが作成されます。このクラスは、blurRadiusプロパティとblurRadiusChanged()シグナルを公開します。blurRadiusプロパティを設定すると、blurRadiusChanged()シグナルが発行されます。

  • カスタムプロパティを使用する方法は、最も柔軟な方法ですが、コード量が多くなります。
  • タイマーを使用する方法は、より柔軟な方法ですが、処理負荷が高くなります。
  • QProperty::valueChanged()シグナルを使用する方法は、最もシンプルで効率的な方法です。
  • QGraphicsBlurEffectクラスは、
  • QGraphicsBlurEffectクラスは、パフォーマンスと品質のバランスを調整するためのヒントプロパティも提供しています。ヒントプロパティを設定することで、レンダリング速度とぼかし効果の品質を調整することができます。