QComboBox是Qt框架中的一个控件,它提供了一个下拉列表,在列表中显示多个选项供用户选择。下面是对QComboBox的描述:
QComboBox可以看作是一个可编辑的组合框控件,由两个主要部分组成:下拉按钮和下拉列表。
QComboBox具有以下特性:
QComboBox常用于用户界面中需要提供多个选项供选择的场景,例如选择语言、选择字体、选择颜色等。它提供了一种直观且交互友好的方式来展示选项,并且具有灵活性和可扩展性,可以通过自定义模型来加载选项数据,满足不同的需求。
QComboBox类提供了多个接口(方法)来操作和管理下拉列表,以及获取和设置与下拉列表相关的属性。以下是一些常用的QComboBox接口及其作用:
通过这些接口,可以动态地向下拉列表添加、插入和移除文本项,设置和获取当前选中项的索引和文本,管理下拉列表的可编辑性,以及使用自定义数据模型来填充下拉列表。同时,通过与信号和槽机制配合使用,可以实现对用户选择或编辑事件做出响应,并执行相应的操作。
QCompleter 是 Qt 框架中的一个类,用于为用户提供自动完成(Autocompletion)功能。它可以与 QLineEdit、QComboBox、QPlainTextEdit 等控件一起使用,以便在用户输入时提供匹配的建议。
QCompleter 可以根据提供的模型来查找并过滤与用户输入匹配的项。它支持多种匹配模式,例如前缀匹配、后缀匹配、包含匹配等。
要使用 QCompleter,首先需要创建一个数据模型(例如 QStringListModel 或 QSqlQueryModel),该模型包含了要进行自动完成的所有项。然后,通过将该数据模型传递给 QCompleter 的构造函数,来创建一个 QCompleter 的实例。
在将 QCompleter 与文本输入控件关联后,当用户在控件中输入文字时,QCompleter 将根据输入内容自动显示匹配的建议。用户可以通过键盘上下方向键或鼠标选择建议列表中的项,然后按下回车键或单击以将建议的项插入到文本输入控件中。
除了基本的自动完成功能外,QCompleter 还提供了一些高级特性,例如自定义过滤器和排序器、设置最大建议数、限制匹配模式等。这些功能可以通过 QCompleter 的方法和属性进行配置。
总之,QCompleter 提供了一种简单而强大的方式来实现自动完成功能,使得用户在输入文本时可以更快地找到和选择匹配的选项。
在 QComboBox 中,每个下拉项都可以关联一个用户数据(user data)。用户数据是与下拉项相关联的自定义值,可以是任何类型的对象或数据。QComboBox 提供了一些方法来添加、获取和操作用户数据。
通过将用户数据与下拉项关联起来,可以在选择下拉项时轻松地获取这些数据,从而实现更灵活和个性化的功能。下面是一些使用用户数据的常见情况:
数据存储:用户数据允许您将自定义数据附加到每个下拉项。这可以用于将某些特定的标识符、整数值、枚举等与下拉项相关联。当用户选择某个下拉项时,您可以根据用户数据快速访问并处理所需的数据。
数据筛选和匹配:用户数据提供了一种在 QComboBox 中进行高级过滤和匹配的方式。您可以根据用户数据进行筛选和排序,以便将下拉项按照特定的顺序或条件进行显示。此外,用户数据还可以用于自定义搜索功能,以便根据特定的字段或属性进行匹配。
上下文信息:用户数据可以用于保存与下拉项相关的上下文信息。例如,您可以将对象或数据结构与每个下拉项关联,以便在选择下拉项时获取相应的上下文信息,并在后续的操作中使用。
总之,QComboBox 中的用户数据提供了一种将自定义数据关联到下拉项并在选择时使用的机制。通过使用用户数据,您可以为每个下拉项提供更多的上下文信息和功能,以满足特定的需求。
演示QComboBox的基础功能。下面代码的功能是创建一个主窗口,其中包含一个下拉列表控件。它演示了如何设置下拉列表的选项、获取当前选中项的索引和文本、设置下拉列表的可编辑状态以及监听用户选择的事件。
#include
#include
#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::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
#include
#include
#include
#include
#include
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::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::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
#include
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的下拉项: