2009-09-11 9 views
1

서브 클래 싱이 아닌 이벤트 (마우스 이동 및 클릭과 같은)를 처리하기 위해, installEventFilter을 사용하고 이벤트 핸들러를 제공해야합니다. 그렇게하는 동안 RTTI 지원에 문제가 발생하여 어떤 객체 이벤트가 트리거되었는지에 상관없이 typeid().name()은 항상 QObject *이됩니다. 물론, 또 다른 해결책이 있습니다 --- dynamic_cast 다음에 null 포인터 검사가 있지만 개인적으로 나는 그것을 깨끗하게 찾지 못합니다 (여러 검사를 피하고 싶습니다). - typeid의 당신은 일반적으로 포인터의 역 참조에 typeid를 사용해야합니다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()을 사용하십시오. 단지 ColorPicker를-인스턴스 (ColorPicker의의가 아닌 서브 클래스)가 인정되는 경우

+0

thanks! 그게 내가 찾고 있던거야! – MadH

0

: 더 구체적으로, 여기에 내가 RTTI가 활성화 된 비주얼 C++와 함께 작동하도록하지 않았다 예 (/ GR)입니다 포인터는 컴파일 타임에 계산되며 일반적으로 흥미롭지 않습니다. 말했다

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

, 당신이 여기서 뭘하고 dynamic_cast 경로 무슨 사이에 큰 차이가없는 - 어떤 경우에 당신이 어떤 점에서 dynamic_cast을해야 할 것입니다.

+0

네, 저도 그렇게 해 보았습니다. 왜 나는'typeid' 방법을 선호 하는가 .name()을 문자열로 가져온 다음 다시 처리하지 않으려는 모든 경우에 대한 문자열 비교 일뿐입니다 ... – MadH

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()));