Qml 中的那些坑(七)---ComboBox嵌入Popup时,滚动内容超过其可见区域不会关闭ComboBox弹窗
【写在前面】
最近在写信息提交 ( 表单 ) 的窗口时发现一个奇怪的 BUG:

其代码如下:
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Button{
text: "open"
onClicked: popup.open();
}
Popup {
id: popup
width: 400
height: 200
anchors.centerIn: parent
clip: true
closePolicy: Popup.CloseOnPressOutside
background: Rectangle { color: "#80800000" }
contentItem: Flickable {
id: flickable
clip: true
topMargin: 10
contentWidth: implicitWidth
contentHeight: 500
ScrollBar.vertical: ScrollBar { width: 14 }
/*onMovementStarted: {
for (let key in contentItem.children) {
let item = contentItem.children[key];
if (item.objectName === "__ComboBox__")
item.popup.close();
}
}*/
ComboBox {
width: 160
height: 40
objectName: "__ComboBox__"
model: ["aaaaaa", "bbbbbb", "cccccc", "dddddd"]
}
}
}
}
可以看到,当 ComboBox 嵌入 Popup 时,点开 ComboBox,然后滚动内容超过其可见区域并不会关闭 ComboBox 弹窗,并且会超出其 父 Popup 范围。
【正文开始】
实际上,这是几乎存在在 Qt 所有版本 ( Qt5 ~ Qt6 ) 的 BUG,猜测其主要原因为弹窗无法对内部嵌套弹窗进行裁剪,因为此弹窗 ( Popup ) 并非真正的窗口 ( Window )。
该 BUG 我已报告给官方:https://bugreports.qt.io/browse/QTBUG-130960?filter=-2
不过,在官方修复的版本出来之前,我实现的改动较小的修复办法为:
- Qt5 中为:
Flickable {
...
onMovementStarted: {
for (let key in contentItem.children) {
let item = contentItem.children[key];
if (item.objectName === "__ComboBox__")
item.popup.close();
}
}
ComboBox {
...
objectName: "__ComboBox__"
}
}
- Qt6 中为:
Flickable {
...
onMovementStarted: {
for (let item of contentItem.children) {
if (item.objectName === "__ComboBox__")
item.popup.close();
}
}
ComboBox {
...
objectName: "__ComboBox__"
}
}
只需要在当视图由于用户交互或生成的 flick() 而开始移动时,关闭掉 ComboBox 的弹窗即可。
修复后的效果如下:

【结语】
最后,要说明并非只有本文中的例子会有该 BUG,所有形如下面的代码都可能出现。
Popup {
Popup {
...
}
}
而修复思路也大致相似。
Qml 中的那些坑(七)---ComboBox嵌入Popup时,滚动内容超过其可见区域不会关闭ComboBox弹窗的更多相关文章
- [转载]震惊!QWidget竟然可以嵌入到QML中,QMl窗口句柄竟然是这样获取
背景 记得在初学qml时,就被大佬告知Qml的实现有两种方式“view+item”和“engine+widow”,那么能不能将QWidget嵌入到QML中来呢,我收到的答案是不可以,原因是QML的 ...
- 整理iOS9适配中出现的坑(图文)
原文: http://www.cnblogs.com/dsxniubility/p/4821184.html 整理iOS9适配中出现的坑(图文) 本文主要是说一些iOS9适配中出现的坑,如果只是要 ...
- 整理 iOS 9 适配中出现的坑(图文)(转)
作者:董铂然 本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着 ...
- 整理 iOS 9 适配中出现的坑
本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级 ...
- 整理 iOS 9 适配中出现的坑(图文)
作者:董铂然 授权本站转载. 本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iO ...
- iOS 9 适配中出现的坑
整理 iOS 9 适配中出现的坑(图文) 2015-10-22 iOS开发 库克表示:“现在在中国有150多万的开发者在iOS当中开发应用程序,我们鼓励更多的人开发应用程序,也鼓励更多的创业加入.” ...
- qml中打开本地html
main.cpp QString tmploc = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); QDi ...
- Nancy总结(二)记一次Nancy 框架中遇到的坑
记一次Nancy 框架中遇到的坑 前几天,公司一个项目运行很久的Nancy框架的网站,遇到了一个很诡异的问题.Session 对象跳转到另外一个页面的时候,session对象被清空了,导致用户登录不上 ...
- qt qml中PropertyAnimation的几种使用方法
qml文章 qt qml中PropertyAnimation的几种使用方法 动画应用场景有以下几种: 首先如果一个Rectangle.动画是要改变它的x和y值 1,Rectangle一旦被创建,就要移 ...
- qml 中 使用 shader
使用绘制工具如Photoshop .Flash已经可以创建许多效果非常绚丽的图像.动画等. Qt/QML 的努力其实是在这些工具发展的后面, 因此很多效果在Qt中无法实现. 不得不佩服Qt小组的才智, ...
随机推荐
- 【团队建设】如何做好团队开发中的 CodeReview(代码评审)?
目录 前言 一.为什么要做 二.有哪些好处 三.具体怎么做 3.1评审条件 3.2评审重点 3.3评审形式 四.还可以怎么做 4.1提出亮点 4.2轮流评审 4.2文档沉淀 五.文章小结 前言 你是否 ...
- how to create rpm
RPM Spec 中各个字段的 pre, post, preun, postun 的用法 https://www.golinuxhub.com/2018/05/how-to-execute-scrip ...
- XGBoost模型 0基础小白也能懂(附代码)
XGBoost模型 0基础小白也能懂(附代码) 原文链接 啥是XGBoost模型 XGBoost 是 eXtreme Gradient Boosting 的缩写称呼,它是一个非常强大的 Boostin ...
- FALCON:打破界限,粗粒度标签的无监督细粒度类别推断,已开源| ICML'24
在许多实际应用中,相对于反映类别之间微妙差异的细粒度标签,我们更容易获取粗粒度标签.然而,现有方法无法利用粗标签以无监督的方式推断细粒度标签.为了填补这个空白,论文提出了FALCON,一种从粗粒度标记 ...
- Angular Material 18+ 高级教程 – Custom Themes for Material Design 3 (自定义主题 Material 3)
v18 更新重要说明 从 Angular Material v18 开始,默认使用的是 Material 3 Design (简称 M3). 而且是正式版,不再是 experimental previ ...
- HTML – Native Dialog Modal
前言 之前介绍 Native Form 的时候有提及过 method="dialog", 但由于它太新了, 所以没去研究. 这篇就介绍一下. Dialog 也好 Modal 也好, ...
- Azure 学习笔记
选择 VM 配套 https://docs.azure.cn/zh-cn/virtual-machines/sizes https://docs.azure.cn/zh-cn/virtual-mac ...
- Blazor静态服务端呈现(静态SSR)身份认证
本文介绍 Blazor 静态服务端呈现(静态 SSR)模式下,用户登录身份认证是如何实现的. 1. SSR 简介 SSR 是服务器侧呈现,HTML 是由服务器上的 ASP.NET Core 运行时生成 ...
- Java 8 新特性:Stream 流快速入门
前言 在 java 中,涉及到对数组.集合等集合类元素的操作时,通常我们使用的是循环的方式进行逐个遍历处理,或者使用 stream 流的方式进行处理. 什么是 Stream? Stream(流)是一个 ...
- QT数据可视化框架编程实战之三维曲面图 实时变化的三维曲面图 补天云QT技术培训专家
QT数据可视化框架编程实战之三维曲面图 实时变化的三维曲面图 补天云QT技术培训专家 简介 本文将介绍QT数据可视化框架编程实战之三维曲面图,本文通过构造一个数据实时变化的三维曲面图的应用实例来展示Q ...