В квесте для обработки событий (например, движений мыши и щелчков) не путем подклассов, нужно использовать installEventFilter
и предоставить обработчик событий. При этом я столкнулся с проблемой поддержки RTTI, что означает, что typeid().name()
дает QObject *
все время, независимо от того, какое событие объекта было инициировано. Есть, конечно, другое решение - dynamic_cast
, за которым следует проверка нулевого указателя, но лично я не нахожу это чистым (и хотел бы избежать нескольких таких проверок).
Чтобы быть более конкретным, вот пример, который я не сделал для работы с Visual C ++ с включенным RTTI (/ 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");
*/
}