在寻求处理事件(如鼠标移动和点击)而不是子类化时,必须使用installEventFilter
并提供一个事件处理程序。在这样做的时候,我遇到了RTTI支持的问题,这意味着typeid().name()
总是给出QObject *
,无论触发哪个对象事件。当然,还有另外一个解决方案--- dynamic_cast
,接着是空指针检查,但是我个人并不觉得它很干净(并且希望避免多次这样的检查)。 具体而言,这里是我没有使用Visual C++启用RTTI工作的一个例子(/ GR):Qt RTTI问题
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");
*/
}
谢谢!这正是我一直在寻找的! – MadH 2009-09-11 08:16:25