Table des matières
Documentation diverse et en vrac
Hiérarchie des classes de l'API des ElementsCollectionItem
Pour information, cette hiérarchie de classe permet d'accéder et de manipuler de manière abstraite des collections, catégories et éléments, que ceux-ci soient stockés sur un système de fichiers (classes d'implémentation File*) ou dans un projet (classes d'implémentation Xml*)
- ElementsCollectionItem [pure virtual]
- ElementsCollection [pure virtual]
- FileElementsCollection
- XmlElementsCollection
- ElementsCategory [pure virtual]
- FileElementsCategory
- XmlElementsCategory
- ElementDefinition [pure virtual]
- FileElementDefinition
- XmlElementDefinition
Contrôles effectués lors des déplacements / copies dans l'API des ElementsCollectionItem
Contrôle | ElementsCollection | ElementsCategory | ElementDefinition | |||
---|---|---|---|---|---|---|
copy | move | copy | move | copy | move | |
Handler provided ? | ||||||
Dst != src ? | ||||||
Src is writable ? | ||||||
Dst is readable ? | ||||||
Dst is writeable ? | ||||||
Dst already exists ? | ||||||
Already existing dst is writable ? | ||||||
Creation/deletion error ? |
Légende
Vérification effectuée
Vérification non effectuée car non pertinente
Exemple : on n'a pas besoin de pouvoir modifier l'item source lors d'une copie.
À noter que certains de ces contrôles sont redondés dans l'interface utilisateur, plus exactement dans le panel d'éléments. Celui-ci n'autorise que les drag'n drop à priori possibles au regard des permissions sur les items et de leur type. Ces contrôles peuvent être désactivés via les variables ENABLE_PANEL_WIDGET_DND_CHECKS
(elementspanelwidget.cpp:37) et ENABLE_PANEL_DND_CHECKS
(elementspanel.cpp:35).
Embarquement des éléments dans les projets
Lorsqu'un élément (ou une catégorie) est ajouté à la collection embarquée d'un projet, il ne peut être référencé que par rapport à un projet donné, en tant qu'élément embarqué ; on a alors le couple de données suivant :
- un chemin en embed://category1/category2/category3/element.elmt
- un pointeur QETProject * pour savoir à quel projet se rapporte embed://
Ces données sont ce que retient un objet ElementsLocation pour désigner un élément sans ambiguïté. Les projets ouverts dans l'application étant numérotés et accessibles par leur numéro (on parle de “project id”), un élément peut également être désigné par une simple chaîne de caractères de la forme project<id>+embed://category1/category2/category3/element.elmt
Passage de projectx+embed:// à embed:// :
- effectué via la méthode ElementsLocation::fromString() : elementslocation.cpp, ligne 160
Passages de embed:// à projectx+embed:// :
- lors de l'enregistrement d'un fichier (méthode Diagram::fromXml) : diagram.cpp, ligne 440
QString type_id = e.attribute("type"); ElementsLocation element_location = ElementsLocation(type_id); if (type_id.startsWith("embed://")) element_location.setProject(project_);
Lorsque le schéma est lu, si un élément se déclare de type embed://, alors l'ElementsLocation construit pour localiser l'élément en question se voit lié au projet auquel appartient ce schéma.
- lors de l'appel à la méthode toString() d'un ElementsLocation : elementslocation.cpp, ligne 143
/** @return Une chaine de caracteres representant l'emplacement */ QString ElementsLocation::toString() const { QString result; if (project_) { int project_id = QETApp::projectId(project_); if (project_id != -1) { result += "project" + QString().setNum(project_id) + "+"; } } result += path_; return(result); }
Codes d'erreur lors du chargement d'un élément
Le chargement de l'élément … a échoué avec le code d'erreur….
- 1 : Le fichier n'existe pas
- 2 : Le fichier n'a pu être ouvert
- 3 : Le fichier n'est pas un document XML
- 4 : Le document XML n'a pas une “définition” comme racine
- 5 : Les attributs de la définition ne sont pas présents et / ou valides
- 6 : La définition est vide
- 7 : L'analyse d'un élément XML décrivant une partie du dessin de l'élément a échoue
- 8 : Aucune partie du dessin n'a pu être chargée
Pourquoi -fno-ipa-sra ?
L'option -fno-ip-sra
a été ajoutée dans le qelectrotech.pro suite à la découverte de l'erreur de compilation suivante avec g++
4.6.2 sur plateforme x86_64:
- En
-O2
et-03
:release/elementspanel.o: In function `ElementsPanel::slot_doubleClick(QTreeWidgetItem*, int)': elementspanel.cpp:(.text+0x144b): undefined reference to `TitleBlockTemplateLocation GenericPanel::valueForItem<TitleBlockTemplateLocation>(QTreeWidgetItem*) const' collect2: ld returned 1 exit status
- En
-Os
:release/elementspanel.o: In function `ElementsPanel::slot_doubleClick(QTreeWidgetItem*, int)': elementspanel.cpp:(.text+0xf43): undefined reference to `QETProject* GenericPanel::valueForItem<QETProject*>(QTreeWidgetItem*) const' elementspanel.cpp:(.text+0xf5d): undefined reference to `Diagram* GenericPanel::valueForItem<Diagram*>(QTreeWidgetItem*) const' elementspanel.cpp:(.text+0xfd5): undefined reference to `TitleBlockTemplateLocation GenericPanel::valueForItem<TitleBlockTemplateLocation>(QTreeWidgetItem*) const' collect2: ld returned 1 exit status
- En
-O0
et-O1
: pas d'erreur
Pour rappel, la compilation en mode “Release” utilise -O2
tandis que celle en mode “Debug” n'incorpore pas d'optimisations spécifiques.
L'erreur elle-même se traduit ainsi : au moment de générer le binaire final, l'éditeur de liens ld constate que elementspanel.o référence une fonction / un symbole qu'il n'a pas pu retrouvé ailleurs, à savoir T GenericPanel::valueForItem<T>(QTreeWidgetItem *)
.
Une rapide analyse des objets générés confirme cette version des faits :
.o
fonctionnels compilés avec-O1
:$ objdump -x release/elementspanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation' 330 0000000000000000 *UND* 0000000000000000 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem 674 0000000000000e82 R_X86_64_PC32 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc $ objdump -x release/genericpanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation' 254 122 .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem 000001ae 0000000000000000 0000000000000000 00006b60 2**4 434 0000000000000000 l d .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem 0000000000000000 .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem 727 0000000000000000 w F .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem 00000000000001ae _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem 1004 0000000000000e7a R_X86_64_PC32 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc 1489 00000000000039df R_X86_64_PC32 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc 1932 RELOCATION RECORDS FOR [.text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem]: 2360 00000000000000cf R_X86_64_PC32 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc 2504 00000000000006dc R_X86_64_PC32 .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
.o
compilé avec-O2
: on constate quegenericpanel.o
ne contient plus qu'un laconique symbole suffixé “.isra.41
”$ objdump -x release/elementspanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation' 303 0000000000000000 *UND* 0000000000000000 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem 676 000000000000144b R_X86_64_PC32 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc $ objdump -x release/genericpanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation' 317 00000000000000f0 l F .text 00000000000001cc _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem.isra.41
Une rapide recherche sur les optimisations activées avec ''-O2'' mais pas ''-O1'' nous conduit à l'option -fipa-sra
(d'où -fno-ipa-sra
) :
-fipa-sra Perform interprocedural scalar replacement of aggregates, removal of unused parameters and replacement of parameters passed by reference by parameters passed by value. Enabled at levels -O2, -O3 and -Os.
Sans doute le compilateur a-t-il décidé que QTreeWidgetItem *
(pointeur standard, 64 bits) pouvait être directement remplacé par un QTreeWidgetItem, mais ça ne semble pas avoir fait beaucoup de biens à la liste des symboles générés… Toute explication plus détaillée sera la bienvenue
note
problème de compilation seulement sur backport wheezy arch amd64 4:4.7.2, build ok en sid 4:4.8.1 avec dans le debian/rules
CFLAGS+=-O2 CXXFLAGS=-O3''
recentfiles.o release/moc_titleblockpropertieswidget.o release/moc_titleblocktemplate.o release/moc_titleblocktemplaterenderer.o release/moc_xmlelementdefinition.o release/moc_xmlelementscategory.o release/moc_xmlelementscollection.o release/moc_diagramselection.o release/moc_dialogautonum.o release/moc_dialogwaiting.o release/moc_numparteditorw.o release/moc_selectautonumw.o release/moc_arceditor.o release/moc_elementitemeditor.o release/moc_elementprimitivedecorator.o release/moc_elementscene.o release/moc_elementview.o release/moc_ellipseeditor.o release/moc_lineeditor.o release/moc_parttext.o release/moc_parttextfield.o release/moc_polygoneditor.o release/moc_qetelementeditor.o release/moc_rectangleeditor.o release/moc_styleeditor.o release/moc_terminaleditor.o release/moc_texteditor.o release/moc_textfieldeditor.o release/moc_dimensionwidget.o release/moc_helpercell.o release/moc_integrationmovetemplateshandler.o release/moc_movetemplateshandler.o release/moc_qettemplateeditor.o release/moc_ splittedhelpercell.o release/moc_templatecellwidget.o release/moc_templatedeleter.o release/moc_templatelocationchooser.o release/moc_templatelocationsaver.o release/moc_templatelogomanager.o release/moc_templatescollection.o release/moc_templateview.o release/moc_richtexteditor_p.o release/qrc_qelectrotech.o -L/usr/lib/x86_64-linux-gnu -lQtSvg -lQtSql -lQtXml -lQtGui -lQtNetwork -lQtCore release/elementspanel.o: In function `ElementsPanel::slot_doubleClick(QTreeWidgetItem*, int)': elementspanel.cpp:(.text+0x201c): undefined reference to `TitleBlockTemplateLocation GenericPanel::valueForItem<TitleBlockTemplateLocation>(QTreeWidgetItem*) const' collect2: error: ld returned 1 exit status make[2]: *** [qelectrotech] Error 1