<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
<META NAME="GENERATOR" CONTENT="GtkHTML/4.4.4">
</HEAD>
<BODY>
Hi Boudewijn Rempt,<BR>
<BR>
I think my solution will be useful for future users of Calligra's components. This is what I came up with, and this is working as expected: cells that had no background info set become transparent, cells that have background info set retain that background as non-transparent (this is my expected result). I guess opacity setting could still be used (while painting or globally) in case somebody wants cells with background info set to be semi-transparent (but for my use-case this isn't the case). I would o could have decorated painter instead of writing to the original, and then passing my decorated one to super's method, but it looks like QPainter has no copy constructor. And I think that if I just restore painter that it'll all be fine too.<BR>
<BR>
My solution:
<PRE>
<B>myfile.h</B>
class MyGraphicsItem: public QGraphicsRectItem
{
public:
explicit MyGraphicsItem( const QFileInfo& file, const QRectF& rect, QGraphicsItem *parent = 0) ;
~MyGraphicsItem();
/*reimp*/ void resize(const QSizeF& size);
void updateFile(const QFileInfo& file);
enum ScaleMode {
ScaleToItem = 0, //scale to the item's size
// AspectRatioScale, //same, keep aspect ratio
NoScale
};
private:
bool m_canvasSet;
Calligra::Sheets::Doc *m_cachedDoc;
Calligra::Sheets::CanvasItem *m_canvas;
Calligra::Sheets::Part *m_part;
MyGraphicsItem::ScaleMode m_scaleMode;
};
class TransparentCanvasItem : public Calligra::Sheets::CanvasItem
{
Q_OBJECT
public:
TransparentCanvasItem(Calligra::Sheets::Doc *doc, QGraphicsItem *parent = 0);
protected:
void paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0);
};
<B>myfile.cpp</B>
TransparentCanvasItem::TransparentCanvasItem(Doc *doc, QGraphicsItem *parent) : CanvasItem(doc, parent)
{
}
void TransparentCanvasItem::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
Qt::BGMode origBgMode = painter->backgroundMode();
QBrush brush, origBrush = painter->background();
brush = origBrush;
brush.setColor(Qt::transparent);
painter->setBackgroundMode(Qt::TransparentMode);
painter->setBackground(brush);
CanvasItem::paint(painter, option, widget);
painter->setBackground(origBrush);
painter->setBackgroundMode(origBgMode);
}
MyGraphicsItem::~CalligraItem()
{
if (m_part != 0)
delete m_part;
if (m_canvas != 0)
delete m_canvas;
if (m_cachedDoc != 0)
delete m_cachedDoc;
}
void MyGraphicsItem::resize(const QSizeF& size)
{
QRectF r = rect();
r.setSize(size);
setRect(r);
if (m_canvasSet && m_canvas != 0) {
m_canvas->resetTransform();
switch (m_scaleMode) {
case (MyGraphicsItem::ScaleToItem):
m_canvas->scale(size.width() / m_canvas->boundingRect().size().width(), size.height() / m_canvas->boundingRect().size().height());
break;
default:
m_canvas->setGeometry(r);
}
}
}
void MyGraphicsItem::updateFile(const QFileInfo& file)
{
if (!file.isFile())
return;
Part *part = new Part(0);
Doc *doc = new Doc(part);
part->setDocument(doc);
if (!doc->openUrl(KUrl(file.absoluteFilePath()))) {
delete doc;
return;
}
if (m_part != 0)
delete m_part;
if (m_canvas != 0) {
m_canvas->setParentItem(0);
m_canvas->scene()->removeItem(m_canvas);
delete m_canvas;
}
if (m_cachedDoc != 0)
delete m_cachedDoc;
m_cachedDoc = doc;
m_part = part;
m_canvas = new TransparentCanvasItem (doc);
//m_canvas = static_cast<CanvasItem*> (m_part->createCanvasItem());
m_canvas->setParentItem(this);
}
</PRE>
<BR>
Kind regards,<BR>
<BR>
Philip<BR>
<BR>
On Fri, 2012-11-30 at 14:39 +0100, Boudewijn Rempt wrote:
<BLOCKQUOTE TYPE=CITE>
<PRE>
On Fri, 30 Nov 2012, Philip Van Hoof wrote:
> Hi there,
>
> I'm trying to make the cells of a spreadsheet document which I have
> loaded using sheets/part/CanvasItem.h, which is a GraphicsItem,
> transparent.
Hm... let's see. The basic painting code is in CanvasBase.cpp, where line
477 says
painter->fillRect(paintRect, painter->background());
But where is the background on the QPainter object set... I think we need
Mek to figure that out. You could hack your version of sheets' canvasbase
here to something like
Qt::BGMode bgMode = painter->backgroundMode();
painter->setBackgroundMode(Qt::TransparentMode();
...
painter->setBackgroundMode(bgMode);
sheet->backgroundImageProperties are something different, I think -- it
must be meant to show an actual image as specified by the document, like a
watermark.
QGraphicsItem::setOpacity also isn't what you need, since that would set
the opacity for everything including the cell foregrounds.
>
> I tried the following code, but although the result is that the color of
> all cells changes, the color it uses isn't transparent but white. Or
> perhaps it is transparent but there is something white behind the cells
> anyway.
>
> QGraphicsRectItem rect;
>
> Part *part = new Part(0);
> Doc *doc = new Doc(part);
> part->setDocument(doc);
>
> CanvasItem *m_canvas = new CanvasItem (doc);
> m_canvas->setParentItem(&rect);
>
> Sheet *sheet = m_canvas->activeSheet();
>
> Calligra::Sheets::Region region = Calligra::Sheets::Region(1, 1, KS_colMax, KS_rowMax);
>
> Style style;
> QBrush brush;
> brush.setColor(Qt::transparent);
> style.setBackgroundBrush(brush);
> style.setBackgroundColor(Qt::transparent);
>
> Sheet::BackgroundImageProperties props = sheet->backgroundImageProperties();
> props.opacity = 0;
> sheet->setBackgroundImageProperties( props );
>
> CellStorage *cells = sheet->cellStorage();
> cells->setStyle(region, style);
>
> scene.addItem(&rect);
>
> Does somebody know how I can make it be truly transparent? Is there
> something being drawn behind the CellView instances that is white? Like
> a background maybe?
>
> I noticed the existence of the API sheet->setBackgroundImageProperties.
> As you can see above I tried using it, but it didn't change much.
>
> If I would have to patch Calligra to make this effect possible, where
> should I start looking?
>
> Kind regards,
>
> Philip
>
>
>
> --
>
>
> Philip Van Hoof
> Software developer
> Codeminded BVBA - <A HREF="http://codeminded.be">http://codeminded.be</A>
>
> _______________________________________________
> calligra-devel mailing list
> <A HREF="mailto:calligra-devel@kde.org">calligra-devel@kde.org</A>
> <A HREF="https://mail.kde.org/mailman/listinfo/calligra-devel">https://mail.kde.org/mailman/listinfo/calligra-devel</A>
>
_______________________________________________
calligra-devel mailing list
<A HREF="mailto:calligra-devel@kde.org">calligra-devel@kde.org</A>
<A HREF="https://mail.kde.org/mailman/listinfo/calligra-devel">https://mail.kde.org/mailman/listinfo/calligra-devel</A>
</PRE>
</BLOCKQUOTE>
<BR>
<TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="100%">
<TR>
<TD>
<PRE>
--
Philip Van Hoof
Software developer
Codeminded BVBA - <A HREF="http://codeminded.be">http://codeminded.be</A>
</PRE>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>