QComboBox(组合框)是Qt中集成了按钮、下拉列表和编辑功能的控件
- 点击箭头时,会显示出可供选择的项目列表,用户可以从列表中选择一个选项
- 当不展开下拉列表时,仅显示当前选定项的文字
它常用于提供一种紧凑的方式来展示可选项列表,占用较少的屏幕空间。
1. 效果演示
当改变了姓名/学校/省份/城市后,结果也会动态更新,如下:
2. 属性和方法
QComboBox有很多属性,完整的可查看帮助文档。这里列出常用的属性和方法:
2.1 文本
当前组合框中当前项的索引和文本
// 获取当前条目的索引和文本
int currentIndex() const
QString currentText() const
// 获取和设置指定索引条目的文本
QString itemText(int index) const
void setItemText(int index, const QString &text)
2.2 图标
给条目添加图标
// 获取和设置对应索引条目的图标
QIcon itemIcon(int index) const
void setItemIcon(int index, const QIcon &icon)
2.3 插入和删除
可以向组合框中插入和删除项目,插入时还可以指定插入的策略
- 新增条目
可以一次新增一个条目,也可以一次新增多个条目
// 一次新增一个条目
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)
- 插入条目
可以一次插入一个条目,也可以一次插入多个条目
// 一次插入一个条目
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 &list)
在插入条目时,还可以指定插入的策略
// 获取和设置插入策略
QComboBox::InsertPolicy insertPolicy() const
void setInsertPolicy(QComboBox::InsertPolicy policy)
常用的插入策略有:
| 插入策略 | 含义 |
|---|---|
| QComboBox::NoInsert | 不插入 |
| QComboBox::InsertAtTop | 作为第一条条目插入(替换原第一条条目) |
| QComboBox::InsertAtCurrent | 替换当前条目 |
| QComboBox::InsertAtBottom | 在最后一个条目之后插入 |
| QComboBox::InsertAfterCurrent | 在当前条目之后插入 |
| QComboBox::InsertBeforeCurrent | 在当前条目之前插入 |
| QComboBox::InsertAlphabetically | 按英文字母顺序插入 |
- 插入分隔符
用于在条目之间插入一条分隔符
// 在指定索引位置处插入分隔符
void insertSeparator(int index)
- 删除条目
删除指定索引位置的条目
// 删除指定索引的条目
void removeItem(int index)
2.4 信号槽
// 当前选中的条目变化时,会发射这两个信号
void currentIndexChanged(int index)
void currentTextChanged(const QString &text)
3. 从零实现
从零写代码实现整体效果,以演示组合框的属性以及信号槽的用法
3.1 布局
在UI设计师界面,拖拽对应的控件,修改显示的文字、控件的名称,然后完成布局
3.2 代码实现
3.2.1 初始化数据
首先,为学校组合框添加条目
双击学校组合框,或者在学校组合框上右键 -> Edit Items…,在打开的编辑窗口中可以增加删除条目,如下:
然后,来到mywidget.cpp构造中,初始化省份和城市组合框数据,如下:
QList<QStringList> cities = {{"广州市", "深圳市", "珠海市", "东莞市"}, // 广东省
{"杭州市", "宁波市", "温州市", "绍兴市"}, // 浙江省
{"济南市", "青岛市", "潍坊市", "烟台市"}, // 山东省
{"南京市", "苏州市", "扬州市", "宿迁市"}}; // 江苏省
MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {
ui->setupUi(this);
this->setWindowTitle("明王讲QT | 第二章 常用控件 | 2.7 组合框QComboBox");
this->setStyleSheet("QWidget { font-size: 18px; }");
// 添加省份
ui->comboProvince->addItem("广东省");
ui->comboProvince->addItem("浙江省");
ui->comboProvince->addItem("山东省");
ui->comboProvince->addItem("江苏省");
// 为省份条目添加图标
ui->comboProvince->setItemIcon(0, QIcon(":/icon/apple.ico"));
ui->comboProvince->setItemIcon(1, QIcon(":/icon/banana.ico"));
ui->comboProvince->setItemIcon(2, QIcon(":/icon/orange.ico"));
ui->comboProvince->setItemIcon(3, QIcon(":/icon/peach.ico"));
// 默认选中第一项-广东省
ui->comboProvince->setCurrentIndex(0);
// 添加城市
ui->comboCity->addItems(cities[0]);
}
3.2.2 实现信号槽
首先,在mywidget.h中添加槽函数,如下:
class MyWidget : public QWidget {
private slots:
void updateInfo(int index);
void onLineEditChanged(QString s);
};
然后,来到mywidget.cpp中实现这两个槽函数
void MyWidget::updateInfo(int index) {
// 1. 如果是省份组合框,需要先清空城市组合框在添加
QObject* obj = sender(); // 返回一个指向发送信号对象的指针
if ( obj ) {
QComboBox* combo = qobject_cast<QComboBox*>(obj);
if ( combo == ui->comboProvince ) {
ui->comboCity->clear();
ui->comboCity->addItems(cities[index]);
}
}
// 2. 获取姓名、大学、省份、城市
QString name = ui->lineEditName->text();
QString university = ui->comboUniversity->currentText();
QString province = ui->comboProvince->currentText();
QString city = ui->comboCity->currentText();
// 3. 显示
ui->lineEditResult->setText(name + ", 毕业于" + university + ", 来自" + province + city);
}
void MyWidget::onLineEditChanged(QString s) { // 获取姓名、大学、省份、城市
QString name = ui->lineEditName->text();
QString university = ui->comboUniversity->currentText();
QString province = ui->comboProvince->currentText();
QString city = ui->comboCity->currentText();
ui->lineEditResult->setText(name + ", 毕业于" + university + ", 来自" + province + city);
}
最后,在构造函数中关联信号槽,如下:
MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {
//...
// 信号槽
connect(ui->comboUniversity, &QComboBox::currentIndexChanged, this, &MyWidget::updateInfo);
connect(ui->comboProvince, &QComboBox::currentIndexChanged, this, &MyWidget::updateInfo);
connect(ui->comboCity, &QComboBox::currentIndexChanged, this, &MyWidget::updateInfo);
connect(ui->lineEditName, &QLineEdit::textChanged, this, &MyWidget::onLineEditChanged);
ui->lineEditName->setText("张三");
}
4. 点赞、获取源码
看到这里的小伙伴,去B站给明王一个【免费的点赞】吧,你的支持,是我持续更新优质内容的动力,感谢~
源码下载地址
链接: https://pan.baidu.com/s/1FbUn82NM37vnvu9gEGHLKA
提取码: ming







