2009-09-11 92 views
1

在尋求處理事件(如鼠標移動和點擊)而不是子類化時,必須使用installEventFilter並提供一個事件處理程序。在這樣做的時候,我遇到了RTTI支持的問題,這意味着typeid().name()總是給出QObject *,無論觸發哪個對象事件。當然,還有另外一個解決方案--- dynamic_cast,接着是空指針檢查,但是我個人並不覺得它很乾淨(並且希望避免多次這樣的檢查)。 具體而言,這裏是我沒有使用Visual C++啓用RTTI工作的一個例子(/ GR):Qt 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"); 
*/ 
    } 

回答

3

改爲使用qobject_cast和/或obj->metaObject()->className()

+0

謝謝!這正是我一直在尋找的! – MadH 2009-09-11 08:16:25

0

通常應該對指針的反引用使用typeid - 的typeid的一個指針是在編譯時計算的,通常不會有意思。

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

這就是說,沒有你在這裏做什麼,和dynamic_cast路線太大的區別 - 在任何情況下,你將不得不在某些時候做dynamic_cast

+0

是的,我也試過這種方式。 爲什麼我更喜歡'typeid'的方式是,你可以得到.name()作爲一個字符串,然後它只是字符串比較所有我想處理的情況,而不是再次投射... – MadH 2009-09-11 08:11:24

1

我會用

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

如果只是顏色拾取 - 實例(顏色拾取,而不是子類)被接受。

如果你接受過多的子類,使用

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

指針必須解除引用,以便於使用它指向的對象。在不提取指針的情況下,結果將是指針的type_info,而不是它指向的內容。

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