문제

서브 클래스가 아닌 이벤트 처리 (마우스 이동 및 클릭과 같은)를 찾기 위해 installEventFilter 이벤트 핸들러를 제공합니다. 그렇게하는 동안 RTTI 지원에 문제가 발생했습니다. typeid().name() 주어진 QObject * 어떤 객체 이벤트가 트리거되었는지 항상 항상. 물론 또 다른 해결책이 있습니다.dynamic_cast Null-Pointer Check가 뒤따를 수 있지만 개인적으로는 깨끗하지 않습니다 (그리고 여러 수표를 피하고 싶습니다). 보다 구체적으로, 여기에 RTTI enabled (/gr)를 사용하여 Visual C ++로 작업하지 않은 예입니다.

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");
*/
    }
도움이 되었습니까?

해결책

사용 qobject_cast 및/또는 obj->metaObject()->className() 대신에.

다른 팁

나는 사용할 것이다

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

ColorPicker-Instances (및 ColorPicker의 서브 클래스가 아닌) 만 허용되는 경우.

서브 클래스도 수락하는 경우 사용하십시오

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

포인터는 가리키는 객체가 사용되도록 비대화되어야합니다. 포인터를 디포 링하지 않으면 결과는 포인터의 유형이 아니라 포인터의 유형이됩니다.

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

일반적으로 사용해야합니다 typeid 포인터의 불일치 - the typeid 포인터의는 컴파일 시간에 계산되며 일반적으로 흥미롭지 않습니다.

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

즉, 여기에서하고있는 일과 dynamic_cast 루트 - 어쨌든해야 할 경우 dynamic_cast 어느 시점에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top