문제
서브 클래스가 아닌 이벤트 처리 (마우스 이동 및 클릭과 같은)를 찾기 위해 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
어느 시점에서.
제휴하지 않습니다 StackOverflow