Обнаружение щелчков вне окна QML

#qml #qt-quick

#qml #qt-быстрый

Вопрос:

Как мне обнаружить щелчки вне Window {} в 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
}
  

Предположим, я нажимаю на какую-то часть topLevel снаружи windowObj .

onActiveChanged работает на Windows, но не на MAC.

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

Ответ №1:

Поместите область мыши в прямоугольник верхнего уровня и дайте событию пройти

 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; }
   }
}
  

Комментарии:

1. Я хочу избежать этого. Я в основном хочу, чтобы это окно было выпадающим списком моего пользовательского списка. Он должен закрываться всякий раз, когда за его пределами происходит какое-либо нажатие мыши — даже за пределами самого приложения или в строке заголовка и т. Д. Затем мне нужно зафиксировать все события и посмотреть, какое из них должно закрыть my Window { } и т. Д. Знаете ли вы какой-либо другой / лучший способ onActiveChanged , который отлично работает в ОС Windows?

2. другой способ — добавить обработчик событий в сам контейнер qml, например, QtQuick2ApplicationViewer из Qt, независимо от того, в каком qml запущен. добавьте функцию eventfilter и, если ваши условия для внешнего клика совпадают, отправьте событие в ваш qml.