Difference between revisions of "A sample highlighting QGraphicsEffect"
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.