在不可编辑的QComboBox中,如果您快速按某些键,将在显示的文本中执行搜索,并且将选择具有您键入的前缀的第一个项目。例如,如果组合框中有六个项目,“Alabama”,“Alaska”,“California”,“Colorado”,“Ohio”和“Louisiana”,并且按C,则将选择“California”。如果您等待一段时间并按O,将选择“俄亥俄州”。但是,如果您快速键入“CO”,将选择“Colorado”。
这种行为是Qt的功能吗?显然,尽管下面是GUI框架,但它仍然普遍适用。如果它是Qt处理这个,我可以自定义吗?我想要做的是基本上执行基于ComboBox中未显示的数据的搜索。例如,在用于选择列出登录的用户的ComboBox中,只需键入用户的姓氏即可选择它。但是,在文本中间搜索匹配就足够了(例如,输入“nia”来选择“California”)。
起初,QCompleter似乎有所帮助,但看起来它只适用于可编辑的QComboBox ......
如果使用QComboBox无法做到这一点,应该使用哪个小部件来实现这个目标?
感谢您的关注。
答案 0 :(得分:1)
您继承QComboBox
并重新实施keyPressEvent
。假设您在组合框中实现了一个函数,该函数添加了一个带有两个参数的条目:登录名和实际名称:
void MyComboBox::addEntry(QString loginName, QString name)
{
addItem(loginName);
// Store the name in a member variable, eg a map between names and login names
namesMap.insert(name, loginName);
}
void MyComboBox::keyPressEvent(QKeyEvent *evt)
{
QString currentString = ebt->text();
if (currentString.isEmpty())
{
QComboBox::keyPressEvent(evt);
return;
}
// Iterate through the map and search for the given name
QMapIterator<QString, QString> it(namesMap);
while(it.hasNext())
{
it.next();
QString name = it.key();
if (name.contains(currentString))
{
// it.value() is the login name corresponding to the name
// we have to find its index in the combo box in order to select it
int itemIndex = findText(it.value());
if (itemIndex >= 0)
setCurrentIndex(itemIndex);
return;
}
}