Difference between revisions of "A sample highlighting QGraphicsEffect"

From Qt Wiki
Jump to: navigation, search
Line 1: Line 1:
'''English'''<br />| [[:A_sample_highlighting_QGraphicsEffect_Persian|فارسی]]
+
'''English'''
 +
| [[:A_sample_highlighting_QGraphicsEffect_Persian|فارسی]]
  
[[Category:Learning]]<br />[[Category:HowTo]]
+
[[Category:Learning]]
 +
[[Category:HowTo]]
  
While learning Qt, I wrote this sample highlighting graphics effect to be used with rectangular QGraphicsPixmapItem.<br />..and I use this post just to learn how to publish a wiki page here too.. ;-)
+
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
 
highlight.h
Line 9: Line 12:
 
<code>//*''''''
 
<code>//*''''''
  
#ifndef HIGHLIGHT_H<br />#define HIGHLIGHT_H
+
#ifndef HIGHLIGHT_H
 +
#define HIGHLIGHT_H
  
#include &lt;QtGui&amp;gt;
+
#include <QtGui>
  
 
//*''''''
 
//*''''''
  
class HighlightEffect : public QGraphicsEffect<br />{<br /> Q_OBJECT<br /> Q_PROPERTY( QColor color READ color WRITE setColor )<br /> Q_PROPERTY( QPointF offset READ offset WRITE setOffset )<br />public:<br /> HighlightEffect( qreal offset = 1.5 );<br /> virtual QRectF boundingRectFor( const QRectF &amp;amp;sourceRect; ) const;<br /> QColor color() const { return mColor;}<br /> void setColor( QColor &amp;amp;color; ) { mColor = color;}<br /> QPointF offset() const { return mOffset;}<br /> void setOffset( QPointF offset ) { mOffset = offset;}
+
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;amp;sourceRect; ) const;
 +
QColor color() const { return mColor;}
 +
void setColor( QColor &amp;amp;color; ) { mColor = color;}
 +
QPointF offset() const { return mOffset;}
 +
void setOffset( QPointF offset ) { mOffset = offset;}
  
protected:<br /> virtual void draw( QPainter *painter ); // , QGraphicsEffectSource '''source );<br />private:<br /> QColor mColor;<br /> QPointF mOffset;<br />};
+
protected:
<br />//'''
+
virtual void draw( QPainter *painter ); // , QGraphicsEffectSource '''source );
 +
private:
 +
QColor mColor;
 +
QPointF mOffset;
 +
};
 +
 
 +
//'''
  
 
#endif // HIGHLIGHT_H
 
#endif // HIGHLIGHT_H
  
//*''''''<br /></code>
+
//*''''''
 +
</code>
  
 
highlight.cpp
 
highlight.cpp
Line 28: Line 50:
 
<code>//*''''''
 
<code>//*''''''
  
#include &quot;highlight.h&amp;quot;
+
#include "highlight.h"
  
 
//*''''''
 
//*''''''
  
HighlightEffect::HighlightEffect( qreal offset ) : QGraphicsEffect(),<br /> mColor( 255, 255, 0, 128 ), // yellow, semi-transparent<br /> mOffset( offset, offset )<br />{<br />}
+
HighlightEffect::HighlightEffect( qreal offset ) : QGraphicsEffect(),
 +
mColor( 255, 255, 0, 128 ), // yellow, semi-transparent
 +
mOffset( offset, offset )
 +
{
 +
}
 +
 
 +
QRectF HighlightEffect::boundingRectFor( const QRectF &amp;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;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();
 +
}
 +
 
 +
//'''
 +
</code>
 +
 
 +
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:
 +
 
 +
<code>
 +
Pixmap *item = new Pixmap(kineticPix);
 +
.
 +
.
 +
HighlightEffect *effect = new HighlightEffect();
  
QRectF HighlightEffect::boundingRectFor( const QRectF &amp;amp;sourceRect; ) const<br />{<br /> return sourceRect.adjusted( -mOffset.x(), <s>mOffset.y(), mOffset.x(), mOffset.y() );<br />}
+
item->setGraphicsEffect( effect );
<br />void HighlightEffect::draw( QPainter '''painter )<br />{<br /> QPoint offset;<br /> QPixmap pixmap;
+
</code>
<br />// if ( sourceIsPixmap() ) // doesn't seems to work, return false<br /> {<br /> // No point in drawing in device coordinates (pixmap will be scaled anyways).<br /> pixmap = sourcePixmap( Qt::LogicalCoordinates, &amp;amp;offset; ); //, mode );<br /> }
 
<br /> QRectF bound = boundingRectFor( pixmap.rect() );
 
<br /> painter-&gt;save();<br /> painter-&gt;setPen( Qt::NoPen );<br /> painter-&gt;setBrush( mColor );<br /> QPointF p( offset.x()-mOffset.x(), offset.y()<s>mOffset.y() );<br /> bound.moveTopLeft( p );<br /> painter</s>&gt;drawRoundedRect( bound, 5, 5, Qt::RelativeSize );<br /> painter-&gt;drawPixmap( offset, pixmap );<br /> painter-&gt;restore();<br />}
 
<br />//'''<br /></code>
 
<br />The strange thing in the implementation is that the sourceIsPixmap() function returns always false, even if the documentation states that &quot;Returns true if the source effectively is a pixmap, e.g., a QGraphicsPixmapItem.&quot;<br />I ask to Qt gurus what can be going on here…
 
<br />The default color is pale yellow, semi-transparent and the border size is set to 1.5. To add the effect simply add this:
 
<br /><code><br /> Pixmap *item = new Pixmap(kineticPix);<br /> .<br /> .<br /> HighlightEffect *effect = new HighlightEffect();
 
<br /> item</s>&gt;setGraphicsEffect( effect );<br /></code>
 
  
 
Here the modified animated tiles example with the effect turned on:
 
Here the modified animated tiles example with the effect turned on:

Revision as of 09:52, 25 February 2015

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
  2. define HIGHLIGHT_H
  1. 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 &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"

//*'

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.