我有一个应用程序,人们可以在表单中输入地名。由于这里是欧洲,我们必须处理包含变音符号的名称,例如Orléans、Köln、Liège和Châteauroux。当人们输入名称时,我希望他们能够输入没有变音符号的字符,但仍然能够列出包含变音符号的名称列表,以便他们可以选择正确带重音符号的名称。该程序有一个长但不完整的名称列表(人们总是可以输入任何他们喜欢的名称)。
我已经有一个函数,可以基于非变音符号匹配找到名称。因此,“orle”将返回“Orléans”,“kol”将找到“Köln”等等。
我尝试了两件事:
1:一个带有QCompleter的QLineEdit,它使用QStringListModel填充completer中的列表与匹配项。不幸的是,这并不起作用,因为列表将包含名称的带重音符号的版本,这与用户输入的值不匹配,因此QLineEdit不会显示弹出窗口中的名称(如果有的话)。
我还尝试了一个QAbstractItemModel,直到我意识到QCompleter对模型返回的数据进行字符串匹配,所以再次“orle”!=“orlé”。
2:可编辑的QComboBox,其列表根据到目前为止输入的文本动态填充。以下代码从QComboBox::editTextChanged(QString)连接()。
我已经有一个函数,可以基于非变音符号匹配找到名称。因此,“orle”将返回“Orléans”,“kol”将找到“Köln”等等。
我尝试了两件事:
1:一个带有QCompleter的QLineEdit,它使用QStringListModel填充completer中的列表与匹配项。不幸的是,这并不起作用,因为列表将包含名称的带重音符号的版本,这与用户输入的值不匹配,因此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]弹出窗口,但这会使焦点从行编辑器中移除。点击行编辑器会关闭弹出窗口,所以我陷入了一个进退两难的境地(人们应该能够继续输入字符,缩小搜索范围)。
如果您有任何关于如何使此方法起作用的建议,将不胜感激。我更喜欢使用QLineEdit来解决问题。版本是Qt 5.4。
[1] 应该是在找到匹配项时触发,但是很遗憾没有。