読者です 読者をやめる 読者になる 読者になる
月 の 上

Qtでデスクトップマスコット的なのを実現する方法

Qt

Qtの情報少なすぎワロタ……

どうやんの?

透過PNGを表示するんですねー
QGraphicsItem, QGraphicsScene, QGraphicsViewをつかいます

ただ透過しただけだと影が付かないので、QGraphicsEffectで手動で影をつけてやります

QGraphicsItemにクリックイベントつけてやったりしたらデスクトップマスコットみたいになるんじゃないかなー、とか

コード書く

#include <QtGui>

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

    QGraphicsScene scene;
    QGraphicsView view( &scene );
    QGraphicsPixmapItem pm( QPixmap( "c:\\afx.png" ) );


    QGraphicsDropShadowEffect* effect	= new QGraphicsDropShadowEffect();
    effect->setColor( QColor(0,0,0) );
    effect->setOffset( 5, 5 );
    effect->setBlurRadius( 20 );
    pm.setGraphicsEffect(effect);

    
    scene.addItem( &pm );

    view.setStyleSheet("background:transparent; border: none;");
    view.setAttribute(Qt::WA_TranslucentBackground);
    view.setWindowFlags( Qt::FramelessWindowHint );
    view.resize(500,500);
    view.show();
    
    return a.exec();
}

QGraphicsDropShadowEffectを適用できるクラスが何なのかわかんなくて苦労したり

結果


ちょいな

複数の画像にエフェクトを適用

QGraphicsEffectを画像の数だけ生成する必要がある

#include <QtGui>

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

    QGraphicsScene scene;
    QGraphicsView view( &scene );
    QGraphicsPixmapItem pm1(
        QPixmap( "c:\\afx.png" ).scaled( 200, 200, Qt::IgnoreAspectRatio, Qt::SmoothTransformation )
        );
    QGraphicsPixmapItem pm2(
        QPixmap( "c:\\che.png" ).scaled( 250, 300, Qt::IgnoreAspectRatio, Qt::SmoothTransformation )
        );


    QGraphicsDropShadowEffect* shadow1	= new QGraphicsDropShadowEffect();
    shadow1->setColor( QColor(0,0,0) );
    shadow1->setOffset( 5, 5 );
    shadow1->setBlurRadius( 15 );

    QGraphicsDropShadowEffect* shadow2	= new QGraphicsDropShadowEffect();
    shadow2->setColor( QColor(128,0,0) );
    shadow2->setOffset( 5, 5 );
    shadow2->setBlurRadius( 15 );

    pm1.setGraphicsEffect(shadow1);
    pm2.setGraphicsEffect(shadow2);

    
    pm1.setPos(0,50);
    pm2.setPos(250,0);

    scene.addItem( &pm1 );
    scene.addItem( &pm2 );

    view.setStyleSheet("background:transparent; border: none;");
    view.setAttribute(Qt::WA_TranslucentBackground);
    view.setWindowFlags( Qt::FramelessWindowHint );
    view.resize(640,320);    
    view.show();
    
    return a.exec();
}


ついでに影の色も変えてみた

複数のエフェクトを画像に適用ってのはできないみたいね
どうしてもやるときはQGraphicsViewごとrenderしてもっかい貼り直し、ってする必要がある
複数の画像に複数のエフェクトってなるとQGraphicsViewも複数必要になるのかな?