QComboBox(组合框)是Qt中集成了按钮、下拉列表和编辑功能的控件

  • 点击箭头时,会显示出可供选择的项目列表,用户可以从列表中选择一个选项
  • 当不展开下拉列表时,仅显示当前选定项的文字

它常用于提供一种紧凑的方式来展示可选项列表,占用较少的屏幕空间。

1. 效果演示

当改变了姓名/学校/省份/城市后,结果也会动态更新,如下:
combo

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设计师界面,拖拽对应的控件,修改显示的文字、控件的名称,然后完成布局
qt-base

3.2 代码实现

3.2.1 初始化数据

首先,为学校组合框添加条目
双击学校组合框,或者在学校组合框上右键 -> Edit Items…,在打开的编辑窗口中可以增加删除条目,如下:
qt-base

然后,来到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