Re: [Qgis-developer] Add multiple frames to a composer attribute table using PyQGIS

2015-11-03 Thread James Stott
Hi Nyall,

Thanks very much for the advice. It is working now.

That was an excellent tip about checking the unit tests.

James

On Sun, 1 Nov 2015 at 10:23 Nyall Dawson  wrote:

> On 1 November 2015 at 20:09, James Stott  wrote:
> > I have an attribute table that is around two hundred rows of data (but
> only
> > two columns wide). I would like to add an attribute table to a composer
> with
> > this data, and to do this I need to add multiple frames so I can add the
> > whole attribute table to one page. Doing this manually in the composer I
> > just add 5 frames side by side to one composer page, and I manage to get
> all
> > my data on one page.
> >
> > I cannot figure out how to add an attribute table with multiple frames
> to a
> > composer using PyQGIS. I am problably missing something really obvious,
> but
> > I am stuck here.
> >
> > When I try to define a QgsComposerFrame, I am told that I must specify
> the
> > QgsComposerMultiFrame it belongs to:
> >
> > QgsComposerFrame (QgsComposition *c, QgsComposerMultiFrame *mf, qreal x,
> > qreal y, qreal width, qreal height)
> >
> > How do I create the QgsComposerMultiFrame. It is an abstract class, I am
> > told that it is an abstract class and cannot be instantiated. If I try
> >
> > multiFrame = QgsComposerMultiFrame(myCompositionTable, False)
> >
> > I get the following error when I run my code.
> >
> > qgis._core.QgsComposerMultiFrame represents a C++ abstract class and
> cannot
> > be instantiated
>
> You create a QgsComposerAttributeTableV2 instead, which derives from
> QgsComposerMultiFrame. Here's some c++ code which does this, which
> should be pretty straightforward to translate to Python:
>
>
> mComposerAttributeTable = new QgsComposerAttributeTableV2(
> mComposition, false );
> mComposition->addMultiFrame( mComposerAttributeTable );
>
> mFrame1 = new QgsComposerFrame( mComposition, mComposerAttributeTable,
> 5, 5, 100, 30 );
> mFrame2 = new QgsComposerFrame( mComposition, mComposerAttributeTable,
> 5, 40, 100, 30 );
>
> mComposerAttributeTable->addFrame( mFrame1 );
> mComposerAttributeTable->addFrame( mFrame2 );
>
> mComposition->addComposerTableFrame( mComposerAttributeTable, mFrame1 );
> mComposition->addComposerTableFrame( mComposerAttributeTable, mFrame2 );
>
> mComposerAttributeTable->setVectorLayer( mVectorLayer );
> mComposerAttributeTable->setDisplayOnlyVisibleFeatures( false );
> mComposerAttributeTable->setMaximumNumberOfFeatures( 10 );
> mComposerAttributeTable->setContentFont(
> QgsFontUtils::getStandardTestFont() );
> mComposerAttributeTable->setHeaderFont(
> QgsFontUtils::getStandardTestFont() );
> mComposerAttributeTable->setBackgroundColor( Qt::yellow );
>
> When in doubt for something like this and you can't find any examples
> online, a good last resort to check is in the QGIS unit tests:
> https://github.com/qgis/QGIS/tree/master/tests/src
> (or in this case
>
> https://github.com/qgis/QGIS/blob/master/tests/src/core/testqgscomposertablev2.cpp
> )
>
> They are filled with minimal test cases such as this which are useful
> for seeing how various classes are intended to be used.
>
> Nyall
>
>
>
>
> >
> > I cant find any documentation or examples on how to do this. So if
> someone
> > could shed some light on this it would be most appreciated. I am happy to
> > write up a bit of documentation once I have managed to do this.
> >
> > Many thanks,
> >
> > James
> >
> > ___
> > Qgis-developer mailing list
> > Qgis-developer@lists.osgeo.org
> > http://lists.osgeo.org/mailman/listinfo/qgis-developer
>
___
Qgis-developer mailing list
Qgis-developer@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-developer

Re: [Qgis-developer] Add multiple frames to a composer attribute table using PyQGIS

2015-11-01 Thread Nyall Dawson
On 1 November 2015 at 20:09, James Stott  wrote:
> I have an attribute table that is around two hundred rows of data (but only
> two columns wide). I would like to add an attribute table to a composer with
> this data, and to do this I need to add multiple frames so I can add the
> whole attribute table to one page. Doing this manually in the composer I
> just add 5 frames side by side to one composer page, and I manage to get all
> my data on one page.
>
> I cannot figure out how to add an attribute table with multiple frames to a
> composer using PyQGIS. I am problably missing something really obvious, but
> I am stuck here.
>
> When I try to define a QgsComposerFrame, I am told that I must specify the
> QgsComposerMultiFrame it belongs to:
>
> QgsComposerFrame (QgsComposition *c, QgsComposerMultiFrame *mf, qreal x,
> qreal y, qreal width, qreal height)
>
> How do I create the QgsComposerMultiFrame. It is an abstract class, I am
> told that it is an abstract class and cannot be instantiated. If I try
>
> multiFrame = QgsComposerMultiFrame(myCompositionTable, False)
>
> I get the following error when I run my code.
>
> qgis._core.QgsComposerMultiFrame represents a C++ abstract class and cannot
> be instantiated

You create a QgsComposerAttributeTableV2 instead, which derives from
QgsComposerMultiFrame. Here's some c++ code which does this, which
should be pretty straightforward to translate to Python:


mComposerAttributeTable = new QgsComposerAttributeTableV2(
mComposition, false );
mComposition->addMultiFrame( mComposerAttributeTable );

mFrame1 = new QgsComposerFrame( mComposition, mComposerAttributeTable,
5, 5, 100, 30 );
mFrame2 = new QgsComposerFrame( mComposition, mComposerAttributeTable,
5, 40, 100, 30 );

mComposerAttributeTable->addFrame( mFrame1 );
mComposerAttributeTable->addFrame( mFrame2 );

mComposition->addComposerTableFrame( mComposerAttributeTable, mFrame1 );
mComposition->addComposerTableFrame( mComposerAttributeTable, mFrame2 );

mComposerAttributeTable->setVectorLayer( mVectorLayer );
mComposerAttributeTable->setDisplayOnlyVisibleFeatures( false );
mComposerAttributeTable->setMaximumNumberOfFeatures( 10 );
mComposerAttributeTable->setContentFont( QgsFontUtils::getStandardTestFont() );
mComposerAttributeTable->setHeaderFont( QgsFontUtils::getStandardTestFont() );
mComposerAttributeTable->setBackgroundColor( Qt::yellow );

When in doubt for something like this and you can't find any examples
online, a good last resort to check is in the QGIS unit tests:
https://github.com/qgis/QGIS/tree/master/tests/src
(or in this case
https://github.com/qgis/QGIS/blob/master/tests/src/core/testqgscomposertablev2.cpp)

They are filled with minimal test cases such as this which are useful
for seeing how various classes are intended to be used.

Nyall




>
> I cant find any documentation or examples on how to do this. So if someone
> could shed some light on this it would be most appreciated. I am happy to
> write up a bit of documentation once I have managed to do this.
>
> Many thanks,
>
> James
>
> ___
> Qgis-developer mailing list
> Qgis-developer@lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/qgis-developer
___
Qgis-developer mailing list
Qgis-developer@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-developer

[Qgis-developer] Add multiple frames to a composer attribute table using PyQGIS

2015-11-01 Thread James Stott
I have an attribute table that is around two hundred rows of data (but only
two columns wide). I would like to add an attribute table to a composer
with this data, and to do this I need to add multiple frames so I can add
the whole attribute table to one page. Doing this manually in the composer
I just add 5 frames side by side to one composer page, and I manage to get
all my data on one page.

I cannot figure out how to add an attribute table with multiple frames to a
composer using PyQGIS. I am problably missing something really obvious, but
I am stuck here.

When I try to define a QgsComposerFrame, I am told that I must specify the
QgsComposerMultiFrame it belongs to:

QgsComposerFrame

 (QgsComposition  *c,
QgsComposerMultiFrame
 *mf,
qreal x , qreal y
, qreal width, qreal height)

How do I create the QgsComposerMultiFrame. It is an abstract class, I am
told that it is an abstract class and cannot be instantiated. If I try

multiFrame = QgsComposerMultiFrame(myCompositionTable, False)

I get the following error when I run my code.

qgis._core.QgsComposerMultiFrame represents a C++ abstract class and cannot
be instantiated

I cant find any documentation or examples on how to do this. So if someone
could shed some light on this it would be most appreciated. I am happy to
write up a bit of documentation once I have managed to do this.

Many thanks,

James
___
Qgis-developer mailing list
Qgis-developer@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-developer