我已经创建了一个自定义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;
};发布于 2017-08-29 13:37:55
通过创建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;
};发布于 2022-04-07 10:06:35
一个更快的更新功能:
inline void update(QString word)
{
// Include all items that contain "word".
QStringList filtered = m_list.filter(word, caseSensitivity());
QStringList new_list;
int index = 0;
while (index < filtered.size()) {
if (filtered.at(index).startsWith(word, Qt::CaseInsensitive)) {
new_list.append(filtered.takeAt(index--));
}
++index;
}
new_list.append(filtered);
m_model.setStringList(new_list);
m_word = word;
complete();
}https://stackoverflow.com/questions/45919280
复制相似问题