如何更改QCompleter弹出窗口的顺序?

时间:2017-08-28 12:39:35

标签: c++ qt qcompleter

我创建了一个自定义QCompleter类,该类显示弹出窗口中包含QLineEdit类型字的所有项目。

现在所有项目都按字母顺序排列,如下所示:

enter image description here

如果我输入“dab”然后按字母顺序输入其他项目,我希望弹出窗口显示“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;
};

1 个答案:

答案 0 :(得分:1)

我是通过创建m_list的副本并使用startsWith功能进行搜索来自行完成的。然后,我将找到的项目添加到tempList并按照我在问题中的操作过滤了c_m_listfiltered列表也已添加到tempList

现在看起来像这样:

popup example

<强>代码

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;
};