【发布时间】:2015-07-16 22:48:56
【问题描述】:
我有一个应用程序,人们可以在其中在表单中输入地名。这是欧洲,我们必须处理包含变音符号的名称,如奥尔良、科隆、列日、沙托鲁。当人们输入名称时,我希望他们能够输入不带变音符号的字符,但仍会提供包含它们的名称列表,以便他们选择正确重音的名称。该程序有一个很长但并不详尽的名字列表(人们总是可以输入他们喜欢的任何名字)。
我已经有一个基于非变音符号匹配查找名称的函数。所以'orle'会返回'Orléans','kol'会找到'Köln',等等。
我尝试了两件事:
1:带有 QCompleter 的 QLineEdit,它使用 QStringListModel 用匹配项填充完成器中的列表。不幸的是,这不起作用,因为列表将包含重音版本的名称,它与用户输入的值不匹配,因此 QLineEdit 不会在弹出窗口中显示名称(如果有的话)。
我还使用了 QAbstractItemModel,直到我意识到 QCompleter 对模型返回的数据进行字符串匹配,所以再次使用 'orle' != 'orlé'。
2:一个可编辑的QComboBox,列表会根据目前输入的文本动态填充。以下代码是从 QComboBox::editTextChanged(QString) 连接()的:
void TripFormCargoHelper::fromEdited (const QString &str)
{
if (str.length () >= 3)
{
QStringList flist = m_database->findLocationStrings (str);
flist.push_front (str); // add the text we're editing first
bool b = box->blockSignals (true); // prevent recursive signals
box->clear ();
box->addItems (flist);
box->blockSignals (b);
box->showPopup ();
}
else
{
box->clear ();
box->hidePopup ();
}
}
这可行,但只有一半...我希望在输入某些字符时出现弹出窗口 [1] 但这会从行编辑中移除焦点。单击行编辑关闭弹出窗口,所以我最终得到了一个 catch-22(人们应该能够继续输入字符,缩小搜索范围)。
任何有关如何使这项工作的建议将不胜感激。我更喜欢 QLineEdit 的解决方案。版本是 Qt 5.4。
[1] 应该是在我找到一些匹配项的时候,但是唉。
【问题讨论】:
-
我发现这个问题可能会有所帮助:QCompleter Custom Completion Rules
标签: qt qt5 qcombobox non-ascii-characters