【Qt开发】输入类控件(三)-> QComboBox

目录

[1 -> 概述](#1 -> 概述)

[2 -> 核心属性](#2 -> 核心属性)

[3 -> 核心方法](#3 -> 核心方法)

[4 -> 核心信号](#4 -> 核心信号)

[5 -> 基本功能特性](#5 -> 基本功能特性)

[6 -> 高级特性](#6 -> 高级特性)

[7 -> 适用场景](#7 -> 适用场景)

[8 -> 代码示例](#8 -> 代码示例)

[8.1 -> 使用下拉框模拟麦当当点餐](#8.1 -> 使用下拉框模拟麦当当点餐)

[8.2 -> 从文件中加载下拉框的选项](#8.2 -> 从文件中加载下拉框的选项)

[9 -> 总结](#9 -> 总结)


1 -> 概述

在图形用户界面设计中,如何在一个有限的空间内,为用户提供一个包含多个选项的集合,是一个经典的设计挑战。Qt 框架给出的答案之一,便是强大而灵活的 QComboBox(组合框)控件。它不仅仅是一个简单的下拉列表,更是 Qt "模型-视图"架构和高效人机交互理念的一个缩影。

QComboBox 的核心价值在于其空间效率。在非激活状态下,它仅以一个单行文本框或按钮的形式呈现,显示当前选中的项目。当用户需要做出选择时,通过点击触发,一个包含所有可选项目的列表会下拉展开。这种"按需展开"的交互模式,使其非常适合放置在拥挤的工具栏、表单或对话框之中,在不干扰主界面简洁性的前提下,容纳大量的选择可能性。

2 -> 核心属性

|------------------|-----------------------------------------------------------------------|
| 属性 | 说明 |
| currentText | 当前选中的文本 |
| currentIndex | 当前选中的条目下标 从 0 开始计算,如果当前没有条目被选中,值为 -1 |
| editable | 是否允许修改 设为 true 时,QComboBox 的行为就非常接近 QLineEdit,也可以设置 validator |
| iconSize | 下拉框图标(小三角)的大小 |
| maxCount | 最多允许有多少个条目 |

3 -> 核心方法

|------------------------------|----------------------------------------------|
| 方法 | 说明 |
| addItem(const QString&) | 添加一个条目 |
| currentIndex() | 获取当前条目的下标 从 0 开始计算,如果当前没有条目被选中,值为 -1 |
| currentText() | 获取当前条目的文本内容 |

4 -> 核心信号

|--------------------------------------------------------|-----------------------------------------------------------------|
| 方法 | 说明 |
| activated(int) activated(const QString &text) | 当用户选择了一个选项时发出 这个时候相当于用户点开下拉框,并且鼠标划过某个选项 此时还没有确认做出选择 |
| currentIndexChanged(int) | 当前选项改变时发出 此时用户已经明确的选择了一个选项 用户操作或者通过程序都会触发这个信号 |
| editTextChanged(const QString &text) | 当编辑框中的文本改变时发出 (editable 为 true 时有效) |

5 -> 基本功能特性

一个基础的 QComboBox 提供了以下关键功能:

  • 当前项显示与获取:始终清晰地标示出用户当前的选择,并允许程序轻松获取该值。

  • 可编辑性:这是一个至关重要的特性。开发者可以将其设置为可编辑模式。在此模式下,用户不仅可以从预定义列表中选择,还可以直接在文本框内输入自定义内容。这使得 QComboBox 兼具了选择器和文本输入框的双重角色,非常适合需要输入常用值或允许例外情况的场景。

  • 项目列表管理:开发者可以动态地添加、插入、修改或移除列表中的项目。每个项目不仅可以包含文本,还可以关联一个图标,以增强视觉辨识度。

6 -> 高级特性

QComboBox 的真正强大之处在于它与 Qt 框架核心思想的深度集成:

  1. 信号与槽机制:当组合框的当前选中项发生变化时,它会自动发出信号。开发者可以将其连接到任何自定义的槽函数上。这种松耦合的设计使得业务逻辑能对用户的选择做出即时响应,而无需编写繁琐的事件处理代码,是实现功能模块化的典范。

  2. 模型-视图架构的支持 :QComboBox 不仅仅是一个存储项目的简单容器。它可以作为一个视图,直接与一个外部的数据模型 绑定。这意味着列表的内容可以来自一个数据库查询的结果、一个文件系统的目录结构,或任何其他自定义的数据源。当底层数据发生变化时,组合框的显示会自动更新,极大地简化了数据驱动型界面的开发。

  3. 自定义视图:这是 QComboBox 最令人惊叹的特性之一。开发者可以为其下拉列表部分设置一个完全自定义的视图。你不再局限于显示简单的文本和图标列表,而是可以嵌入进度条、复选框,甚至是复杂的自定义控件。这彻底打破了传统下拉列表的形态,为实现高度定制化的用户界面提供了无限可能。

  4. 数据角色与存储:除了显示的文本,每个项目还可以通过"角色"关联多种类型的数据。例如,一个显示国家名称的项目,可以内部关联其国家代码、国旗图片、人口数据等。这使得在向用户展示友好文本的同时,程序内部可以处理更丰富、更结构化的信息。

7 -> 适用场景

QComboBox 体现了 Qt 的设计哲学:为开发者提供功能完备的基础构建块,同时保留极大的扩展性和灵活性。它既满足了"开箱即用"的快速开发需求,又能通过高级特性应对复杂和特殊的界面要求。

其典型的应用场景包括:

  • 设置与偏好:如语言选择、主题切换、单位设置等。

  • 数据筛选:如在表格上方选择要查看的类别或时间段。

  • 表单输入:如选择国家、省份、职业等具有固定选项集的信息。

  • 命令历史:在可编辑模式下,作为命令行或搜索框,保存用户的历史输入。

8 -> 代码示例

8.1 -> 使用下拉框模拟麦当当点餐

1. 在界面上创建三个下拉框,和一个按钮

objectName 为默认

2. 编写 widget.cpp,初始化三个下拉框内容

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->comboBox->addItem("原味双层深海鳕鱼堡");
    ui->comboBox->addItem("培根安格斯厚牛堡");
    ui->comboBox->addItem("巨无霸");
    ui->comboBox->addItem("麦辣鸡腿堡");

    ui->comboBox_2->addItem("中薯条");
    ui->comboBox_2->addItem("大薯条");
    ui->comboBox_2->addItem("玉米杯");

    ui->comboBox_3->addItem("柠柠海盐汽水");
    ui->comboBox_3->addItem("桃气冻冻汽水");
    ui->comboBox_3->addItem("夏黑葡萄汽水");
    ui->comboBox_3->addItem("雾粉荔枝汽水");

}

Widget::~Widget()
{
    delete ui;
}

3. 编写 widget.cpp,给按钮添加 slot 函数

cpp 复制代码
void Widget::on_pushButton_clicked()
{
    qDebug() << ui->comboBox->currentText() << ","
             << ui->comboBox_2->currentText() << ","
             << ui->comboBox_3->currentText();
}

4. 执行程序,可以看到,在点击确定按钮的时候,可以获取到当前下拉框中选中的内容

8.2 -> 从文件中加载下拉框的选项

很多时候下拉框的选项并非是固定的,而是通过读取文件/读取网络获取到的

1. 在界面上创建一个下拉框

2. 创建 config.txt,编写选项,每个选项占一行

3. 修改 widget.cpp,从文件中读取选项

  • 使用 ifstream 打开文件
  • 使用 getline 读取每一行
  • 使用 QString::fromStdString 把 std::string 转成 QString
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

#include <QDebug>
#include <fstream>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    std::ifstream file("E:\\Gitee_Qt\\qt-daily-learning\\QComboBox_2\\config.txt");
    if (!file.is_open())
    {
        qDebug() << "文件打开失败";
        return;
    }

    std::string line;
    while (std::getline(file, line))
    {
        ui->comboBox->addItem(QString::fromStdString(line));
    }

}

Widget::~Widget()
{
    delete ui;
}

4. 执行程序,可以看到,文件内容已经被加载到下拉框中

Qt 中也提供了 QFile 实现读写文件的功能。当然使用 C++ 标准库的 std::fstream 也是完全可以的。

之所以存在两套,是因为 Qt 诞生比较早(1991年左右),此时 C++ 还没有完成 "标准化" 的工作,C++ 标准库这样的概念自然也没有诞生。

因此 Qt 就自己打造了一套库,实现了字符串,容器,文件操作,多线程,网络操作,定时器,正则表达式等内容。

9 -> 总结

总而言之,QComboBox 在 Qt 控件家族中扮演着一个不可或缺的角色。它从一个简单的空间节约工具出发,通过其可编辑性、强大的信号与槽机制、对模型-视图架构的完美支持以及惊人的可定制能力,演变成了一个功能全面且极具表现力的界面元素。理解并善用 QComboBox,不仅能够构建出更加高效、专业的用户界面,更能深刻体会到 Qt 框架致力于提升开发效率与界面表现力的核心思想。它是在简洁与强大之间找到的一个完美平衡点。


感谢各位大佬支持!!!

互三啦!!!

相关推荐
用户805533698035 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner5 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz10 天前
QML Hello World 入门示例
qt
xcyxiner13 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner14 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner14 天前
DicomViewer (添加模型类)3
qt
xcyxiner15 天前
DicomViewer (目录调整) 2
qt
xcyxiner15 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00617 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术17 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript