サブクラス化によってではなく、イベント (マウスの移動やクリックなど) を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");
*/
}