在不通过子类化处理事件(如鼠标移动和点击)的过程中,必须使用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");
*/
}