2013-05-09 1 views
0

J'essaie de transformer un QTableWidgetItem en classe enfant. J'ai une hiérarchie de classes comme ceci:Comment transformer QTableWidgetItem en classe enfant personnalisée

(Parent -> Child) 
QTableWidgetItem -> SortableTableWidgetItem -> EnhancedTableWidgetItem 

ou

class SortableTableWidgetItem : public QTableWidgetItem

class EnhancedTableWidgetItem : public SortableTableWidgetItem

Pour la plupart, j'utilise les éléments comme QTableWidgetItem s parce que le code est déjà écrit et shouldn ne change pas. Cependant, dans certains cas, j'ai besoin d'accéder aux données dans le EnhancedTableWidgetItem après avoir donné un pointeur à QTableWidgetItem (que je sais est un EnhancedTableWidgetItem parce que j'ai construit l'objet et l'ai passé au code appelant initialement). J'ai essayé de lancer comme ceci:

QTableWidgetItem item = getItem(); 

// This fails to compile saying "error: no matching function for call to ‘qobject_cast(QTableWidgetItem*)’" 
EnhancedTableWidgetItem *eItem = qobject_cast<EnhancedTableWidgetItem*>(item); 

// This also fails to compile and says: "error: invalid conversion from ‘QTableWidgetItem*’ to ‘EnhancedTableWidgetItem*’" 
EnhancedTableWidgetItem *eItem = dynamic_cast<EnhancedTableWidgetItem*>(item); 

Je viens du monde de Java où ceci est parfaitement légal et fait tout le temps. Pourquoi ne puis-je pas convertir le pointeur de classe de base en pointeur de classe enfant? Comment puis-je accomplir cela?

Répondre

1

qobject_cast est seulement pour une classe qui hérite de QObject. Si item est vraiment de votre type personnalisé puis utilisez cast dynamique

EnhancedTableWidgetItem* eItem = dynamic_cast<EnhancedTableWidgetItem*>(item); 

de Nevermind. vous lancez un objet sur un pointeur. Cela ne fonctionnera pas. Pourtant, ce que j'ai déjà dit s'applique toujours

+0

Ouais désolé, j'ai raté le pointeur dans le message initial. C'est dans le code cependant. Merci pour l'explication! –

+1

il s'agit d'un comportement non défini pour transformer la superclasse en sous-classe si vous n'utilisez pas de pointeurs – UmNyobe

1

Vous êtes mélangé avec des pointeurs et des valeurs. Je pense que votre getItem() ne devrait pas retourner la valeur (copie), il doit retourner un pointeur, ont donc ceci:

QTableWidgetItem *item = getItem(); // getItem() returns pointer 
auto eItem = dynamic_cast<EnhancedTableWidgetItem*>(item); 

(En utilisant auto de C++ 11 ci-dessus, ce qui est beaucoup plus agréable, mais si vous êtes coincé avec le compilateur plus ancien, utilisez à la place EnhancedTableWidgetItem*.)

1

QTableWidgetItem n'est pas dérivé de QObject, donc il ne peut pas utiliser qobject_cast <>.

Questions connexes