<!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>