检测QML窗口外的单击

检测QML窗口外的单击,qml,qt-quick,Qml,Qt Quick,如何在QML中检测窗口{}外的单击 Rectangle { id: topLevel height: 400; width: 400 Window { id: windowObj color: "blue" height: 200; width: 200 onActiveChanged { console.trace(); visible = false; } } Component.onCompleted:

如何在QML中检测窗口{}外的单击

Rectangle {
   id: topLevel

   height: 400; width: 400

   Window {
      id: windowObj

      color: "blue"
      height: 200; width: 200
      onActiveChanged { console.trace(); visible = false; }
   }

   Component.onCompleted: windowObj.visible = true
}
假设我在
windowObj
外部单击
topLevel
的某些部分

onActiveChanged
适用于Windows,但不适用于MAC

{Using: QtQuick 2.1, QtQuick.Window 2.1, QML/Qt 5.2.0}

在顶层矩形中放置一个鼠标earea,让事件通过

Rectangle {
   id: topLevel

   MouseArea{
      anchors.fill : topLevel
      propagateComposedEvents : true
      onClicked : console.log("clickoutside");
   }

   Window {
      id: windowObj

      color: "blue"
      height: 200; width: 200
      onActiveChanged { console.trace(); visible = false; }
   }
}

我想避免这种情况。我基本上希望这个窗口作为我自定义组合框的下拉列表。只要有任何类型的鼠标在它外面按下,它就会关闭——甚至在应用程序本身之外,或者在标题栏上等等。然后我需要捕获所有事件,看看哪个应该关闭我的
窗口{
}等等。你知道有其他/更好的方法吗?比如
onActiveChanged
在Windows操作系统上运行得很好?另一种方法是在qml容器本身中添加事件处理程序,就像Qt的QtQuick2ApplicationViewer一样,无论qml运行在什么环境中。添加eventfilter函数,如果外部clic的条件匹配,则向qml发送事件。