为了不通过子类化来处理事件(如鼠标移动和单击),必须使用installEventFilter
并提供事件处理程序。在这样做的时候,我遇到了一个RTTI支持的问题,这意味着无论在哪个对象事件上触发,typeid().name()
都会一直提供QObject *
。当然,还有另一种解决方案-dynamic_cast
后跟空指针检查,但我个人认为它并不干净(并希望避免多次这样的检查)。更具体地说,这是一个我没有在启用RTTI (/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");
*/
}
发布于 2009-09-11 08:03:10
请改用qobject_cast
和/或obj->metaObject()->className()
。
发布于 2009-09-11 15:06:43
我会用
if (obj->metaObject() == &ColorPicker::staticMetaObject) {
...
}
如果只接受ColorPicker实例(而不是ColorPicker的子类)。
如果您也接受子类,请使用
if (qobject_cast<ColorPicker *>(obj)) {
...
}
发布于 2009-09-12 06:20:35
必须取消对指针的引用,才能使用它所指向的对象。在不取消引用指针的情况下,结果将是指针的type_info,而不是它指向的内容。
Logger::log(QString("mouse pressed on %1").arg(typeid(*obj).name()));
https://stackoverflow.com/questions/1409539
复制相似问题