首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改QCompleter弹出的顺序?

如何更改QCompleter弹出的顺序?
EN

Stack Overflow用户
提问于 2017-08-28 12:39:34
回答 2查看 775关注 0票数 1

我已经创建了一个自定义QCompleter类,它在弹出窗口中显示包含QLineEdit类型化单词的所有项。

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

我希望弹出显示"dab“作为第一个建议,如果我键入"dab”,然后其他项目按字母顺序排列。

我想要这个弹出命令:

  • dab
  • 可修正
  • 可判定
  • 可分
  • 可导
  • 可花销
  • ..。

我怎样才能做到这一点?

这是我使用的自定义QCompleter类:

代码语言:javascript
复制
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;
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-29 13:37:55

通过创建m_list的副本并使用startsWith函数搜索它,我自己做到了这一点。然后,我将找到的项添加到tempList中,并像我在问题中所做的那样过滤c_m_listfiltered列表也被添加到tempList中。

现在看起来是这样的:

代码语言:javascript
复制
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;
};
票数 1
EN

Stack Overflow用户

发布于 2022-04-07 10:06:35

一个更快的更新功能:

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45919280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档