OS X上的Cocoa WebView不会触发鼠标悬停事件而无需单击并按住鼠标左键

时间:2013-04-24 11:51:05

标签: macos cocoa webview focus mousemove

我是Mac开发的新手,我正在尝试使用QMacCocoaViewContainer合并使用Cocoa WebView。我有视图加载我的html文件与多个CSS和JavaScript文件,但我遇到的问题是当用户将鼠标移到视图上时不会触发鼠标悬停事件。

我已经确定,如果用户点击并按住鼠标左键并移动鼠标,则会触发事件。我猜这是一个焦点问题,但在解决这个问题上没有成功。任何帮助都会很棒

2 个答案:

答案 0 :(得分:1)

我在SO上发现了一个类似的问题:Event issue when embed cocoa webview to QT application其中勾勒出了一个答案。我可以确认该答案的解决方案是有效的,但只是暗示。这是我做的:

  1. 在您的应用中重新实施QApplication :: macEventFilter()
  2. 通过执行

    为您的应用或仅为QMacNativeCocoaWidget禁用Alien小部件
    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"]];
    
  5. 当检查事件的位置是否在WebView中时,请记住Cocoa坐标的原点位于底部,而Qt(0,0)位于左上角!

答案 1 :(得分:0)

就我而言,我使用的是带有NSPanel和嵌入式WebView的本机应用程序。即使单击了元素(按钮),也从未发送过悬停事件。我通过重写NSPanel类的以下方法解决了该问题:

- (BOOL)canBecomeKeyWindow 
{

    return YES;
}

- (BOOL)isMainWindow 
{

    return YES;
}

- (BOOL)isKeyWindow 
{

    return ([NSApp isActive]) ? YES : [super isKeyWindow];
}   

Make NSView in NSPanel first responder without key window status