在尋求處理事件(如鼠標移動和點擊)而不是子類化時,必須使用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