NSMenu cancelTracking иногда не отменяет отслеживание

У меня есть приложение QT, и я использую собственные меню в OSX. У меня есть настраиваемые элементы меню, которые я создал, прикрепив свой собственный класс, производный от NSView, к NSMenuItems, которые я хочу нарисовать специально. Все это прекрасно работает; элементы меню отображаются вправо и правильно активируют функцию меню. Однако после активации функции меню меню не исчезает - оно по-прежнему отслеживает движение мыши. (Курсор по-прежнему выделяет элементы) Я провел несколько дней в поиске ответов в поисковой системе, и я не видел подобной проблемы в другом месте. Мой класс NSView прост; Я переопределил класс "rect" для рисования, и мое событие mouseUp находится здесь:

-(void)mouseUp:(NSEvent *)theEvent
{
    NSMenuItem* item = [self enclosingMenuItem];
    if ( item != nil ){
        NSMenu *menu = [item menu];
        if ( menu != nil ){
            [menu cancelTracking];
            [NSApp sendAction:[item action] to:[item target] from:item];
        }
    }
}

Я также пробовал использовать cancelTrackingWithoutAnimation, и я пробовал вызывать cancelTracking в родительском menuBar. Может ли кто-нибудь сказать мне, при каких обстоятельствах "cancelTracking" может не сработать? Я не уверен, что попробовать дальше. Спасибо.


person John Schrag    schedule 03.12.2012    source источник


Ответы (1)


Слишком поздно, но я столкнулся с той же проблемой и исправил ее с помощью углеродного API CancelMenuTracking(),

CancelMenuTracking(
  MenuRef   inRootMenu,
  Boolean   inImmediate,
  UInt32    inDismissalReason)  

Использовал _NSGetCarbonMenu, чтобы получить меню NSMenu.

menuRef = _NSGetCarbonMenu(myMenu);

CancelMenuTracking(menuRef,YES,kHIMenuDismissedByCancelMenuTracking); для 10,5 и CancelMenuTracking(menuRef,YES,0); для 10.6 и выше

person Akhil Shrivastav    schedule 26.07.2014