Qt 重载QComboBox,实现右侧删除键
文章目录
Qt 重载QComboBox,实现右侧删除键
前言
最近在做一个项目,这个项目用到一个QComboBox下拉框,做出来之后,功能都是能够正常实现的。但是我想要实现之前看到的一个网页的下拉框效果:

所以我就琢磨怎么来实现这种效果。
方案
简单来说,就是当QComboBox有选中内容时,鼠标移动到右侧下拉箭头时,下拉箭头变成一个叉号,点击之后会将当前选中的内容删除;
设置下拉箭头图标
首先,我想到了让这个下拉箭头变换图标的方式,通过setProperty来设置动态属性,并设置样式,来设置不同图标。具体方式请看我之前写的这篇博文Qt通过setProperty来达到设置控件的不同样式表。然后将信号currentIndexChanged和设置图标的槽函数连接起来,代码如下:
// 连接信号
connect(this, SIGNAL(currentIndexChanged(int)),
this,SLOT(slot_setPopupType(int)));
void MyComboBox::slot_setPopupType(const int &index)
{
QString type;
// 根据当前下标来判断是不是有内容
type = (index == -1 ? "popup" : "close");
// 设置属性
setProperty("Type", type);
// 设置属性后,必须重新刷新一下样式
style()->polish(this);
}
设置QComboBox内容为空
在实践的过程中,我苦于清除按键的功能设计,怎样才能让QComboBox的内容为空呢?
然后我搜索后发现了这个
setCurrentIndex(-1);
当设置当前下标为-1时,就会将QComboBox的内容置空;
自定义showPopup函数
如果你需要对下拉的过程进行自定义,就需要重载函数showPopup。我这里不需要进行自定义,所以我就没有进行重载了;
定位鼠标
但是,我们要怎么确定鼠标按下的位置是下拉框呢?
我最开始的方案是根据鼠标点击的位置来确定,但是根据你样式表设置的不同,你的这个下拉箭头的大小就会不同,我想尽了各种办法,都没有找到怎么去获取这个下拉箭头的大小的方法,所以获取的位置就可能会因为不同的样式会有偏差。后面我想到自带的QComboBox不是有对下拉框进行点击事件吗?或许能从源码里找到答案。

这里重要的点在
sc == QStyle::SC_ComboBoxArrow
看到这里,我就知道要怎么去判断鼠标点击的位置是下拉框了;
if (property("Type") == "close") {
// 当sc == SC_ComboBoxArrow代表,按下的位置为下拉箭头的位置
if (e->button() == Qt::LeftButton
&& sc == QStyle::SC_ComboBoxArrow) {
setCurrentIndex(-1);
} else {
QComboBox::showPopup();
}
return;
}
屏蔽鼠标右键
然后又出现了一个鼠标右击这个comboBox,也会将下拉框展开的问题,所以我们需要将鼠标右键进行屏蔽;
if (e->button() == Qt::RightButton) {
return;
}
最终控制下拉代码
void MyComboBox::mouseReleaseEvent(QMouseEvent *e)
{
QStyleOptionComboBox opt;
this->initStyleOption(&opt);
// 此处是获取鼠标按下的坐标对应的子控件
QStyle::SubControl sc = this->style()->hitTestComplexControl(QStyle::CC_ComboBox, &opt, e->pos(), this);
// 屏蔽右键
if (e->button() == Qt::RightButton) {
return;
}
if (property("Type") == "close") {
// 当sc == SC_ComboBoxArrow代表,按下的位置为下拉箭头的位置
if (e->button() == Qt::LeftButton
&& sc == QStyle::SC_ComboBoxArrow) {
setCurrentIndex(-1);
} else {
QComboBox::showPopup();
}
return;
}
return QComboBox::mousePressEvent(e);
}
void MyComboBox::mousePressEvent(QMouseEvent *e)
{
// 此处为了禁止按住拖动时会展开下拉菜单
Q_UNUSED(e);
return;
}
效果图

代码下载
代码下载请看gitee MyComboBox
Qt 重载QComboBox,实现右侧删除键的更多相关文章
- Qt之QComboBox定制(二)
上一篇文章Qt之QComboBox定制讲到了qt实现自定义的下拉框,该篇文章主要实现了列表式的下拉框,这一节我还将继续讲解QComboBox的定制,而这一节我将会讲述更高级的用法,不仅仅是下拉列表框, ...
- Qt之QComboBox(基本应用、代理设置)(转)
QComboBox下拉列表比较常用,用户可以通过选择不同的选项来实现不同的操作,如何实现自己的下拉列表呢? 很多人在问QComboBox如何设置选项的高度.代理等一些问题!今天就在此分享一下自己的一些 ...
- Qt之QComboBox(基本应用、代理设置)
QComboBox下来列表比较常用,用户可以通过选择不同的选项来实现不同的操作,如何实现自己的下拉列表呢? 很多人在问QComboBox如何设置选项的高度.代理等一些问题!今天就在此分享一下自己的一些 ...
- Qt中QComboBox中自定义界面使用stylesheet实现下拉按钮独立效果
使用QSS自定义控件界面时,QT中控件QCombobox含有两个子控件drop-down和down-arrow.一般而言,当改变QCombox时,很多效果都会出来,但是,针对下拉按钮和下拉图标的自定义 ...
- Qt之QComboBox定制
说起下拉框,想必大家都比较熟悉,在我们注册一些网站的时候,会出现大量的地区数据供我们选择,这个时候出现的就是下拉框列表,再比如字体选择的时候也是使用的下拉框,如图1所示.下拉框到处可见,作为一个图形库 ...
- QT之QComboBox
1.addItems需要注意的事项: 1.在QT中设置maxVisibleItems的值,设置Items的最大可显示的值.(一般默认为10) 2.在每次需要清除已经添加的tems的时候需要注意,ui. ...
- QComboBox 和 QSpinBox 使用方法
Qt中QComboBox 和 QSpinBox 是两个很常用的空间,QComboBox 是下拉菜单,而 QSpinBox 是调参数的神器,所以它们的用法十分必要熟练掌握. 首先来看 QComboBox ...
- C++:成员运算符重载函数和友元运算符重载函数的比较
5.2.4 成员运算符重载函数和友元运算符重载函数的比较 (1)对双目运算符而言,成员运算符重载函数参数表中含有一个参数,而友元运算符重载函数参数表中有两个参数:对于单目运算符而言,成员运算符重载函数 ...
- QT定制有标题的扁平化下拉框控件
关键字:QT,QComboBox,QLineEdit,QListView,QPushButton,QMenu,QWidgetAction,setStyleSheet OS:Windows 7 方法一: ...
- C++框架_之Qt的窗口部件系统的详解-上
C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...
随机推荐
- java-信息安全(二十)国密算法 SM1,SM2,SM3,SM4
一.概述 国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥长度和分组长度均为128位.目前主要使用公开的SM2.SM3.SM4三类算法,分别是非对称算法.哈希算法和对称算 ...
- Qt6.2发布(含项目代码升级到Qt6吐血经验总结)
一.前言 升级到Qt6吐血经验总结 https://gitee.com/feiyangqingyun/qtkaifajingyan#二升级到qt6 我很高兴地宣布 Qt 6.2 的发布.Qt 6.2 ...
- Qt音视频开发19-海康sdk录像存储
一.前言 关于调用海康sdk来进行录像存储,整体的框架架构处理流程沿袭了之前vlc内核.ffmpeg内核.mpv内核的做法,定时存储这块,开个定时器判断,到了时间则先关闭原来的录像存储,然后在开始一个 ...
- Halo博客+兰空图床搭建保姆级指南
1. 简介 1.1 依赖的相关软件 Docker.Docker-Compose底层运行环境 Minio底层的存储支持 Mysql关系型数据库 Redis缓存中间件 NginxProxyManager( ...
- ubuntu更换conda的源
ubuntu更换conda的源有两种方法:一.使用命令行更换Conda源至国内镜像站点.二.直接创建并编辑编辑conda的配置文件.condarc. 一.使用命令行更换Conda源至国内镜像站点 要在 ...
- [转]奇异值分解(SVD)方法求解最小二乘问题的原理
原文链接:奇异值分解(SVD)方法求解最小二乘问题的原理 翻译 搜索 复制
- RAG实践 - AI 知识库问答功能的建设
最近在工作中构建了一套自动的基于文档中心为数据集构建知识库 AI 问答的系统,来提升用户体验和技术支持效率,分享一下在实现过程中的技术选型和架构设计. 背景 先说下背景,我们公司的产品 FinClip ...
- CSP2024 游记
前文 Day -1 上午考试了,多少分忘了. 晚上老师布置模板题. Day 0 继续前一天的模板题,并没有 AK. Day 1 J 组 先看 T1,发现是一道简单的水题,切了. 再看 T2,也是水题, ...
- ffmpeg 去除音频中的静音
去除音频中的静音 //去除所有超过0.3秒的静音部分 ffmpeg -i input.mp3 -af silenceremove=stop_periods=-1:stop_duration=0.3:s ...
- Linux VXLAN小实验
本文分享自天翼云开发者社区<Linux VXLAN小实验>,作者:李****一 前言 VXLAN在云网络中应用十分广泛.本文介绍一种方法在两台Linux主机之间建立简单的VXLAN隧道,以 ...