使用焦点和 popup.visible 播放时 ComboBox 上的奇怪行为
Posted
技术标签:
【中文标题】使用焦点和 popup.visible 播放时 ComboBox 上的奇怪行为【英文标题】:Strange behavior on ComboBox when playing with focus and popup.visible 【发布时间】:2017-05-18 12:07:50 【问题描述】:当我尝试执行此代码时,我有一个奇怪的行为让我很恼火:
import QtQuick 2.7
import QtQuick.Controls 2.0
ApplicationWindow
id: window
visible: true
width: 640
height: 480
Rectangle
color: "green"
width: parent.width/2
height: parent.height
anchors.right : parent.right
ComboBox
id:combo
popup.visible: combo.activeFocus
model: [ "Banana", "Apple", "Coconut" ]
CheckBox
id:check
如果我点击CheckBox
,然后点击ComboBox
,ComboBox.popup
将在 1 毫秒内出现然后消失。
我不明白为什么因为activeFocus = true
你知道为什么吗?
【问题讨论】:
你选择了一些东西,所以 popup.close() 将被调用,设置 popup.visible = false。你期待什么? 什么意思?我选择了ComboBox
:我点击了CheckBox
。然后我点击ComboBox
。所以我选择了ComboBox
,所以现在的重点是ComboBox
。但是,如果双击ComboBox
而不是单击,它会正常工作。
这种用例根本没有想到。我可以想象那里发生的是 ComboBox 接收鼠标事件并将其传递给处理焦点的基类实现。控件获得主动焦点和繁荣,弹出窗口打开。然后执行返回到 ComboBox 的鼠标事件处理程序,该处理程序会像在正常情况下一样切换弹出窗口的可见性,因此弹出窗口立即关闭。它可以通过在进行焦点处理之前查询弹出窗口的可见性来轻松修复。随时报告错误。
@jpnurmi:这也是我得出的结论。但是我看不到哪里有要修复的错误。您唯一能做的就是首先处理鼠标事件——这将有助于(通过覆盖popup.visible
的绑定)来保持它的显示。但这里唯一有效改变的是 popup.visible: combo.activeFocus
将被解除绑定,您可以节省时间,只需删除该行。如果您只想让一个函数从外部显示它,请创建一个 function show() forceActiveFocus(); popup.open()
并调用它而不是 forceActiveFocus()
【参考方案1】:
如果您遵循导致它的事件链,则此行为是意料之中的:
-
你点击
ComboBox
ComboBox
获得activeFocus
ComboBox.popup
变为 visible
点击被处理,切换可见性 -> ComboBox
变得不可见。
删除线
popup.visible: combo.activeFocus
你很好。
改为通过open()
和close()
控制可见性。
【讨论】:
我想你误解了我的问题。当我点击 onComboBox
时,Popup
会出现然后消失。 仅当我在单击ComboBox
之前单击CheckBox
时才会发生这种情况。
是的,我在阅读时弄混了一些东西。现在这应该解释出了什么问题。
谢谢你的解释,我明天或周一试试,看我什么时候可以做这个项目
所以我使用open
来控制可见性,它几乎可以按我的意愿工作。唯一的问题是,如果我使用open
来显示Popup
,则会出现弹出窗口,但在ComboBox
选择的当前值上不会有任何Highlight Rectangle
。但是,如果我通过单击ComboBox
本身打开ComboBox
,Highlight Rectangle
将位于当前值上。你知道为什么吗?以上是关于使用焦点和 popup.visible 播放时 ComboBox 上的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章