A sample highlighting QGraphicsEffect

From Qt Wiki
Revision as of 19:51, 9 March 2015 by Simow (talk | contribs)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


Introduction

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

#ifndef HIGHLIGHT_H
#define HIGHLIGHT_H

#include <QtGui>

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& sourceRect; ) const;
  QColor color() const { return mColor;}
  void setColor( QColor& 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;
};

#endif // HIGHLIGHT_H

highlight.cpp

#include "highlight.h"

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

QRectF HighlightEffect::boundingRectFor( const QRectF& 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, &offset; );
 //} 

 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 asked the 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:

Highlight.png

Animated tiles example with QGraphicsPixmapItem highlighting

Hope someone finds this useful.