Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 当QML窗口失去焦点时如何隐藏它_Qt_Qml - Fatal编程技术网

Qt 当QML窗口失去焦点时如何隐藏它

Qt 当QML窗口失去焦点时如何隐藏它,qt,qml,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 onC

我正在尝试使用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上使用Qt5.1.1

多谢各位

更新:我切换到Qt5.2并解决了问题(请参见下面的答案)。

如果您更改(在
中单击
处理程序)

致:

你会得到必要的结果


有一个很好的
下拉列表的例子
:不使用另一个
窗口

,今天我升级到了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中,<代码> QtQuq.Windows 2.1 < /C> >被指定为该模块的最新版本,它使我能够访问S和(是C++中的等价类,它是子类)。

试图绑定到ActVchange的丢失时间。找到了另一个解决方案

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

请提供更多细节。你想达到什么目标?您出现了什么错误?@johny我更新了我的问题。
下拉列表是否在以下步骤后消失:单击主窗口,然后单击
下拉列表,然后单击主窗口标题?@johny是的,它消失了。谢谢您的回答。如果我做了建议的更改,应用程序的行为会很奇怪<代码>下拉列表
在失去焦点时隐藏,其
标志
属性将其值更改为Qt。显示
下拉列表
后弹出,但它保留其标题栏、关闭按钮等。对我来说,这看起来像一个bug。另外,谢谢你的链接。我想这对我有帮助。我仍然想使用窗口,即使我必须在C++中工作,因为我认为只有这样,下拉可以扩展到主窗口的大小之外。
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;
            }
        }
    }
}
onActiveFocusItemChanged: {
    if (!activeFocusItem) {
        _.visible = false
    }
}