《QT 108好类》之16 QComboBox类

《QT 108好类》之16 QComboBox类

  • QT 108好类之16 QComboBox类
  • QComboBox类特性和应用场景
  • QComboBox类继承关系
  • QComboBox类使用
    • 1 简单使用
    • 2 表单输入
    • 3 使用自定义模型和视图
    • 4 完全自定义弹出窗口
  • QComboBox类类使用效果

QT 108好类之16 QComboBox类

QComboBox是 常用的下拉框,它提供了一个下拉列表供用户选择选项。它结合了按钮和一个弹出的下拉列表(包含所有可选项)。

QComboBox类特性和应用场景

特性
1.​​项目存储:​​可以存储文本项 (QString)。可以存储图标项 (QIcon)。可以存储用户自定义数据 (QVariant),通过 setItemData()关联到每个项上。可以存储 QStandardItem对象(当使用模型/视图架构时)。

2.​​显示:​​显示当前选中的项(文本和/或图标)。点击按钮或使用键盘展开下拉列表显示所有选项。下拉列表可以是滚动列表),也可以是列表视图(需要自定义视图)。

3.​​可编辑性:​​默认是不可编辑的(用户只能从列表中选择)。可以通过 setEditable(true)设置为可编辑。此时:用户可以直接在行编辑区域输入文本。通常会启用自动补全 (setCompleter())。可以设置验证器 (setValidator()) 限制输入内容。当用户输入时,下拉列表会根据输入内容进行过滤(如果启用了)。

4.​​模型/视图支持:​​继承自 QAbstractItemView,因此支持模型/视图架构。可以使用 setModel()设置一个数据模型来管理其内容,实现更动态和复杂的数据展示。可以使用 setView()设置自定义视图来显示下拉列表,实现多列显示等高级效果。

应用场景
1.​​设置/配置对话框:​​选择语言、主题、单位制、分辨率、音质等级别等。选择连接端口、网络接口。选择文件格式、编码方式。
2.​​数据筛选/分类:​​在表格或列表上方,提供下拉菜单筛选特定类别(如“所有产品”、“电子产品”、“书籍”)。选择日期范围(如“今天”、“本周”、“本月”、“自定义”)。
3.​​表单输入:​​选择国家、省份、城市。选择性别、职业、教育程度等固定分类信息。选择产品型号、规格。
4.​​导航/视图切换:​​在标签页或工具栏中,提供下拉菜单切换不同的视图或工作区。
5.​​命令选择:​​提供一组命令或操作供用户选择(有时会配合工具栏按钮使用)。
6.​​动态内容加载:​​第一个下拉框选择大类(如“汽车品牌”),第二个下拉框根据第一个的选择动态加载小类(如该品牌下的“车型”)。
7.​​搜索/过滤(可编辑模式):​​用户可以直接输入文本进行搜索,下拉列表实时显示匹配项。

QComboBox类继承关系

QComboBox类继承自QWidget
QComboBox类继承关系

QComboBox类使用

​​常用方法:​​
addItem(const QString &text, const QVariant &userData = QVariant()): 添加一个文本项(可选附带用户数据)。
addItem(const QIcon &icon, const QString &text, const QVariant &userData = QVariant()): 添加一个带图标的文本项。
insertItem(int index, …): 在指定索引处插入项。
removeItem(int index): 移除指定索引的项。
clear(): 移除所有项。
setCurrentIndex(int index): 设置当前选中的索引。
setCurrentText(const QString &text): 设置当前文本(在可编辑模式下直接设置文本;在不可编辑模式下,会查找匹配文本的项并选中)。
currentIndex(): 获取当前选中项的索引(如果没有选中项,返回 -1)。
currentText(): 获取当前选中项的文本(在可编辑模式下,返回行编辑框中的文本)。
currentData(int role = Qt::UserRole): 获取当前选中项关联的用户数据(默认 Qt::UserRole)。
itemText(int index): 获取指定索引项的文本。
itemData(int index, int role = Qt::UserRole): 获取指定索引项关联的用户数据。
count(): 获取项的数量。
setEditable(bool editable): 设置是否可编辑。
setModel(QAbstractItemModel *model): 设置数据模型。
setView(QAbstractItemView *itemView): 设置下拉列表使用的视图。
setCompleter(QCompleter *completer): 设置自动补全器(通常用于可编辑模式)。
setValidator(const QValidator *validator): 设置验证器(用于可编辑模式限制输入)。

信号:​​
currentIndexChanged(int index): 当前选中项的索引改变时触发(最常用)。
currentTextChanged(const QString &text): 当前选中项的文本改变时触发(在可编辑模式下,用户输入也会触发)。
activated(int index): 用户激活(选中)了一个项时触发(通常是通过鼠标点击或回车键确认选择)。
textActivated(const QString &text): 用户激活(选中)了一个项时触发,提供文本。
highlighted(int index): 用户在下拉列表中高亮(鼠标悬停或键盘导航)了一个项时触发。
editTextChanged(const QString &text): (仅在可编辑模式下)行编辑框中的文本改变时触发(用户输入时实时触发)。

1 简单使用

// 创建一个 QComboBox
QComboBox *comboBox = new QComboBox();
layout->addWidget(comboBox);// 添加选项 (文本)
comboBox->addItem("Option 1");
comboBox->addItem("Option 2");
comboBox->addItem("Option 3");// 添加带图标和用户数据的选项
comboBox->addItem(QIcon(":/images/logo.png"), "Favorite Option", QVariant(42));// 插入一个选项到指定位置
comboBox->insertItem(1, "Inserted Option");// 设置当前选中项 (索引从0开始)
comboBox->setCurrentIndex(2); // 选中 "Option 3"
// 连接信号:当选中项改变时
QObject::connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),[](int index) {qDebug() << "Current index changed to:" << index;
});// 连接信号:当用户激活(选中)一个项时
QObject::connect(comboBox, QOverload<int>::of(&QComboBox::activated),[comboBox](int index) {QString text = comboBox->itemText(index);QVariant data = comboBox->itemData(index);qDebug() << "Activated item: Index =" << index<< "Text =" << text<< "Data =" << data;
});

2 表单输入

// 创建标签
QLabel *countryLabel = new QLabel("国家:", this);
QLabel *provinceLabel = new QLabel("省份:", this);
QLabel *cityLabel = new QLabel("城市:", this);// 创建组合框
QComboBox *countryCombo = new QComboBox(this);
QComboBox *provinceCombo = new QComboBox(this);
QComboBox *cityCombo = new QComboBox(this);// 设置占位符文本
provinceCombo->addItem("-- 请选择省份 --");
cityCombo->addItem("-- 请选择城市 --");
QStringList countries;
countries<<"中国" << "美国" << "日本";
countryCombo->addItems(countries);
// 省份数据(按国家分组)
QMap<QString, QStringList> provinces;
provinces["中国"] = QStringList() << "北京" << "上海" << "广东" << "江苏" << "浙江";
provinces["美国"] = QStringList() << "加利福尼亚" << "德克萨斯" << "纽约" << "佛罗里达" << "伊利诺伊";
provinces["日本"] = QStringList() << "东京都" << "大阪府" << "北海道" << "爱知县" << "神奈川县";// 城市数据(按省份分组)
QMap<QString, QStringList> cities;
cities["北京"] = QStringList() << "北京市";
cities["上海"] = QStringList() << "上海市";
cities["广东"] = QStringList() << "广州市" << "深圳市" << "东莞市" << "佛山市";
cities["江苏"] = QStringList() << "南京市" << "苏州市" << "无锡市" << "常州市";
cities["浙江"] = QStringList() << "杭州市" << "宁波市" << "温州市" << "嘉兴市";
cities["加利福尼亚"] = QStringList() << "洛杉矶" << "旧金山" << "圣何塞" << "圣地亚哥";
cities["德克萨斯"] = QStringList() << "休斯顿" << "达拉斯" << "奥斯汀" << "圣安东尼奥";
cities["纽约"] = QStringList() << "纽约市" << "布法罗" << "罗切斯特" << "扬克斯";
cities["东京都"] = QStringList() << "东京" << "新宿" << "涩谷" << "品川";
cities["大阪府"] = QStringList() << "大阪" << "堺市" << "高槻市" << "东大阪市";
cities["北海道"] = QStringList() << "札幌" << "函馆" << "旭川" << "小樽";// 国家改变时更新省份
connect(countryCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),this, [=](int index){if (index < 0) return;QString country = countryCombo->currentText();provinceCombo->clear();cityCombo->clear();if (provinces.contains(country)) {provinceCombo->addItem("-- 请选择省份 --");provinceCombo->addItems(provinces[country]);} else {provinceCombo->addItem("-- 无可用省份 --");cityCombo->addItem("-- 无可用城市 --");}
});// 省份改变时更新城市
connect(provinceCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),this, [=](int index){if (index <= 0) { // 0 是 "-- 请选择省份 --"cityCombo->clear();cityCombo->addItem("-- 请选择城市 --");return;}QString province = provinceCombo->currentText();cityCombo->clear();if (cities.contains(province)) {cityCombo->addItem("-- 请选择城市 --");cityCombo->addItems(cities[province]);} else {cityCombo->addItem("-- 无可用城市 --");}
});
QHBoxLayout *hlayout_2 =new QHBoxLayout;
layout->addLayout(hlayout_2);
hlayout_2->addWidget(countryLabel);
hlayout_2->addWidget(countryCombo);
hlayout_2->addWidget(provinceLabel);
hlayout_2->addWidget(provinceCombo);
hlayout_2->addWidget(cityLabel);
hlayout_2->addWidget(cityCombo);

3 使用自定义模型和视图

QComboBox *comboBox3 =new QComboBox(this);
CustomComboModel *model = new CustomComboModel;
model->appendRow(new QStandardItem("Important Item"));
model->appendRow(new QStandardItem("Normal Item"));
comboBox3->setModel(model);
// 创建自定义视图(带复选框)
QListView *listView = new QListView;
listView->setSelectionMode(QAbstractItemView::MultiSelection);
comboBox3->setView(listView);
// 多选处理
connect(comboBox3, QOverload<int>::of(&QComboBox::activated), [=](int index){QModelIndex modelIndex = comboBox3->model()->index(index, 0);Qt::CheckState state = static_cast<Qt::CheckState>(modelIndex.data(Qt::CheckStateRole).toInt());comboBox3->model()->setData(modelIndex,state == Qt::Checked ? Qt::Unchecked : Qt::Checked,Qt::CheckStateRole);
});
layout->addWidget(comboBox3);class CustomComboModel : public QStandardItemModel
{Q_OBJECT
public:explicit CustomComboModel(QObject *parent = nullptr) : QStandardItemModel(parent) {}QVariant data(const QModelIndex &index, int role) const override {if (role == Qt::ForegroundRole && index.row() == 0) {return QColor(Qt::red); // 第一项显示为红色}return QStandardItemModel::data(index, role);}
};

4 完全自定义弹出窗口

CustomComboBox2 *Custom_ComboBox2 =new CustomComboBox2(this);
layout->addWidget(Custom_ComboBox2);

需要自己实现 showPopup()和hidePopup()

class CustomComboBox2 : public QComboBox {Q_OBJECT
public:CustomComboBox2(QWidget *parent = nullptr) : QComboBox(parent) {popup = new CustomComboPopup(this);connect(popup, &CustomComboPopup::selected, this, [this](const QString &text) {if (!text.isEmpty()) {qDebug()<<"selected text";clear();// 添加新的文本项addItem(text);// 设置当前索引为新添加的项(即第0项,因为clear后只添加了一项)setCurrentIndex(0);//setCurrentText(text);}});}protected:void showPopup() override {//QPoint pos = mapToGlobal(QPoint(0, height()));//popup->move(pos);//popup->resize(width(), 150); // 设置弹出窗口大小// 计算弹出位置(在组合框下方)QPoint pos = mapToGlobal(QPoint(0, height()));// 移动弹出窗口到正确位置popup->move(pos);// 设置弹出窗口宽度与组合框相同,高度自适应popup->resize(width(), popup->sizeHint().height());popup->show();}void hidePopup() override {// 隐藏弹出窗口if (popup && popup->isVisible()) {popup->hide();}}private:CustomComboPopup *popup;
};class CustomComboPopup : public QWidget
{Q_OBJECT
public:explicit CustomComboPopup(QWidget *parent = nullptr);signals:void selected(const QString &text);
};CustomComboPopup::CustomComboPopup(QWidget *parent)
:QWidget(parent)
{// 关键设置:必须设置窗口标志为 PopupsetWindowFlags(Qt::Popup);// 设置模态行为(可选,根据需求)setAttribute(Qt::WA_ShowWithoutActivating);QVBoxLayout *layout = new QVBoxLayout(this);QPushButton *btn1 = new QPushButton("Custom Button 1", this);QPushButton *btn2 = new QPushButton("Custom Button 2", this);QPushButton *btn3 = new QPushButton("Custom Button 3", this);layout->addWidget(btn1);layout->addWidget(btn2);layout->addWidget(btn3);connect(btn1, &QPushButton::clicked,this, [this]() {emit selected("Custom 1");hide();});connect(btn2, &QPushButton::clicked, [this]() { emit selected("Custom 2"); hide(); });connect(btn3, &QPushButton::clicked, [this]() { emit selected("Custom 3"); hide(); });setLayout(layout);// 设置合适的最小大小setMinimumSize(120, 100);
}

QComboBox类类使用效果

QComboBox类类使用效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96531.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目模块划分

项目模块划分 服务端模块&#xff1a; 持久化数据管理中心模块 在数据管理模块中管理交换机&#xff0c;队列&#xff0c;队列绑定&#xff0c;消息等部分数据数据。 \1. 交换机管理&#xff1a; a. 管理信息&#xff1a;名称&#xff0c;类型&#xff0c;是否持久化标志&#…

小白也能看懂!OpenCV 从零开始安装配置全教程(包含Windows / Ubuntu / 树莓派)系统详细操作配置教程

小白也能看懂&#xff01;OpenCV 从零开始安装配置全教程&#xff08;包含Windows / Ubuntu / 树莓派&#xff09;系统详细操作配置教程 摘要 本教程是面向“小白也能懂”的OpenCV安装与配置全攻略&#xff0c;涵盖Windows、Ubuntu和树莓派三大平台&#xff0c;真正实现“从零…

【华为云】容器镜像服务 SWR 详解:从上传下载到 ModelArts 应用

前言 华为云容器镜像服务&#xff08;Software Repository for Container&#xff0c;简称 SWR&#xff09;是华为云提供的企业级容器镜像仓库服务。它支持 Docker 镜像的存储、管理和分发&#xff0c;为容器化应用提供安全可靠的镜像托管服务。本文将详细介绍 SWR 的核心功能…

计算机网络知识点梳理(一)概述:组成、发展、性能、体系结构等

目录 一、互联网 &#xff08;1&#xff09;特点 &#xff08;2&#xff09;网络的组成 &#xff08;3&#xff09;网络、互连网、因特网 &#xff08;4&#xff09;互联网发展的三个阶段 &#xff08;5&#xff09;标准化 &#xff08;6&#xff09;组成 二、计算机网…

不同行业视角下的数据分析

声明&#xff1a;以下部分内容含AI生成 基于行业维度来划分数据分析岗位&#xff0c;可以帮助我们更好地理解不同行业对数据分析技能、业务知识和职业发展的独特要求。 目录 一、总体框架&#xff1a;为什么行业维度如此重要&#xff1f; 二、主要行业划分及详细讲解 1. 互联…

「CTF」青少年CTF·雏形系统

题目&#xff1a; 解题过程 尝试随便输入点什么&#xff0c;没有结果 使用dirsearch扫描网址目录 可以看到有扫描到一个www.zip&#xff0c;zip文件大概率有需要的东西 网址后加上www.zip就能对该文件进行下载 文件解压缩后如下 打开qsnctf.php&#xff0c;代码内容如下 <…

Java实战项目演示代码及流的使用

project 准备牌->洗牌->发牌 import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet;public class PokerGameplus {static HashMap<Integer,String> hs new HashMap<>();static ArrayList<Int…

使用 OpenLayers + 高德瓦片源实现旅游足迹地图

作为一个热爱旅行的开发者&#xff0c;我一直想要一个能够记录和展示自己旅游足迹的功能。市面上虽然有很多地图应用&#xff0c;但大多功能复杂&#xff0c;而我只需要一个简单直观的方式来标记去过的地方和想去的地方。 于是我决定在自己的个人网站上实现一个旅游足迹地图功…

Redis基础(含常用命令等以快速入门)

一、初步认识 1、NoSQL SQL 关系型数据库&#xff08;表结构&#xff0c;强一致&#xff09;NoSQL 非关系型数据库&#xff08;灵活结构&#xff0c;最终一致&#xff0c;水平扩展爽&#xff09; 维度SQL&#xff08;关系型&#xff09;NoSQL&#xff08;非关系型&#xf…

OSPF特殊区域、路由汇总及其他特性

OSPF路由器需要同时维护域内路由、域间路由、外部路由信息数据库。当网络规模不断扩大时&#xff0c;LSDB规模也不断增长。如果某区域不需要为其他区域提供流量中转服务&#xff0c;那么该区域内的路由器就没有必要维护本区域外的链路状态数据库。OSPF通过划分区域可以减少网络…

在缓存Cacheable注解中Key值如何使用常量

1.在常量类中定义商品缓存空间和商品缓存KEY public interface CacheConstants {/*** Goods Cache Name*/String QNA_GOODS_CACHE "qna-goods";/*** Goods Cache key*/String QNA_GOODS_CACHE_KEY "qna_goods:";/*** Order Cache Name*/String QNA_ORDER…

sklearn聚类

在此将sklearn官网的一张关于聚类算法比较的图片放过来。 下面的表格是根据sklearn官网翻译而来。 方法名称 参数 可扩展性 应用场景 几何度量(距离) MiniBatchKMeans 簇的数量 非常适合处理大量样本和中等数量的簇(使用MiniBatch时) 通用型,适用于簇大小均匀、几何形状平…

Recharts:React图表库,组件化设计助力高效数据可视化开发

你写前端项目时有没有卡过数据可视化的坑&#xff1f;比如要做个用户增长折线图&#xff0c;查了半天原生 JS 教程&#xff0c;写了几十行代码&#xff0c;结果要么坐标轴对不上&#xff0c;要么数据渲染不出来&#xff1b;或者用了某个图表库&#xff0c;文档全是英文&#xf…

Java 中String类的常用方法

Java 中的 String 类提供了丰富的方法用于字符串操作&#xff0c;以下是最常用的一些方法分类总结&#xff1a; 一、获取字符串信息length()&#xff1a;返回字符串长度&#xff08;字符个数&#xff09; String s "hello"; int len s.length(); // len 5charAt(i…

【记录】Docker|Docker内部访问LInux主机上的Ollama服务

部分内容参考自&#xff1a;使得 docker 容器内部可以访问宿主机的 ollama 服务_docker 访问 ollama-CSDN 博客&#xff0c;补充添加了更多的细节&#xff0c;也补充了一个更加简单的方案。 我测试的系统版本&#xff1a;Ubuntu 24.04.2 LTS noble&#xff0c;查看方式是指令 l…

数据库物理外键与逻辑外键全解析

一、核心概念 1. 物理外键 (Physical Foreign Key) 物理外键是数据库层面通过语法明确创建的外键约束。它是由数据库管理系统&#xff08;DBMS&#xff09;本身&#xff08;如 MySQL, PostgreSQL, Oracle&#xff09;来强制实现的。 它是什么&#xff1a;数据库表结构的一部分&…

Vue3入门到实战,最新版vue3+TypeScript前端开发教程,创建Vue3工程,笔记03

笔记03 一、创建Vue3项目 1.1、创建方式 使用vue-cli创建使用vite创建&#xff08;推荐&#xff09;Vue3官网创建项目文档 两种创建方式&#xff0c;推荐使用第二种。vue-cli是基于webpack实现的&#xff0c;vite是新一代前端构建工具。 2.1、vue3项目结构

企业如何利用群晖 NAS 构建高效数据备份与容灾体系

在数字化转型的过程中&#xff0c;企业数据已成为核心资产。然而&#xff0c;勒索病毒攻击、硬件故障、操作失误以及自然灾害等风险&#xff0c;都可能导致数据丢失甚至业务中断。如何构建一个高效、安全、可恢复的数据备份与容灾体系&#xff0c;已成为企业 IT 管理的关键课题…

关于在pycharm终端连接服务器

1、先为每个项目创建一个虚拟环境2、使用命令下载torchpip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple安装之后发现安装在了本地&#xff0c;我需要安装到服务器里面&#xff0c;此时可以把本地的删除&#xff0c;因为是默认安装到c盘&#xff0c;除非你指定路…

CSS 继承 (Inheritance)

一、核心概念CSS 继承是指某些 CSS 属性如果被设置在父元素上&#xff0c;其值会自动流向&#xff08;应用到&#xff09;其所有后代元素&#xff08;子、孙元素等&#xff09;的特性。核心价值&#xff1a;通过将样式声明应用于祖先元素&#xff0c;可以避免在所有后代元素上重…