一、概述
QComboBox 是 Qt 框架中用于向用户展示选项列表的控件,它能够在占用最少屏幕空间的同时,提供一个可以弹出选择项目的列表。组合框不仅显示当前选中的项目,还允许用户通过下拉列表选择其他项目。每个项目(或称列表项)除了可见的文本外,还可以关联一个 QVariant 类型的变量,用于存储一些不可见的数据。
二、常用属性
基本属性
- count:组合框中的项目数。
- currentData:当前项目的数据。
- currentIndex:当前项目的索引(第一项的索引为0)。
- editable:是否可以编辑组合框的内容,默认为 false。
- insertPolicy:可编辑时插入的项目应出现在组合框中的位置的策略,默认值为 InsertAtBottom,即新项目将出现在项目列表的底部。
- maxCount:组合框中允许的最大项目数。
- maxVisibleItems:组合框屏幕上允许的最大项目数,默认为10。
-
添加项目
addItem(const QString &text, const QVariant &userData = QVariant())
:向组合框添加一个文本项目,并可选地关联一个 QVariant 类型的用户数据。
addItem(const QIcon &icon, const QString &text, const QVariant &userData = QVariant())
:向组合框添加一个带有图标的文本项目,并可选地关联一个 QVariant 类型的用户数据。
默认显示
setCurrentIndex(int index)
:设置默认显示的项目索引。
currentIndex()
:获取当前显示的项目的索引。
三、常用方法
获取项目信息
currentText()
:返回当前项目的文本。currentData(int role = Qt::UserRole)
:返回当前项目的关联数据。itemText(int index)
:返回指定索引的项目的文本。itemData(int index, int role = Qt::UserRole)
:返回指定索引的项目的关联数据。count()
:返回组合框中的项目数。
插入与删除项目
insertItem(int index, const QString &text, const QVariant &userData = QVariant())
:在指定索引位置插入一个文本项目。insertItems(int index, const QStringList &texts)
:在指定索引位置插入多个文本项目。removeItem(int index)
:删除指定索引的项目。
设置与获取项目图标
setItemIcon(int index, const QIcon &icon)
:为指定索引的项目设置图标。itemIcon(int index)
:获取指定索引的项目的图标。
四、信号
当用户选择组合框中的不同项目时,QComboBox 会发出以下信号:
currentIndexChanged(int index)
:当前项目的索引发生变化时发出。currentIndexChanged(const QString &text)
:重载函数,当前项目的文本发生变化时发出(注意:这是两个重载信号)。currentTextChanged(const QString &text)
:当前项目的文本发生变化时发出。
五、使用示例
示例代码
#include <QComboBox>
// 假设ui->cBoxCity是已经在UI中定义的QComboBox
// 添加城市列表
QStringList cityList = {"北京", "上海", "广州", "深圳"};
ui->cBoxCity->addItems(cityList);
// 设置默认城市
ui->cBoxCity->setCurrentIndex(1); // 假设选择"上海"
// 获取当前城市
QString currentCity = ui->cBoxCity->currentText();
int currentIndex = ui->cBoxCity->currentIndex();
// 为城市列表中的项目添加图标
ui->cBoxCity->setItemIcon(0, QIcon(":/icons/beijing.png"));
ui->cBoxCity->setItemIcon(1, QIcon(":/icons/shanghai.png"));
// 响应选项变化
connect(ui->cBoxCity, &QComboBox::currentIndexChanged, [=](int index){
qDebug() << "City changed to:" << ui->cBoxCity->currentText();
});