2009-09-11 11 views
1

Dans une recherche pour la gestion des événements (comme les mouvements de souris et les clics) et non par sous-classe, il faut utiliser installEventFilter et fournir un gestionnaire d'événements. Ce faisant, j'ai rencontré un problème avec le support RTTI, ce qui signifie que typeid().name() donne QObject * tout le temps, quel que soit l'objet qui a été déclenché. Il y a, bien sûr, une autre solution --- dynamic_cast suivie de null-pointeur, mais personnellement, je ne le trouve pas propre (et je voudrais éviter de multiples vérifications). Pour être plus précis, voici un exemple que je ne fais pas travailler avec Visual C++ avec RTTI activé (/ GR):Qt Problème RTTI

bool 
MousePressInterface::eventFilter 
    (QObject *obj, 
    QEvent *event) 
{ 
    if (event->type() == QEvent::MouseButtonPress) 
    { 
     ColorPicker *sender; 
     sender = dynamic_cast<ColorPicker *> (obj); 

     if (sender) 
     { 
      QColor newColor = 
       QColorDialog::getColor(sender->color()); 
      if (newColor.isValid()) 
         sender->setColor(newColor); 
      Logger::log("color picker clicked"); 
      return true; 
     } 
/* TODO: cleaner way, doesn't work for some reason! 
     Logger::log(QString("mouse pressed on %1").arg(typeid(obj).name())); 
     Logger::log(QString(" checking for %1").arg(typeid(ColorPicker *).name())); 

     if (typeid(obj) == typeid(ColorPicker *)) 
      Logger::log("color picker clicked"); 
*/ 
    } 

Répondre

3

Utilisez à la place qobject_cast et/ou obj->metaObject()->className().

+0

merci! c'est exactement ce que je cherchais! – MadH

0

Vous devriez normalement utiliser typeid sur le déréférencement d'un pointeur - la typeid de un pointeur est calculé au moment de la compilation et n'est normalement pas intéressant.

if (typeid(*obj) == typeid(ColorPicker)) 
    Logger::log("color picker clicked"); 

Cela dit, il n'y a pas beaucoup de différence entre ce que vous faites ici, et la route dynamic_cast - en tout cas, vous devrez faire dynamic_cast à un moment donné.

+0

oui, je l'ai essayé de cette façon aussi. Pourquoi est-ce que je préfère la méthode 'typeid' est que vous pouvez obtenir .name() comme une chaîne et puis ce n'est que des comparaisons de chaînes pour tous les cas que je veux gérer, pas rejette ... – MadH

1

J'utiliser

if (obj->metaObject() == &ColorPicker::staticMetaObject) { 
... 
} 

si seules les instances ColorPicker (et non sous-classes de ColorPicker) est acceptés.

Si vous acceptez les sous-classes trop, utilisez

if (qobject_cast<ColorPicker *>(obj)) { 
    ... 
} 
1

Le pointeur doit être déréférencé afin que l'objet il pointe est utilisé. Sans déréférencer le pointeur, le résultat sera le type_info pour le pointeur, pas ce à quoi il pointe.

Logger::log(QString("mouse pressed on %1").arg(typeid(*obj).name()));