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,实现右侧删除键的更多相关文章

  1. Qt之QComboBox定制(二)

    上一篇文章Qt之QComboBox定制讲到了qt实现自定义的下拉框,该篇文章主要实现了列表式的下拉框,这一节我还将继续讲解QComboBox的定制,而这一节我将会讲述更高级的用法,不仅仅是下拉列表框, ...

  2. Qt之QComboBox(基本应用、代理设置)(转)

    QComboBox下拉列表比较常用,用户可以通过选择不同的选项来实现不同的操作,如何实现自己的下拉列表呢? 很多人在问QComboBox如何设置选项的高度.代理等一些问题!今天就在此分享一下自己的一些 ...

  3. Qt之QComboBox(基本应用、代理设置)

    QComboBox下来列表比较常用,用户可以通过选择不同的选项来实现不同的操作,如何实现自己的下拉列表呢? 很多人在问QComboBox如何设置选项的高度.代理等一些问题!今天就在此分享一下自己的一些 ...

  4. Qt中QComboBox中自定义界面使用stylesheet实现下拉按钮独立效果

    使用QSS自定义控件界面时,QT中控件QCombobox含有两个子控件drop-down和down-arrow.一般而言,当改变QCombox时,很多效果都会出来,但是,针对下拉按钮和下拉图标的自定义 ...

  5. Qt之QComboBox定制

    说起下拉框,想必大家都比较熟悉,在我们注册一些网站的时候,会出现大量的地区数据供我们选择,这个时候出现的就是下拉框列表,再比如字体选择的时候也是使用的下拉框,如图1所示.下拉框到处可见,作为一个图形库 ...

  6. QT之QComboBox

    1.addItems需要注意的事项: 1.在QT中设置maxVisibleItems的值,设置Items的最大可显示的值.(一般默认为10) 2.在每次需要清除已经添加的tems的时候需要注意,ui. ...

  7. QComboBox 和 QSpinBox 使用方法

    Qt中QComboBox 和 QSpinBox 是两个很常用的空间,QComboBox 是下拉菜单,而 QSpinBox 是调参数的神器,所以它们的用法十分必要熟练掌握. 首先来看 QComboBox ...

  8. C++:成员运算符重载函数和友元运算符重载函数的比较

    5.2.4 成员运算符重载函数和友元运算符重载函数的比较 (1)对双目运算符而言,成员运算符重载函数参数表中含有一个参数,而友元运算符重载函数参数表中有两个参数:对于单目运算符而言,成员运算符重载函数 ...

  9. QT定制有标题的扁平化下拉框控件

    关键字:QT,QComboBox,QLineEdit,QListView,QPushButton,QMenu,QWidgetAction,setStyleSheet OS:Windows 7 方法一: ...

  10. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

随机推荐

  1. P10952 聚会 题解

    题目链接 题目大意 对于一棵树,求出一个点对于给定的三个点(以下简称 $x$,$y$,$z$ 且可以重复)距离最短. 题解 对于点的距离,不难想到 LCA 处理.而对于本题,则有两种情况. 第一问 三 ...

  2. Qt编写物联网管理平台(支持win/linux/mac/嵌入式linux/modbus等)

    一.前言 这个物联网综合管理平台前后迭代了五年,一点一滴慢慢积累起来,从最开始的只有modbus串口协议解析以及简单的表格显示数据,慢慢的逐渐增加了tcp_rtu支持,用户管理模块,地图监控模块,而后 ...

  3. Qt编写安防视频监控系统30-GPS运动轨迹

    一.前言 此功能是一个客户定制的,主要是需要在地图上动态显示GPS的运动轨迹,有个应用场景就是一个带有监控的车子,实时在运动中,后台可以接收到经纬度信息,需要绘制对应的轨迹,相当于这些摄像机点位是动态 ...

  4. [转]vue项目启动时,npm run serve 和 npm run dev 的区别

    npm run serve 和 npm run dev 的区别 在我们运行一些 vue 项目的时候,输入npm run serve或者 npm run dev的其中一个时,系统会报错: PS C:\U ...

  5. 在 Ubuntu 或 Debian 上安装 LaTeX

    在 Ubuntu 或 Debian 上安装 LaTeX LaTeX 是一种文档标记语言.建议使用 LaTeX 创建技术或科学文章.论文.报告.书籍和其他文档,如博士. 1. 打开你的终端 终端是一个命 ...

  6. Linux下获取文件名

    linux 下一切皆文件 1.获取指定路径下文件或目录 ls -la /usr/local/ |grep xxx | head -n 1 |awk '{print$9}'xxx : 替换为要匹配的文件 ...

  7. SQL统计数据之总结

    一.查询SQL SELECT t1.规则编号 AS 编码, t1.规则描述 AS 名称, SUM( CASE WHEN t3.DATA_SOURCES = '00' THEN 1 ELSE 0 END ...

  8. bug的合规描述

    bug的合格描述:   发现问题的版本bug的合格描述: 开发人员需要知道出现问题的版本,才能够获取对应版本的代码来重现故障问题出现的环境 环境分为硬件环境和软件环境,详细的环境描述有利于故障的重现( ...

  9. MySQL中联合主键的 in 查询

    就一句话: SELECT * from Projects WHERE (Prj,SubID) in (SELECT Prj,SubID FROM SP where stage='设计' and 负责人 ...

  10. Delphi Cxgrid中修改一个单元格,影响另一个单元格的值的实现方法

    第一种方法就是使用表格中列的PropertiesValidate方法实现,例如修改单据的数量列,希望重新计算当前行的金额列 //编辑数量时发生 procedure TfrmSkdLr.cxgrdbcl ...