我正在尝试使用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并解决了问题(请参阅下面的答案).
今天我升级到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被指定的文件中作为模块的最新版本,这让我获得QWindow的activeChanged信号和requestActivate时隙(QMLWindow是相当于QQuickWindow在C++中,这是的子类QWindow).
| 归档时间: |
|
| 查看次数: |
10559 次 |
| 最近记录: |