سؤال

في السعي للتعامل مع الأحداث (مثل تحركات الماوس والنقرات) وليس عن طريق إن شاء subclasses ترث، على المرء أن استخدام installEventFilter وتوفير معالج الحدث. عند القيام بذلك، لقد واجهت مشكلة مع دعم RTTI، وهذا يعني أن typeid().name() يعطي QObject * في كل وقت، في هذه الحالة الكائن واندلعت بغض النظر. هناك، بطبيعة الحال، حل --- dynamic_cast آخر تليها الاختيار خالية المؤشر، ولكن شخصيا لا أجد على نظافتها (وأود أن تجنب العديد من تلك الشيكات). أن تكون أكثر تحديدا، وهنا مثال I لم يجعل للعمل مع 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");
*/
    }
هل كانت مفيدة؟

المحلول

qobject_cast و / أو obj->metaObject()->className() بدلا من ذلك.

نصائح أخرى

وأود أن استخدام

if (obj->metaObject() == &ColorPicker::staticMetaObject) {
 ...
}

وإذا تقبل فقط ColorPicker-الحالات (وليس فرعية من ColorPicker).

إذا كنت قبول الفئات الفرعية أيضا، استخدم

if (qobject_cast<ColorPicker *>(obj)) {
  ...
}

ويجب أن ألغى الإشارة القيمة المؤشر بحيث الكائن يشير إلى المستخدم. دون dereferencing المؤشر، فإن النتيجة تكون type_info للمؤشر، وليس ما يشير إليه.

Logger::log(QString("mouse pressed on %1").arg(typeid(*obj).name())); 

ويجب أن تستخدم عادة typeid على dereference من مؤشر - وtypeid من مؤشر يحسب في وقت الترجمة ويست مثيرة للاهتمام عادة

if ( typeid(*obj) == typeid(ColorPicker) )
  Logger::log("color picker clicked");

ومع ذلك، ليس هناك فرق كبير بين ما تقومون به هنا، والطريق dynamic_cast - في أي حال سيكون لديك لتفعل dynamic_cast في مرحلة ما

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top