[Qt 教程之Widgets模块] —— QComboBox 组合框

news2024/11/18 16:34:54

Qt系列教程总目录

文章目录

    • 一、创建QComboBox
    • 二、数据结构
    • 三、成员函数
      • 1. 添加选项
      • 2. 插入选项
      • 3. 删除选项
      • 4. 选项属性
      • 5. 当前选择的item
      • 6. 用户是否可编辑组合框
      • 7. 设置显示item的个数
      • 8. 组合框的item个数
      • 9. 添加重复的item
      • 10. 是否绘制边框
      • 11. 查找item
      • 12. 插入策略
      • 13. 大小调整策略
      • 14. 占位符文本
      • 15. 自定义数据模型

组合框 QComboBox即我们常用的下拉列表,如下是一些使用示例:

office word 中的字体字号设置、段落设置等,很普遍的使用了类似 QComboBox 的下拉列表。

在这里插入图片描述

在这里插入图片描述

QComboBox 不仅可以用于多选项选择,还节省屏幕空间。

一、创建QComboBox

他只有一个构造函数

QComboBox(QWidget *parent = nullptr);

使用时一般传入父级窗口对象指针。

二、数据结构

QComboBox 可以看做是一个类似列表的容器,列表每一项是一个item对象,该对象有类似 Map 的成员,Map包含类似texticonkey,并在value域存储对应的数据。

在这里插入图片描述

对于 key ,Qt有自己的枚举定义,如下:

enum ItemDataRole {
    DisplayRole = 0,
    DecorationRole = 1,
    EditRole = 2,
    ToolTipRole = 3,
    StatusTipRole = 4,
    WhatsThisRole = 5,
    // Metadata
    FontRole = 6,
    TextAlignmentRole = 7,
    BackgroundRole = 8,
    ForegroundRole = 9,
    CheckStateRole = 10,
    // Accessibility
    AccessibleTextRole = 11,
    AccessibleDescriptionRole = 12,
    // More general purpose
    SizeHintRole = 13,
    InitialSortOrderRole = 14,
    // Internal UiLib roles. Start worrying when public roles go that high.
    DisplayPropertyRole = 27,
    DecorationPropertyRole = 28,
    ToolTipPropertyRole = 29,
    StatusTipPropertyRole = 30,
    WhatsThisPropertyRole = 31,
    // Reserved
    UserRole = 0x0100
};

枚举说明如下:

常量描述value的数据类型
Qt::DisplayRole0要以文本形式呈现的数据QString
Qt::DecorationRole1要以图标形式呈现的数据QColor/QIcon/QPixmap
Qt::EditRole2适合在编辑器中编辑的数据QString
Qt::ToolTipRole3显示在item的工具提示中的数据QString
Qt::StatusTipRole4状态栏中显示的数据QString
Qt::WhatsThisRole5显示在项目的“what is this?”模式下的数据QString
Qt::FontRole6item的默认字体QFont
Qt::TextAlignmentRole7item的文本对齐方式Qt::Alignment
Qt::BackgroundRole8item的背景笔刷QBrush
Qt::ForegroundRole9item的前景笔刷(通常为文本颜色)QBrush
Qt::CheckStateRole10用于获取item的已检查状态Qt::CheckState
Qt::AccessibleTextRole11可访问性扩展和插件(如屏幕阅读器)要使用的文本QString
Qt::AccessibleDescriptionRole12出于可访问性目的对item的描述QString
Qt::SizeHintRole13提供给视图的项目的建议尺寸QSize
Qt::InitialSortOrderRole14获取页眉视图部分的初始排序顺序(Qt 4.8引入)Qt::SortOrder
Qt::DisplayPropertyRole27Qt内部使用-
Qt::DecorationPropertyRole28Qt内部使用-
Qt::ToolTipPropertyRole29Qt内部使用-
Qt::StatusTipPropertyRole30Qt内部使用-
Qt::WhatsThisPropertyRole31Qt内部使用-
Qt::UserRole0x0100存储用户数据由用户决定使用哪些类型,并确保组件在访问和设置数据时使用正确的类型

三、成员函数

1. 添加选项

void addItem(const QString &text, const QVariant &userData = QVariant());
void addItem(const QIcon &icon, const QString &text,
             const QVariant &userData = QVariant());
void addItems(const QStringList &texts){ insertItems(count(), texts); }

该函数在列表的末尾添加item,其中userData是用户数据,用户可以把 QComboBox 作为选择列表使用,也可以看作是类似 Map 的存储容器,在选择时操作用户自定义数据。

2. 插入选项

void insertItem(int index, const QString &text, const QVariant &userData = QVariant());
void insertItem(int index, const QIcon &icon, const QString &text,
                const QVariant &userData = QVariant());
void insertItems(int index, const QStringList &texts);

通过指定索引插入 item

3. 删除选项

void removeItem(int index);

通过指定索引删除 item

4. 选项属性

void setItemText(int index, const QString &text); // 设置item的文本
void setItemIcon(int index, const QIcon &icon); // 设置item的图标
void setIconSize(const QSize &size); // 设置item的图标尺寸
// 设置item的用户数据
void setItemData(int index, const QVariant &value, int role = Qt::UserRole);
void setMaxCount(int max); // 设置item的允许最大数量

QString itemText(int index) const; // 获取item的文本
QIcon itemIcon(int index) const; // 获取item的图标
QSize iconSize() const; // 获取item的图标尺寸
QVariant itemData(int index, int role = Qt::UserRole) const; // 获取item的用户数据
int count() const; // 获取item的数量
int maxCount() const; // 获取item的允许最大数量

5. 当前选择的item

int currentIndex() const;
QString currentText() const;
QVariant currentData(int role = Qt::UserRole) const;

获取当前选择的 item 的文本、图标和用户数据。

6. 用户是否可编辑组合框

bool isEditable() const;
void setEditable(bool editable);

下拉列表不仅可供选择,也可以让用户输入列表中没有的选项(默认不可编辑),如下图:

在这里插入图片描述

另外还有一个函数也可以实现组合框可编辑:

void setLineEdit(QLineEdit *edit);
QLineEdit *lineEdit() const;

他将行编辑框的编辑权赋予组合框,实际上在函数setEditable 内部也调用了 setLineEdit,如下:

在这里插入图片描述

7. 设置显示item的个数

int maxVisibleItems() const;
void setMaxVisibleItems(int maxItems);

一般情况下,下拉列表有多少 item 就会显示多少,如下:

在这里插入图片描述

item 过多,会显得不美观,可以通过该函数设置显示item的个数,如下设置最大显示个数为 5,其余会隐藏在滚动条中:

在这里插入图片描述

关于这个函数有一个很迷的现象,官方文档有如下描述:

在这里插入图片描述

对于不可编辑的组合框,QStyle::SH_ComboBox_Popup返回true,该属性将被忽略,例如 Mac styleGtk+ Style

然而,在 ubuntu 系统下,对于不可编辑的组合框,QStyle::SH_ComboBox_Popup返回 0,该属性仍然未生效;在windows 系统下,对于不可编辑的组合框,QStyle::SH_ComboBox_Popup返回 0,该属性生效。

如你知道原因欢迎评论区留言。

有图有真相:

Ubuntu下:

在这里插入图片描述

Windows下:

在这里插入图片描述

该问题可以通过以下方法规避,即使该属性在 Ubuntu 系统中生效:

方法一:设置组合框可编辑,setEditable(true);

方法二:设置setStyleSheet("QComboBox{combobox-popup:0;}");

8. 组合框的item个数

int count() const;	// 当前存储的item个数
void setMaxCount(int max);  // 设置允许存储的item最大个数
int maxCount() const; // 获取允许存储的item最大个数

如果设置的最大个数小于当前存储的个数,多余的item会被删除。

9. 添加重复的item

有时会在组合框中添加重复的项,如下:

在这里插入图片描述

有两种方式添加重复项,一种是通过代码(Qt总是允许通过代码添加重复项),如下:

ui->comboBox->addItem("item1");
ui->comboBox->addItem("item2");
ui->comboBox->addItem("item3");
ui->comboBox->addItem("item4");
ui->comboBox->addItem("item4");

第二种是用户编辑输入,但Qt默认不允许这种方式,需要设置属性:

bool duplicatesEnabled() const;
void setDuplicatesEnabled(bool enable);

10. 是否绘制边框

void setFrame(bool);
bool hasFrame() const;

11. 查找item

// 通过text查找
inline int findText(const QString &text, Qt::MatchFlags flags = static_cast<Qt::MatchFlags>(Qt::MatchExactly|Qt::MatchCaseSensitive)) const
{ return findData(text, Qt::DisplayRole, flags); }

// 通过data查找
int findData(const QVariant &data, int role = Qt::UserRole, Qt::MatchFlags flags = static_cast<Qt::MatchFlags>(Qt::MatchExactly|Qt::MatchCaseSensitive)) const;

可以发现 findText 也是通过 findData 实现的,所以对于其他属性的搜索,我们也可以通过 findData 实现,因为 findDatadata 参数是通用类型,使用时只需指定相应的 role 即可(role枚举见ItemDataRole)。

第三个参数 flags 定义了匹配方式,Qt::MatchFlags 枚举如下:

enum MatchFlag {
    MatchExactly = 0,
    MatchContains = 1,
    MatchStartsWith = 2,
    MatchEndsWith = 3,
    MatchRegularExpression = 4,
    MatchWildcard = 5,
    MatchFixedString = 8,
    MatchTypeMask = 0x0F,
    MatchCaseSensitive = 16,
    MatchWrap = 32,
    MatchRecursive = 64
};

枚举成员描述如下:

常量描述
Qt::MatchExactly0搜索词与item的完全匹配
Qt::MatchContains1搜索词包含在item中
Qt::MatchStartsWith2搜索词与item的开头匹配
Qt::MatchEndsWith3搜索词与item的结尾匹配
Qt::MatchRegularExpression4使用正则表达式作为搜索项执行基于字符串的匹配。
Qt::MatchWildcard5使用带有通配符的字符串作为搜索词,执行基于字符串的匹配。
Qt::MatchFixedString8执行基于字符串的匹配。除非同时指定MatchCaseSensitive标志,否则基于字符串的比较不区分大小写。
Qt::MatchCaseSensitive16搜索区分大小写。
Qt::MatchWrap32执行一个环绕的搜索,这样,当搜索到达模型中的最后一个项目时,它会从第一个项目开始,并一直持续到检查完所有项目为止。
MatchRecursive64搜索整个层次结构。

注意:Qt::MatchExampleteQt::MatchContainsQt::MatchStartsWithQt::MatchEndsWithQt::MatchRegularExpressionQt::MatchWildcardQt::MatchFixedString 是互斥的,Qt还不支持通过 Qt::MatchFlags 参数同时设置多个。

12. 插入策略

当组合框可编辑,用户可以通过手动输入来添加item,这时新的item 插入到哪里,由枚举 InsertPolicy指定,默认为 InsertAtBottom在下方新增,使用如下方法设置插入策略:

InsertPolicy insertPolicy() const;
void setInsertPolicy(InsertPolicy policy);

InsertPolicy枚举如下:

enum InsertPolicy {
    NoInsert,
    InsertAtTop,
    InsertAtCurrent,
    InsertAtBottom,
    InsertAfterCurrent,
    InsertBeforeCurrent,
    InsertAlphabetically
};

说明如下:

常量描述
QComboBox::NoInsert0字符串不会插入到组合框中
QComboBox::InsertAtTop1字符串会被插入到组合框的第一个位置
QComboBox::InsertAtCurrent2当前选择的item会被新的字符串覆盖
QComboBox::InsertAtBottom3字符串会被插入到组合框的最后一个位置
QComboBox::InsertAfterCurrent4字符串会被插入到当前选择的后一个位置
QComboBox::InsertBeforeCurrent5字符串会被插入到当前选择的前一个位置
QComboBox::InsertAlphabetically6字符串按字母顺序插入组合框中

13. 大小调整策略

由于不同item的内容长度不同,组合框的大小调整会有一定策略,默认 AdjustToContentsOnFirstShow,使用如下函数设置该策略:

SizeAdjustPolicy sizeAdjustPolicy() const;
void setSizeAdjustPolicy(SizeAdjustPolicy policy);

策略枚举如下:

enum SizeAdjustPolicy {
    AdjustToContents,
    AdjustToContentsOnFirstShow,
    AdjustToMinimumContentsLengthWithIcon
};

说明如下:

常量描述
QComboBox::AdjustToContents0始终根据item内容进行调整,以使其全部显示
QComboBox::AdjustToContentsOnFirstShow1组合框将在第一次显示时根据item内容进行调整
QComboBox::AdjustToMinimumContentsLengthWithIcon2组合框将调整为最小内容长度加上图标空间。使用该策略,需要考虑性能问题

其中MinimumContentsLengthiconSize都可以另外设置,方法如下:

int minimumContentsLength() const; // 默认为0
void setMinimumContentsLength(int characters);
QSize iconSize() const;
void setIconSize(const QSize &size);

14. 占位符文本

当组合框没有任何 item 时,可以添加占位符文本,以使组合框显示不为空,如下:

在这里插入图片描述

当然,占位符是灰色的不可被选择的。

方法接口如下:

void setPlaceholderText(const QString &placeholderText);
QString placeholderText() const;

15. 自定义数据模型

组合框除了显示为下拉列表,也可以显示自定义的数据模型,比如树或表格,相关方法如下:

QAbstractItemModel *model() const;
virtual void setModel(QAbstractItemModel *model); // 将自定义的数据模型添加到组合框

QModelIndex rootModelIndex() const;
void setRootModelIndex(const QModelIndex &index); // 设置项目的根模型项目索引

int modelColumn() const;
// 设置模型可见列。如果在填充组合框之前设置,则视图不受影响,将显示第一列(使用此属性的默认值0)。
void setModelColumn(int visibleColumn);

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

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

相关文章

NodeJS LocalDomainName⑩④

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言 L o c a l D o m a i n N a m e LocalDomainName LocalDomainName 本地域名 O p e r a t i o n P r o c e d u r e OperationProcedure OperationProced…

【MySQL】一文带你了解过滤数据

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

LAMP架构搭建

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Apache服务1.apache概述2.apache的特点3.apache的软件版本4.编译安装优点5.安装步骤 二、LAMP简介与概述1.LAMP平台概述2.构建LAMP平台顺序3.各组件的主要作用 …

KafKa 3.x(一、入门)

前置&#xff1a;熟悉javase&#xff0c;熟悉linux&#xff0c;熟悉idea&#xff0c;熟悉hadoop 1. KafKa 1.1 KafKa定义 前端埋点记录用户&#xff08;浏览&#xff0c;点赞&#xff0c;收藏&#xff0c;评论&#xff09;到日志服务器&#xff0c;然后通过Flume&#xff08…

k8s Service服务详解

1. Service 的概念&#xff1a; k8s中Service定义了这样一种抽象&#xff1a;一个pod的逻辑分组&#xff0c;一种可以访问他们的策略—通常称为微服务。这一组pod能够被Service访问到&#xff0c;通常是通过Label Selector Service能够提供负载均衡的能力&#xff0c;但是在使…

第二章 逻辑代数基础--数电(期末复习笔记)

第二章 逻辑代数基础 2.1 概述 逻辑&#xff1a;事物间的因果关系。 逻辑运算&#xff1a;逻辑状态按照指定的某种因果关系进行推理的过程。 逻辑变量&#xff1a;用字母表示&#xff0c;取值只有0和1。此时&#xff0c;0和1不再表示数量的大小&#xff0c;只代表两种不同的状…

人工智能期末复习(简答)

第1章 人工智能概述 1.什么是人工智能&#xff1f; 人工智能&#xff08;Artificial Intelligence, AI&#xff09;,又称机器智能&#xff08;MI&#xff0c;Machine Intelligence&#xff09;&#xff0c; 主要研究用人工的方法和技术开发智能机器或智能系统&#xff0c;以模…

交换机配置DHCP服务(华为交换机)

#三层交换机互联互通 配置 #进入系统视图 <Huawei>system-view #关闭系统提示信息 [Huawei]undo info-center enable #启动DHCP功能 [Huawei]dhcp enable #创建vlan 10 并配置 vlanif 地址 [Huawei]vlan 10 [Huawei-vlan10]int vlanif 10 [Huawei-Vlanif10]ip addr…

软考A计划-网络工程师-专业英语

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

初识轻量级分布式任务调度平台 xxl-job

文章目录 前言xxl-job的目录结构项目依赖 (父 pom.xml)xxl-job-admin 启动xxl-job-executor-sample (项目使用示例)xxl-job-executor-sample-frameless : 不使用框架的接入方式案例xxl-job-executor-sample-springboot : springboot接入方案案例 xxl-job执行器器启动流程分析调…

python高效使用方法03_pandas中的rolling.mean滚动求均值效率究竟如何?

先上图来说明pandas.rolling(n).mean()滚动求均值的方法效率其实并不是最高的&#xff0c;我自己尝试使用cython把滚动求均值的方法重新编译了一下&#xff0c;发现效率总体上是pandas的三倍以上。 总结&#xff1a;pandas比较合适用于普通的研究分析工作&#xff0c;如果用到追…

AcWing802:详解

原题引出 题解分析 首先毫无置疑的是本体需要用到离散化的知识&#xff0c;将输入的索引下标放到一个vector当中存起来&#xff0c;在该vector当中&#xff0c;利用其本身的索引我们对称构造两个数组a和s&#xff08;用于求前缀和&#xff09;。那么最关键的一个问题就是如何通…

NodeJS Socket编程⑩③

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言Socket编程1、WebSocket VS HTTP请求2、浏览器支持3、WebSocket Practice4、WebSocket 授权验证5、SocketIO模块 &#x1f5e1; Express~WebSokcetIOServ…

Java中不支持多重继承原因

在 Java 中回答这种棘手问题的关键是准备好相关主题, 以应对后续的各种可能的问题。 这是非常经典的问题&#xff0c;与为什么 String 在 Java 中是不可变的很类似; 这两个问题之间的相似之处在于它们主要是由 Java 创作者的设计决策使然。 为什么Java不支持类多重继承, 可以考…

UML基本图例

UML基本图例 软件流程和UML基本图例软件流程&#xff1a;下面是九种常用的UML图&#xff1a;1.用例图&#xff08;UseCase Diagrams&#xff09;2.类图&#xff08;Class Diagram&#xff09;3.对象图&#xff08;Object Diagrams&#xff09;4.状态图&#xff08;Statechart D…

6道常见hadoop面试题

Q1.什么是Hadoop&#xff1f;   Hadoop是一个开源软件框架&#xff0c;用于存储大量数据&#xff0c;并发处理/查询在具有多个商用硬件&#xff08;即低成本硬件&#xff09;节点的集群上的那些数据。总之&#xff0c;Hadoop包括以下内容&#xff1a;   HDFS&#xff08;Ha…

Chiplet技术概览

一、概览 chiplet技术顺应了芯片生产与集成技术发展的趋势&#xff0c;也开拓了半导体技术发展的新的发展方向&#xff0c;将创造出一种新的芯片设计和商业模式 1.1 芯片生产与集成技术发展的趋势 &#xff08;1&#xff09;低半径高带宽的物理连线(bandwidth / memory wall…

打开win10“启动”文件夹的2种方式

方式1&#xff1a;通过CMD命令 1.输入代码 按WinR键打开运行窗口&#xff0c;输入“shell:Common Startup”代码。 2.点击确定 点击下面的确定按钮&#xff0c;运行代码。 3.打开文件夹 弹出文件夹即为系统启动文件夹。 方式2&#xff1a;输入路径 1.打开文件管理器 打…

【城市开发者职业成长交流 - 重庆】加强交流,共创成长:重庆程序员的线下交流会总结

周五睡觉前&#xff0c;我把窗帘拉的严严实实&#xff0c;所有的闹钟全部取消&#xff0c;甚至另外一只电话直接关机掉&#xff0c;为的是第二天可以好好的躺到自然醒&#xff0c;我其实也不知道具体的几点&#xff0c;就感觉连上被踩&#xff01;无奈的睁开眼睛&#xff0c;看…

基于WEB的院校课程管理系统设计与实现(论文+源码)_kaic

摘要 课程管理是学校管理工作的核心&#xff0c;是最为繁琐也最容易出错的工作&#xff0c;开发和 应用课程管理系统能够让课程管理工作人员从繁琐的工作中解脱出来&#xff0c;提高课程 管理的工作效率[1]&#xff0c;实现课程管理的信息化。虽然目前高职院校应用的课程管理系…