gpt4 book ai didi

c++ - Qt RTTI的麻烦

转载 作者:搜寻专家 更新时间:2023-10-31 00:23:46 29 4
gpt4 key购买 nike

为了不通过子类处理事件(如鼠标移动和点击),必须使用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com