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

时间:2013-12-07 17:24:46

标签: 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;
                }
            }
        }
    }
}

它不起作用。

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

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

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

我在Ubuntu 13.10上使用Qt 5.1.1。

谢谢。

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

3 个答案:

答案 0 :(得分: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;
            }
        }
    }
}

这很有效,因为在Qt 5.2中,QtQuick.Window 2.1被指定为in the documentation作为该模块的最新版本,它使我能够访问QWindowactiveChanged signal和{ {3}}(requestActivate slot相当于C ++中的QML Window,它是QQuickWindow的子类。)

答案 1 :(得分:3)

可能,如果你改变(在onClicked处理程序中)

dropdown.visible = true;

为:

dropdown.flags = Qt.Window
dropdown.visible = true;
dropdown.flags = Qt.Popup

你将获得必要的结果。

DropDown Qt QML dropdown list like in HTML有一个很好的例子,没有使用其他Window

答案 2 :(得分:0)

尝试绑定到ActiveChanged的时间过长。找到了另一个解决方案

onActiveFocusItemChanged: {
    if (!activeFocusItem) {
        _.visible = false
    }
}