1

我有一个 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”可能会失败?我不确定下一步该尝试什么。谢谢。

4

1 回答 1

0

为时已晚,但我也遇到了同样的问题,并通过使用 carbon 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及以上

于 2014-07-26T10:13:05.727 回答