Bug report #3236

Cannot determine the type of QgsComposerItem

Added by Anita Graser almost 9 years ago. Updated over 8 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 almost 9 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 almost 9 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 almost 9 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 8 years ago

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

Fixed in

Also available in: Atom PDF