Bug report #3236

Cannot determine the type of QgsComposerItem

Added by Anita Graser over 13 years ago. Updated over 13 years ago.

Status:Closed
Priority:Low
Assignee:Borys Jurgiel
Category:Python plugins
Affected QGIS version: Regression?:No
Operating System:Debian Easy fix?:No
Pull Request or Patch supplied: Resolution:fixed
Crashes QGIS or corrupts data: Copied to github as #:13296

Description

In Python console, type(item) will only return <class 'qgis.core.QgsComposerItem'>

From IRC:

[09:49] <anita1> how can i get all QgsComposerLabels from a composer? currently, i can just access all QgsComposerItems but don't know how to filter only labels from them

[10:50] <marco> hi anita1

[10:50] <marco> dynamic cast in (C++) or query the class type (in python)

[10:51] <anita1> marco: hi. but that returns only QgsComposerItem, not label

[10:51] <anita1> type(itemsr0) <class 'qgis.core.QgsComposerItem'>

[10:52] <marco> in python? Then there is probably missing a 'convertToSubclass' somewhere in the python bindings...

bug3236fix.diff Magnifier - Attempted fix at bug (1.28 KB) Nathan Woodrow, 2010-11-21 04:38 PM

History

#1 Updated by Nathan Woodrow over 13 years ago

I have added what is my attempt at fixing the bug, I gave it a run this morning and the types are returned correctly in Python however if you try and call any of the methods on the returned types you get a segfault. Eg calling .displayText() on a QgsComposerLabel causes a segmentation fault. C and C++ aren't my normal programming languages, so I may have done something wrong or missed something.

#2 Updated by Marco Hugentobler over 13 years ago

Thanks, NathanW!
The patch is applied in .
I noticed those crashes too. The strange thing is it does not happen for items added via the python bindings, only for the already existing ones.

#3 Updated by Nathan Woodrow over 13 years ago

Thanks. I'm doing some testing now, not sure how much help it will be but if you cast in python using something like:

label = selectedComposerItems()r0 /* The first label on the composer */
label.+class+ = qgis.core.qgscomposerlabel

You can call label.displayText() fine. The above will still crash sometimes even with the code I added to the SIP.

#4 Updated by Martin Dobias over 13 years ago

  • Resolution set to fixed
  • Status changed from Open to Closed

Fixed in

Also available in: Atom PDF