NSMenu cancelTracking有时不会取消跟踪

时间:2012-12-03 21:44:04

标签: nsview nsmenuitem nsmenu

我有一个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。谁能告诉我在什么情况下“cancelTracking”可能会失败?我不确定下一步该尝试什么。感谢。

1 个答案:

答案 0 :(得分:0)

为时已晚,但我也面临同样的问题,并使用碳API CancelMenuTracking(),

修复了它
CancelMenuTracking(
  MenuRef   inRootMenu,
  Boolean   inImmediate,
  UInt32    inDismissalReason)  

使用_NSGetCarbonMenu获取NSMenu的menuref。

menuRef = _NSGetCarbonMenu(myMenu);

CancelMenuTracking(menuRef,YES,kHIMenuDismissedByCancelMenuTracking);对于10.5和CancelMenuTracking(menuRef,YES,0); 10.6及以上