A sample highlighting QGraphicsEffect

From Qt Wiki
Revision as of 09:31, 24 February 2015 by Maintenance script (talk | contribs)
Jump to: navigation, search

English
| فارسی

While learning Qt, I wrote this sample highlighting graphics effect to be used with rectangular QGraphicsPixmapItem.
..and I use this post just to learn how to publish a wiki page here too.. ;-)

highlight.h

//*'

  1. ifndef HIGHLIGHT_H
    #define HIGHLIGHT_H
  1. include <QtGui&gt;

//*'

class HighlightEffect : public QGraphicsEffect
{
Q_OBJECT
Q_PROPERTY( QColor color READ color WRITE setColor )
Q_PROPERTY( QPointF offset READ offset WRITE setOffset )
public:
HighlightEffect( qreal offset = 1.5 );
virtual QRectF boundingRectFor( const QRectF &amp;sourceRect; ) const;
QColor color() const { return mColor;}
void setColor( QColor &amp;color; ) { mColor = color;}
QPointF offset() const { return mOffset;}
void setOffset( QPointF offset ) { mOffset = offset;}

protected:
virtual void draw( QPainter *painter ); // , QGraphicsEffectSource source );
private:
QColor mColor;
QPointF mOffset;
};

//

  1. endif // HIGHLIGHT_H

//*'

highlight.cpp

//*'

  1. include "highlight.h&quot;

//*'

HighlightEffect::HighlightEffect( qreal offset ) : QGraphicsEffect(),
mColor( 255, 255, 0, 128 ), // yellow, semi-transparent
mOffset( offset, offset )
{
}

QRectF HighlightEffect::boundingRectFor( const QRectF &amp;sourceRect; ) const
{
return sourceRect.adjusted( -mOffset.x(), mOffset.y(), mOffset.x(), mOffset.y() );
}
void HighlightEffect::draw( QPainter painter )
{
QPoint offset;
QPixmap pixmap;

// if ( sourceIsPixmap() ) // doesn't seems to work, return false
{
// No point in drawing in device coordinates (pixmap will be scaled anyways).
pixmap = sourcePixmap( Qt::LogicalCoordinates, &amp;offset; ); //, mode );
}
QRectF bound = boundingRectFor( pixmap.rect() );
painter->save();
painter->setPen( Qt::NoPen );
painter->setBrush( mColor );
QPointF p( offset.x()-mOffset.x(), offset.y()mOffset.y() );
bound.moveTopLeft( p );
painter
>drawRoundedRect( bound, 5, 5, Qt::RelativeSize );
painter->drawPixmap( offset, pixmap );
painter->restore();
}
//

The strange thing in the implementation is that the sourceIsPixmap() function returns always false, even if the documentation states that "Returns true if the source effectively is a pixmap, e.g., a QGraphicsPixmapItem."
I ask to Qt gurus what can be going on here…
The default color is pale yellow, semi-transparent and the border size is set to 1.5. To add the effect simply add this:

Pixmap *item = new Pixmap(kineticPix);
.
.
HighlightEffect *effect = new HighlightEffect();
item
>setGraphicsEffect( effect );

Here the modified animated tiles example with the effect turned on:

Animated tiles example with QGraphicsPixmapItem highlighting

Hope someone found this useful.