介绍

QComboBox是Qt框架中的一个控件,它提供了一个下拉列表,在列表中显示多个选项供用户选择。下面是对QComboBox的描述:

QComboBox可以看作是一个可编辑的组合框控件,由两个主要部分组成:下拉按钮和下拉列表。

  • 下拉按钮:位于QComboBox控件的右侧,通常显示当前被选中的选项或者默认的提示文本。当用户点击下拉按钮时,下拉列表会展开或收起。
  • 下拉列表:包含多个选项,在默认情况下,只有选中的选项在下拉按钮处显示。当用户点击下拉按钮时,下拉列表会展开,显示所有选项供用户选择。

QComboBox具有以下特性:

  1. 可编辑性:用户可以手动输入文本,不仅可以从下拉列表中选择,还可以直接输入符合要求的文本。
  2. 多选项:下拉列表可以包含多个选项,用户可以从中选择一个或多个选项。
  3. 信号与槽机制:QComboBox可以发出信号来响应用户的选择或编辑操作,通过连接相应的槽函数,可以在用户选择某个选项或编辑文本时执行自定义的逻辑。
  4. 样式定制:可以根据需求自定义QComboBox的外观样式,包括下拉按钮的图标、颜色、边框等。

QComboBox常用于用户界面中需要提供多个选项供选择的场景,例如选择语言、选择字体、选择颜色等。它提供了一种直观且交互友好的方式来展示选项,并且具有灵活性和可扩展性,可以通过自定义模型来加载选项数据,满足不同的需求。

接口及作用

QComboBox类提供了多个接口(方法)来操作和管理下拉列表,以及获取和设置与下拉列表相关的属性。以下是一些常用的QComboBox接口及其作用:

  1. addItem(const QString& text, const QVariant& userData = QVariant()):向下拉列表添加一个新的文本项,并可选择关联的用户数据。
  2. insertItem(int index, const QString& text, const QVariant& userData = QVariant()):在指定的位置插入一个新的文本项,并可选择关联的用户数据。
  3. removeItem(int index):从下拉列表中移除指定位置的文本项。
  4. clear():清空下拉列表中的所有文本项。
  5. setCurrentIndex(int index):设置当前选中的项索引。
  6. currentIndex():返回当前选中的项索引。
  7. currentText():返回当前选中的文本项。
  8. count():返回下拉列表中的文本项数量。
  9. itemText(int index):返回指定索引处的文本项。
  10. itemData(int index):返回指定索引处的用户数据。
  11. setEditable(bool editable):设置下拉列表是否可编辑。
  12. isEditable():返回下拉列表是否可编辑的状态。
  13. setModel(QAbstractItemModel* model):设置使用自定义数据模型来填充下拉列表。
  14. model():返回当前使用的数据模型。
  15. activated(int index):当用户选择某个项时发出的信号,可连接槽函数执行响应操作。
  16. currentIndexChanged(int index):当当前选中项改变时发出的信号,可连接槽函数执行响应操作。

通过这些接口,可以动态地向下拉列表添加、插入和移除文本项,设置和获取当前选中项的索引和文本,管理下拉列表的可编辑性,以及使用自定义数据模型来填充下拉列表。同时,通过与信号和槽机制配合使用,可以实现对用户选择或编辑事件做出响应,并执行相应的操作。

QCompleter的用法

QCompleter 是 Qt 框架中的一个类,用于为用户提供自动完成(Autocompletion)功能。它可以与 QLineEdit、QComboBox、QPlainTextEdit 等控件一起使用,以便在用户输入时提供匹配的建议。

QCompleter 可以根据提供的模型来查找并过滤与用户输入匹配的项。它支持多种匹配模式,例如前缀匹配、后缀匹配、包含匹配等。

要使用 QCompleter,首先需要创建一个数据模型(例如 QStringListModel 或 QSqlQueryModel),该模型包含了要进行自动完成的所有项。然后,通过将该数据模型传递给 QCompleter 的构造函数,来创建一个 QCompleter 的实例。

在将 QCompleter 与文本输入控件关联后,当用户在控件中输入文字时,QCompleter 将根据输入内容自动显示匹配的建议。用户可以通过键盘上下方向键或鼠标选择建议列表中的项,然后按下回车键或单击以将建议的项插入到文本输入控件中。

除了基本的自动完成功能外,QCompleter 还提供了一些高级特性,例如自定义过滤器和排序器、设置最大建议数、限制匹配模式等。这些功能可以通过 QCompleter 的方法和属性进行配置。

总之,QCompleter 提供了一种简单而强大的方式来实现自动完成功能,使得用户在输入文本时可以更快地找到和选择匹配的选项。

userData的用法

在 QComboBox 中,每个下拉项都可以关联一个用户数据(user data)。用户数据是与下拉项相关联的自定义值,可以是任何类型的对象或数据。QComboBox 提供了一些方法来添加、获取和操作用户数据。

通过将用户数据与下拉项关联起来,可以在选择下拉项时轻松地获取这些数据,从而实现更灵活和个性化的功能。下面是一些使用用户数据的常见情况:

  1. 数据存储:用户数据允许您将自定义数据附加到每个下拉项。这可以用于将某些特定的标识符、整数值、枚举等与下拉项相关联。当用户选择某个下拉项时,您可以根据用户数据快速访问并处理所需的数据。

  2. 数据筛选和匹配:用户数据提供了一种在 QComboBox 中进行高级过滤和匹配的方式。您可以根据用户数据进行筛选和排序,以便将下拉项按照特定的顺序或条件进行显示。此外,用户数据还可以用于自定义搜索功能,以便根据特定的字段或属性进行匹配。

  3. 上下文信息:用户数据可以用于保存与下拉项相关的上下文信息。例如,您可以将对象或数据结构与每个下拉项关联,以便在选择下拉项时获取相应的上下文信息,并在后续的操作中使用。

总之,QComboBox 中的用户数据提供了一种将自定义数据关联到下拉项并在选择时使用的机制。通过使用用户数据,您可以为每个下拉项提供更多的上下文信息和功能,以满足特定的需求。

代码示例-基本用法

演示QComboBox的基础功能。下面代码的功能是创建一个主窗口,其中包含一个下拉列表控件。它演示了如何设置下拉列表的选项、获取当前选中项的索引和文本、设置下拉列表的可编辑状态以及监听用户选择的事件。

#include <QApplication>
#include <QtWidgets>

#if 1
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // 创建主窗口
    QMainWindow mainWindow;

    //
    QWidget *widget = new QWidget(&mainWindow);
    widget->setGeometry(100,100,300,50);
    QHBoxLayout *layout = new QHBoxLayout(widget);

    // 创建下拉列表控件
    QComboBox *comboBox = new QComboBox(widget);
    comboBox->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);

    layout->addWidget(comboBox);

    // 向下拉列表添加选项,并关联用户数据
    comboBox->addItem("Option 1", QVariant(1));
    comboBox->addItem("Option 2", QVariant(2));
    comboBox->addItem("Option 3", QVariant(3));

    // 设置当前选中项
    comboBox->setCurrentIndex(1);  // 选中 "Option 2"

    // 获取当前选中项的索引和文本
    int currentIndex = comboBox->currentIndex();  // 返回 1
    QString currentText = comboBox->currentText();  // 返回 "Option 2"

    // 输出当前选中项的索引和文本
    qDebug() << "Current Index: " << currentIndex;
    qDebug() << "Current Text: " << currentText;

    // 设置下拉列表是否可编辑
    comboBox->setEditable(true);

    // 模拟用户进行编辑
    comboBox->setEditText("Custom Option");

    // 获取当前编辑的文本
    QString editedText = comboBox->currentText();  // 返回 "Custom Option"

    // 输出当前编辑的文本
    qDebug() << "Edited Text: " << editedText;

    QObject::connect(comboBox, QOverload<int>::of(&QComboBox::activated), [comboBox](int index){
        qDebug() << "Selected Option: " << comboBox->itemText(index);
    });


    mainWindow.show();

    mainWindow.resize(500,300);

    return app.exec();
}
#endif

代码示例-用户数据

下面代码演示两个功能:用户数据获取;根据用户数据设置当前显示项。

创建一个主窗口,其中包含两个 QComboBox,它们之间的选择状态是相互关联的。

当用户在其中一个 QComboBox 中选择一个项时,另一个 QComboBox 会根据该选项的用户数据自动选择相应的项。通过这种方式,可以实现两个 QComboBox 之间的联动效果。

#include <QApplication>
#include <QComboBox>
#include <QDebug>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMainWindow>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // 创建主窗口
    QMainWindow mainWindow;

    // 创建两个 QComboBox
    QComboBox comboBox1;
    QComboBox comboBox2;

    // 添加下拉项和用户数据到 comboBox1
    comboBox1.addItem("Option 1", 100);
    comboBox1.addItem("Option 2", 200);
    comboBox1.addItem("Option 3", 300);

    comboBox2.addItem("Option A", 100);
    comboBox2.addItem("Option B", 200);
    comboBox2.addItem("Option C", 300);

    // 获取 comboBox1 用户数据的槽函数
    QObject::connect(&comboBox1, QOverload<int>::of(&QComboBox::currentIndexChanged), [&comboBox1, &comboBox2](int index){
        int userData = comboBox1.itemData(index).toInt();
        qDebug() << "User Data from comboBox1: " << userData;

        int dataIndex = comboBox2.findData(userData);
        comboBox2.setCurrentIndex(dataIndex);
    });

    // 获取 comboBox2 用户数据的槽函数
    QObject::connect(&comboBox2, QOverload<int>::of(&QComboBox::currentIndexChanged), [&comboBox1, &comboBox2](int index){
        int userData = comboBox2.itemData(index).toInt();
        qDebug() << "User Data from comboBox2: " << userData;

        int dataIndex = comboBox1.findData(userData);
        comboBox1.setCurrentIndex(dataIndex);

    });

    // 创建布局
    QVBoxLayout layout;
    layout.addWidget(&comboBox1);
    layout.addWidget(&comboBox2);

    // 创建中心窗口部件,并应用布局
    QWidget* centralWidget = new QWidget(&mainWindow);
    centralWidget->setLayout(&layout);

    // 设置中心窗口部件
    mainWindow.setCentralWidget(centralWidget);
    mainWindow.show();

    return app.exec();
}

代码示例-筛选下拉项

演示如何在QComboBox中使用QCompleter来进行下拉项的筛选。

#include <QApplication>
#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // 创建主窗口
    QMainWindow mainWindow;
    QWidget *widget = new QWidget(&mainWindow);
    widget->setGeometry(100,100,300,50);
    QHBoxLayout *layout = new QHBoxLayout(widget);


    // 创建下拉列表控件
    QComboBox *comboBox = new QComboBox(widget);
    comboBox->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
    // 设置下拉列表为可编辑状态
    comboBox->setEditable(true);

    //加入布局
    layout->addWidget(comboBox);

    // 将下拉项添加到模型
    QStringList dataList;  // 存储 300 个下拉项
    for (int i = 0; i < 26; ++i) {
        for (int j = 0; j < 12; ++j) {
            dataList << QString(QChar('A' + i)) + QString::number(j + 1);
        }
    }

    comboBox->addItems(dataList);//comboBox加下拉项

    // 创建QCompleter对象
    QCompleter *completer = new QCompleter(comboBox);
    completer->setCaseSensitivity(Qt::CaseInsensitive);
    completer->setCompletionMode(QCompleter::PopupCompletion);

    // 设置QComboBox的自动完成器
    comboBox->setCompleter(completer);

    // 设置QCompleter的模型为QComboBox的模型
    completer->setModel(comboBox->model());

    // 设置QCompleter的过滤器模式为Qt::MatchContains
    completer->setFilterMode(Qt::MatchContains);

    // 将下拉列表添加到主窗口
    //mainWindow.setCentralWidget(comboBox);
    mainWindow.resize(400, 300);
    mainWindow.show();

    return app.exec();
}

运行后,输入12,可筛选出所有的带12的下拉项:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐