我正在尝试使用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并解决了问题(请参阅下面的答案)。
答案 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作为该模块的最新版本,它使我能够访问QWindow
的activeChanged
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
}
}