【问题标题】:Cocoa WebView on os X not firing mouse hover events without having to click and hold left mouse keyos X上的Cocoa WebView不会触发鼠标悬停事件而无需单击并按住鼠标左键
【发布时间】:2013-04-24 11:51:04
【问题描述】:

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

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

【问题讨论】:

    标签: macos cocoa webview focus mousemove


    【解决方案1】:

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

    1. 在您的应用中重新实现 QApplication::macEventFilter()
    2. 为您的应用禁用 Alien 小部件或仅对 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) 位于左上角!

    【讨论】:

      【解决方案2】:

      就我而言,我使用的是带有 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

      【讨论】:

        猜你喜欢
        • 2014-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        • 2016-03-15
        • 2011-08-22
        • 2011-12-24
        相关资源
        最近更新 更多