A sample highlighting QGraphicsEffect: Difference between revisions
No edit summary |
Waldyrious (talk | contribs) (convert {{doclinkanchor}} to the improved {{doclink}}) |
||
(2 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
[[Category:HowTo]] | [[Category:HowTo]] | ||
__NOEDITSECTION__ | |||
__NOTOC__ | |||
== Introduction == | |||
While learning Qt, I wrote this sample highlighting graphics effect to be used with rectangular QGraphicsPixmapItem. | While learning Qt, I wrote this sample highlighting graphics effect to be used with rectangular {{DocLink|QGraphicsPixmapItem}}... and I use this post just to learn how to publish a wiki page here too.. ;-) | ||
..and I use this post just to learn how to publish a wiki page here too.. ;-) | |||
highlight.h | '''highlight.h''' | ||
<code> | |||
#ifndef HIGHLIGHT_H | #ifndef HIGHLIGHT_H | ||
#define HIGHLIGHT_H | #define HIGHLIGHT_H | ||
#include <QtGui> | #include <QtGui> | ||
class HighlightEffect : public QGraphicsEffect | class HighlightEffect : public QGraphicsEffect | ||
Line 24: | Line 19: | ||
Q_PROPERTY( QColor color READ color WRITE setColor ) | Q_PROPERTY( QColor color READ color WRITE setColor ) | ||
Q_PROPERTY( QPointF offset READ offset WRITE setOffset ) | Q_PROPERTY( QPointF offset READ offset WRITE setOffset ) | ||
protected: | public: | ||
HighlightEffect( qreal offset = 1.5 ); | |||
private: | 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 | #endif // HIGHLIGHT_H | ||
</code> | </code> | ||
highlight.cpp | '''highlight.cpp''' | ||
<code> | |||
#include "highlight.h" | #include "highlight.h" | ||
HighlightEffect::HighlightEffect( qreal offset ) : | |||
QGraphicsEffect(), | |||
HighlightEffect::HighlightEffect( qreal offset ) : QGraphicsEffect(), | |||
mColor( 255, 255, 0, 128 ), // yellow, semi-transparent | mColor( 255, 255, 0, 128 ), // yellow, semi-transparent | ||
mOffset( offset, offset ) | mOffset( offset, offset ) {} | ||
{ | |||
} | |||
QRectF HighlightEffect::boundingRectFor( const QRectF & | QRectF HighlightEffect::boundingRectFor( const QRectF& sourceRect; ) const | ||
{ | { | ||
return sourceRect.adjusted( -mOffset.x(), -mOffset.y(), mOffset.x(), mOffset.y() ); | return sourceRect.adjusted( -mOffset.x(), -mOffset.y(), mOffset.x(), mOffset.y() ); | ||
} | } | ||
void HighlightEffect::draw( QPainter | void HighlightEffect::draw( QPainter* painter ) | ||
{ | { | ||
QPoint offset; | QPoint offset; | ||
QPixmap pixmap; | QPixmap pixmap; | ||
// if ( sourceIsPixmap() ) // doesn't seems to work, return false | // if ( sourceIsPixmap() ) // doesn't seems to work, return false | ||
{ | // { | ||
// No point in drawing in device coordinates (pixmap will be scaled anyways). | // No point in drawing in device coordinates (pixmap will be scaled anyways). | ||
pixmap = sourcePixmap( Qt::LogicalCoordinates, & | pixmap = sourcePixmap( Qt::LogicalCoordinates, &offset; ); | ||
//} | |||
QRectF bound = boundingRectFor( pixmap.rect() ); | QRectF bound = boundingRectFor( pixmap.rect() ); | ||
Line 87: | Line 76: | ||
painter->restore(); | painter->restore(); | ||
} | } | ||
</code> | </code> | ||
The strange thing in the implementation is that the sourceIsPixmap | The strange thing in the implementation is that the {{DocLink|QGraphicsEffect|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 | 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: | The default color is pale yellow, semi-transparent and the border size is set to 1.5. To add the effect simply add this: | ||
Line 107: | Line 94: | ||
Here the modified animated tiles example with the effect turned on: | Here the modified animated tiles example with the effect turned on: | ||
[[ | [[File:Highlight.png]] | ||
Animated tiles example with QGraphicsPixmapItem highlighting | |||
Hope someone | Hope someone finds this useful. |
Latest revision as of 12:38, 21 October 2015
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:
Animated tiles example with QGraphicsPixmapItem highlighting
Hope someone finds this useful.