当前位置: 首页 > news >正文

QT:自定义ComboBox

实现效果:

实现combobox的下拉框区域与item区域分开做UI交互显示。

支持4种实现效果,如下

效果一:

效果二:

效果三:

效果四:

实现逻辑:

ui由一个toolbutton和combobox上下组合成,重点在于combobox。

我设置了4种枚举,ButtonWithComboBox对应效果一;OnlyButton对应效果四;OnlyComboBox对应效果三;OnlyComboBoxDepart对应效果二。

一、交互

自定义一个combobox,在鼠标事件中判断鼠标处于哪个位置。将combobox分为2个部分,一个是item区,区域的获取方法

QRect itemRect = style()->subControlRect(QStyle::CC_ComboBox, &opt,QStyle::SC_ComboBoxEditField);

一个是下拉按钮区,获取方法是

 _arrowRect = style()->subControlRect(QStyle::CC_ComboBox, &opt,QStyle::SC_ComboBoxArrow, this);

并设置一个变量用来记录按钮所在位置,这里,使用了setProperty,设置了一个参数名inArrowRect。当鼠标在item区时,inArrowRect为“out”,当鼠标在下拉按钮区时,inArrowRect为“in”,当鼠标离开combobox时,inArrowRect为“null”。在css样式表里结合inArrowRect的值设置交互。

二、自定义下拉区

在这里,我需要设置combobox支持下拉显示自定义界面,所以我设置了一个变量_isCustomized,用来判断下拉后是否使用自定义界面,如果使用自定义界面,只需要调用setPopupWidget(QWidget *widget),将自定义界面传入。

此外,设置了一个变量_isTogether,用来判断是否要将combobox的Item区与下拉按钮区分开显示,如果设置为false,那么会按原始的样式显示,两者是整体;设置为true,样式就会使用我上面显示的。

因为常用的是自定义Menu,所以我封装了一个函数QAction* addMenuAciton(QObject *obj,QString name,QString iconName,const QString &toolTip = "",bool isCheckable = false),专门用来显示自定义Menu。

此外,就是有时候下拉区域是图片带文字的,点击后,最终只显示图片或文字。所以这里要注意,我写的这个类,下拉区域的显示和combobox最终显示的是独立设置的2个。combobox显示的内容是通过comboBox的addItem来添加。通过设置一个变量_comboType设置combobox显示什么

实现代码:

具体代码实现如下

.cpp

#ifndef TOOLCOMBOBOX_H
#define TOOLCOMBOBOX_H#include <QWidget>
#include <QComboBox>
#include <QMouseEvent>
#include <QPainter>
#include <QVBoxLayout>
#include <QAbstractItemView>
#include <QStandardItem>
#include <QStylePainter>
#include <QStyleOptionComboBox>namespace Ui {
class ToolComboBox;
}
namespace RO_xxx{class IndependentComboBox : public QComboBox {Q_OBJECT
public:enum comboShow{iconAndText =0,onlyText =1,onlyIcon=2};Q_ENUM(comboShow)using QComboBox::QComboBox;void setComboShow(comboShow type){_comboType = type;}void setPopupWidget(QWidget *widget){_customPopup = widget;_customPopup->setWindowFlag(Qt::Popup);// 设置为 Popup 类型// 确保 Popup 关闭时能正确触发 hidePopup()connect(_customPopup, &QWidget::destroyed, this, &QComboBox::hidePopup);}void setTogether(bool together){_isTogether = together;}void setComboBoxPopCustomized(bool isCustomized){_isCusto

相关文章:

  • MySQL 表的约束(二)
  • vs2022解决 此项目需要MFC库。从visual studio安装程序(单个组件选项卡)为正在使用的任何工具和体系结构安装他们问题
  • 【AI生产力工具】Windsurf,一款AI编程工具
  • 目标检测YOLO实战应用案例100讲- 无人机平台下露天目标检测与计数
  • 新能源汽车声纹监测技术的发展趋势是什么?
  • [Linux运维] [Ubuntu/Debian]在Lightsail Ubuntu服务器上安装Python环境的完整指南
  • ETL架构、数据建模及性能优化实践
  • 开源模型应用落地-全能音频新纪元-Kimi-Audio-7B-Instruct-重塑多模态交互边界
  • 网络原理 - 10(HTTP/HTTPS - 1)
  • LBS服务(基于位置的服务)与LLM(大型语言模型)交互功能分析
  • 为什么PPT中的视频无法播放?
  • 【Robocorp实战指南】Python驱动的开源RPA框架
  • 分析整体文档集合质量:来源多样性、内容新鲜度、信息密度、内容具体性
  • JVM——引入
  • 了解Android studio 初学者零基础推荐(1)
  • 组装 (DIY) 一台显示器 (4K 屏支持 4 画面分屏 PBP 1080p x4)
  • 【保姆级教程-Centos7环境下部署mongodb并设置开机自启】
  • node.js puppeteer 实践
  • 利用Python生成Xilinx FPGA ROM IP核 .coe初始化文件
  • Vue 3 vuedraggable 例子
  • 君亭酒店:2024年营业收入约6.76亿元, “酒店行业传统增长模式面临巨大挑战”
  • “自己生病却让别人吃药”——抹黑中国经济解决不了美国自身问题
  • 借助AI应用,自闭症人群开始有可能真正“读懂他人”
  • 可实时追踪血液中单个细胞的穿戴医疗设备问世
  • 珠海市香洲区原区长刘齐英落马,此前已被终止省人大代表资格
  • 官方披露:临汾昔日“明星官员”宿青平已于去年落马