如何在失去焦点时隐藏QML窗口

sil*_*gan 10 qt qml

我正在尝试使用QML创建一个包含多个选择的组合框.它的下拉列表将是一个带有Qt.Popup标志的QML窗口,因此它没有标题栏.当用户点击它之外时,下拉列表应该会消失.

我尝试了以下代码:

import QtQuick 2.0
import QtQuick.Window 2.0

Window { id: mainWindow
    width: 200
    height: 200
    MouseArea {
        anchors.fill: parent
        onClicked: {
            dropdown.x = mainWindow.x + 50;
            dropdown.y = mainWindow.y + 50;
            dropdown.visible = true;
        }
    }

    Window { id: dropdown
        height: 200
        width: 200
        flags: Qt.Popup
        color: 'green'
        visible: false
        onVisibleChanged: {
            if (visible) {
                focusScope.focus = true;
                focusScope.forceActiveFocus();
            }
        }

        FocusScope { id: focusScope
            focus: true
            anchors {
                fill: parent
            }

            onActiveFocusChanged: {
                if (!activeFocus) {
                    dropdown.visible = false;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它不起作用.

在上面的代码中,当用户点击主窗口时,会出现一个弹出窗口,如果用户点击另一个窗口或主窗口的标题栏,它应该会消失,但它不会这样做.

如果我导入QtQuick.Window的2.1版本而不是2.0,我可以在下拉窗口中放置一个'onActiveChanged'处理程序(不会出现错误),但它永远不会被调用.

也许我可以使用一些C++来做到这一点,但我尽量避免这种情况.

我在Ubuntu 13.10上使用Qt 5.1.1.

谢谢.

更新:我切换到Qt 5.2并解决了问题(请参阅下面的答案).

sil*_*gan 8

今天我升级到Qt 5.2.在Qt 5.2中,以下代码可以按我的方式工作:

import QtQuick 2.2
import QtQuick.Window 2.1

Window { id: mainWindow
    width: 200
    height: 200
    MouseArea {
        anchors.fill: parent
        onClicked: {
            dropdown.x = mainWindow.x + 50;
            dropdown.y = mainWindow.y + 50;
            dropdown.visible = true;
            dropdown.requestActivate();
        }
    }

    Window { id: dropdown
        height: 200
        width: 200
        flags: Qt.Popup
        color: 'green'
        visible: false
        onActiveChanged: {
            if (!active) {
                dropdown.visible = false;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理是因为,在Qt的5.2,QtQuick.Window 2.1被指定的文件中作为模块的最新版本,这让我获得QWindowactiveChanged信号requestActivate时隙(QMLWindow是相当于QQuickWindow在C++中,这是的子类QWindow).