Pregunta

En una búsqueda de manejo de eventos (como movimientos y clics del mouse) no por subclasificación, uno tiene que usar installEventFilter y proporcionar un controlador de eventos. Al hacerlo, he encontrado un problema con el soporte de RTTI, lo que significa que typeid (). Name () le da a QObject * todo el tiempo, sin importar en qué evento del objeto fue activado Existe, por supuesto, otra solución --- dynamic_cast seguida de una comprobación de puntero nulo, pero personalmente no la encuentro limpia (y me gustaría evitar varias de estas comprobaciones). Para ser más específico, aquí hay un ejemplo que no hice para trabajar con Visual C ++ con RTTI habilitado (/ GR):

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");
*/
    }
¿Fue útil?

Solución

Utilice qobject_cast y / o obj- > metaObject () - > className () en su lugar.

Otros consejos

Yo usaría

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

si solo se aceptan las instancias de ColorPicker (y no las subclases de ColorPicker).

Si también está aceptando subclases, use

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

El puntero se debe anular para que se utilice el objeto al que apunta. Sin eliminar la referencia al puntero, el resultado será el type_info para el puntero, no a lo que apunta.

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

Normalmente debe usar typeid en la desreferencia de un puntero: el typeid de un puntero se calcula en el momento de la compilación y normalmente no es interesante.

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

Dicho esto, no hay mucha diferencia entre lo que estás haciendo aquí y la ruta dynamic_cast . En cualquier caso, tendrás que hacer dynamic_cast en algún momento. .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top