Я создал кастом QCompleter
класс, который отображает все элементы во всплывающем окне, которые содержат набранное слово QLineEdit
,
Сейчас все элементы упорядочены в алфавитном порядке, как вы можете видеть здесь:
Я хочу, чтобы всплывающее окно отображало «dab» в качестве первого предложения, если я наберу «dab», а затем другие элементы в алфавитном порядке.
Я хочу этот порядок всплывающих окон:
Это обычай QCompleter
класс, который я использую:
Код
class MyCompleter : public QCompleter
{
Q_OBJECT
public:
inline MyCompleter(const QStringList& words, QObject * parent) :
QCompleter(parent), m_list(words), m_model()
{
setModel(&m_model);
}
// Filter
inline void update(QString word)
{
// Include all items that contain "word".
QStringList filtered = m_list.filter(word, caseSensitivity());
m_model.setStringList(filtered);
m_word = word;
complete();
}
inline QString word()
{
return m_word;
}
private:
QStringList m_list;
QStringListModel m_model;
QString m_word;
};
Я сделал это сам, создав копию своего m_list
и искать его с startsWith
функция. Затем я добавил найденные предметы в tempList
и отфильтровал c_m_list
как я и сделал в своем вопросе. filtered
список также был добавлен в tempList
,
Теперь это выглядит так:
Код
class MyCompleter : public QCompleter
{
Q_OBJECT
public:
inline MyCompleter(const QStringList& words, QObject * parent) :
QCompleter(parent), m_list(words), m_model()
{
setModel(&m_model);
}
inline void update(QString word)
{
// Include all items that contain "word".
int idx(0);
QStringList tempList;
QStringList c_m_list(m_list);
while (idx < c_m_list.size())
{
if (c_m_list.at(idx).startsWith(word,Qt::CaseInsensitive))
{
tempList.append(c_m_list.takeAt(idx--));
}
idx++;
}
QStringList filtered = c_m_list.filter(word, caseSensitivity());
c_m_list.sort();
tempList.append(filtered);
m_model.setStringList(tempList);
m_word = word;
complete();
}
inline QString word()
{
return m_word;
}
private:
QStringList m_list;
QStringListModel m_model;
QString m_word;
};
Других решений пока нет …