网站建设维护项目,做网站的课题背景介绍,个人淘宝客网站备案,信息技术网站建设教案平时写 Qt Widgets#xff0c;我们对 QComboBox 的印象基本就是#xff1a;
点一下 → 下拉 → 选个值 → 触发 currentIndexChanged() → 做点事。
但如果你做过参数面板、工具软件、工业 HMI、编辑器设置页#xff0c;你会发现#xff1a;
下拉框其实还能#xff1a;
区…平时写 Qt Widgets我们对QComboBox的印象基本就是点一下 → 下拉 → 选个值 → 触发currentIndexChanged()→ 做点事。但如果你做过参数面板、工具软件、工业 HMI、编辑器设置页你会发现下拉框其实还能区分用户选择vs程序改值变成可编辑输入框还能按策略自动插入支持placeholder 提示文本接QCompleter 自动补全甚至包含匹配绑定Model/View 模型每项能存IDUserRoleUI 和业务值分离下拉里做分组分隔线自定义弹出 View性能/行为/样式都能控每项带图标状态/级别选择神器可编辑时加 Validator输入源头就限制输入就弹出候选体验像搜索下拉禁用滚轮误触参数面板必备这篇带你把这些能力一次玩明白。跑起来后你操作每个 Demo顶部“状态区”会实时告诉你触发了啥。文末附下载链接01别乱连信号activated/currentIndexChanged/currentTextChanged你有没有遇到过这种情况你只想统计“用户真的选了某一项”结果程序里setCurrentIndex()也触发了信号日志刷屏、业务误触发关键点是activated只在“用户操作选择”时触发程序 set 不会触发它。connect(cb,QOverloadint::of(QComboBox::activated),this,[](intidx){m_status-setText(QString(activated index%1 text\%2\).arg(idx).arg(cb-itemText(idx)));});connect(cb,QOverloadint::of(QComboBox::currentIndexChanged),this,[](intidx){m_status-setText(QString(currentIndexChanged index%1).arg(idx));});✅典型用途埋点统计、用户确认动作、只响应“人为选择”的业务逻辑。02把 ComboBox 当“输入选择”setEditable(true)InsertPolicy做“历史输入/最近使用/可扩展枚举”时你往往不想自己维护一堆列表。QComboBox可编辑后用户输入新文本按 Enter还能按策略自动插入到列表cb-setEditable(true);cb-addItems({cat,dog,bird});cb-setInsertPolicy(QComboBox::InsertAtTop);✅典型用途标签输入、路径/型号/备注历史、最近使用的配置项。03Placeholder让“未选择”更清晰很多配置页里下拉框空着时用户会懵到底要选啥Qt 5.15/Qt6 可以直接cb-setPlaceholderText(请选择国家placeholderText);这类细节做了界面“高级感”会明显提升。04自动补全QCompleter还支持包含匹配MatchContains默认补全经常只匹配前缀体验偏“笨”。你这份 Demo 直接上了包含匹配输入ber也能出blueberry / blackberry——很爽。auto*cnewQCompleter(cb-model(),cb);c-setCaseSensitivity(Qt::CaseInsensitive);c-setFilterMode(Qt::MatchContains);cb-setCompleter(c);✅典型用途城市/物料/设备/枚举很长的下拉选择。05QComboBox 本质是 Model/ViewsetModel(QStringListModel)别再把 ComboBox 当“只能 addItems 的控件”了。它本质就是 Model/View 的 View。auto*modelnewQStringListModel(w);model-setStringList({alpha,beta,gamma,delta});cb-setModel(model);✅典型用途接数据库、接设备列表、接动态枚举、甚至接更复杂的自定义模型。06每项都能带“隐藏数据”itemData(UserRole)存 ID真实项目里经常是UI 显示北京 / 上海 / 深圳业务值110000 / 310000 / 440300或 GUID / 枚举值这就是UserRole的主场cb-setItemData(0,110000,Qt::UserRole);intcodecb-itemData(idx,Qt::UserRole).toInt();✅你得到的好处UI 文案随便改业务值不受影响UI 和逻辑彻底解耦。07下拉也能“分组”insertSeparator()想做“常用 / 其他”“最近 / 全部”不用做两个 ComboBox一条分隔线就够cb-addItem(常用中文);cb-addItem(常用英文);cb-insertSeparator(cb-count());cb-addItem(其他日语);cb-addItem(其他韩语);08自定义弹出 ViewsetView(QListView)当你需要控制选择行为性能大列表样式/行高/后续 delegatesetView()就很好用auto*viewnewQListView(cb);view-setSelectionMode(QAbstractItemView::SingleSelection);view-setUniformItemSizes(true);cb-setView(view);09带图标条目addItem(QIcon, text)状态/级别/主题选择神器QIcon warnstyle()-standardIcon(QStyle::SP_MessageBoxWarning);cb-addItem(warn,Warning);✅典型用途日志级别、告警等级、主题模式、状态选择。10可编辑时校验Validator 要加在lineEdit()上这个坑很常见ComboBox 可编辑时本质输入框是lineEdit()。cb-setEditable(true);cb-lineEdit()-setValidator(newQIntValidator(0,999,cb));✅你得到的好处输入从源头就被限制不用后面反复弹错误提示。11输入即弹出type-to-popup体验立刻起飞很多“可搜索下拉”的关键体验就是一输入就弹候选不用再点小箭头。connect(cb-lineEdit(),QLineEdit::textEdited,this,[](constQStringt){if(!cb-view()-isVisible()!t.isEmpty())cb-showPopup();});配合第 04 节的QCompleter基本就是“搜索下拉框”的雏形了。12工程级细节禁用滚轮误触参数面板必备参数面板最怕的一类事故用户滚动页面鼠标刚好悬停在 ComboBox 上 → 值被滚轮改掉。你的做法很干净用事件过滤器吃掉 Wheel。classNoWheelFilter:publicQObject{protected:booleventFilter(QObject*,QEvent*ev)override{if(ev-type()QEvent::Wheel)returntrue;returnQObject::eventFilter(obj,ev);}};cb-installEventFilter(newNoWheelFilter(cb));✅典型用途工业界面、参数面板、配置页、任何“改错代价很大”的 UI。✅ 下载链接我把完整可运行 Demo 打包好了直接拷进工程即可运行含状态区 12 个功能分组。下载链接通过网盘分享的文件QComboBox链接: https://pan.baidu.com/s/1ZQHCMc-TLvED6cuWR3W2XA?pwdjkcf 提取码: jkcf