为了不通过子类化来处理事件(例如鼠标移动和单击),必须使用 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");
*/
}
最佳答案
使用qobject_cast
和/或 obj->metaObject()->className()
代替。
关于c++ - Qt RTTI 麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1409539/