os X上的Cocoa WebView不触发鼠标悬停事件,而不必点击并按住鼠标左键



我是Mac开发的新手,我试图使用QMacCocoaViewContainer来合并使用Cocoa WebView。我有视图加载我的html文件与多个css和javascript文件,但我的问题是,鼠标悬停事件不触发当用户将鼠标移动到视图。

我已经确定,如果用户单击并按住鼠标左键并移动鼠标,则触发事件。我猜这是一个焦点问题,但没有成功地解决这个问题。如果有任何帮助就太好了

我发现了一个类似的问题:当嵌入cocoa webview到QT应用程序时有一个答案草图。我可以肯定答案是可行的,但只是暗示而已。以下是我所做的:

  1. 在你的应用程序中重新实现QApplication::macEventFilter()
  2. 禁用外星小部件为您的应用程序或仅为QMacNativeCocoaWidget执行

    setAttribute(Qt::WA_PaintOnScreen)
    
  3. 在macEventFilter()中,检查事件是否为MouseMove事件:

    NSEvent *e = reinterpret_cast<NSEvent *>(event);
    if ([e type] == NSMouseMoved)
    
  4. 如果是,检查坐标是否在你所拥有的WebView的边界内,然后向通知中心发布一个MouseMoved通知:

    [[NSNotificationCenter defaultCenter]
              postNotificationName:@"NSMouseMovedNotification" object:nil
              userInfo:[NSDictionary dictionaryWithObject:e forKey:@"NSEvent"]];
    

当检查事件的位置是否在你的WebView,请记住,Cocoa坐标原点在底部,而在Qt(0,0)是左上角!

在我的例子中,我使用了一个带有NSPanel和嵌入式WebView的本地应用程序。即使元素(按钮)被点击,悬停事件也不会被发送。我通过重写NSPanel类的以下方法解决了这个问题:

- (BOOL)canBecomeKeyWindow 
{
    return YES;
}
- (BOOL)isMainWindow 
{
    return YES;
}
- (BOOL)isKeyWindow 
{
    return ([NSApp isActive]) ? YES : [super isKeyWindow];
}   

使NSView在NSPanel第一响应者中没有键窗口状态

最新更新