• qt qcomboBox实现自动检索功能 通过输入匹配字符进行筛选


    本人做了一个自定义控件SeepedSearch 用于快速检索匹配的字符的下拉框 方便查找目标
    直接上源码
    1.
    SpeedSerach.h
    #pragma once

    #include

    class QComboBox;
    class QCompleter;
    class SpeedSearch : public QWidget
    {
    Q_OBJECT
    public:
    explicit SpeedSearch(QWidget *parent = 0);
    void initData(const QStringList &strList);
    void setEditable(bool bEnabled);
    void setCurrentText(const QString& sText);
    QString currentText();
    void setCurrentIndex(const int& nIdx);
    int currentIndex();
    void AddItem(const QString& sText);
    int Count();
    QString itemText(int idx);
    void hideSubcontrol();//掩藏下拉框
    void setPlaceholderText(QString& sText);

    public slots:
    void slotCurrentIndexChanged(const QString &str);
    signals:
    void currentIndexChanged(const QString&);
    protected:
    void showEvent(QShowEvent *event);

    private:
    QComboBox *m_comboBox;
    QCompleter *m_completer;
    };

    /

    SpeedSearch.cpp
    #include “SpeedComboboxSearch.h”
    #include

    SpeedSearch::SpeedSearch(QWidget *parent)
    QWidget(parent)
    , m_completer(nullptr)
    {
    m_comboBox = new QComboBox(this);
    m_comboBox->setView(new QListView());
    m_comboBox->setEditable(true);
    m_comboBox->setMaxVisibleItems(30);
    connect(m_comboBox, SIGNAL(activated(QString)), this, SLOT(slotCurrentIndexChanged(QString)));
    QVBoxLayout *vLayout = new QVBoxLayout(this);
    vLayout->setContentsMargins(0, 0, 0, 0);
    vLayout->setSpacing(0);
    vLayout->addWidget(m_comboBox);
    
    this->setFixedSize(160, 24);
    

    }

    void SpeedSearch::initData(const QStringList &strList)
    {
    if (m_completer) {
    delete m_completer;
    }
    m_completer = new QCompleter(strList, this);
    m_completer->setFilterMode(Qt::MatchContains);
    m_comboBox->setCompleter(m_completer);
    m_comboBox->clear();
    m_comboBox->addItems(strList);
    }

    void SpeedSearch::setEditable(bool bEnabled)
    {
    m_comboBox->setEditable(bEnabled);
    }

    void SpeedSearch::setCurrentText(const QString & sText)
    {
    m_comboBox->setCurrentText(sText);
    }

    QString SpeedSearch::currentText()
    {
    return m_comboBox->currentText();
    }

    void SpeedSearch::setCurrentIndex(const int & nIdx)
    {
    m_comboBox->setCurrentIndex(nIdx);
    }

    int SpeedSearch::currentIndex()
    {
    return m_comboBox->currentIndex();
    }

    void SpeedSearch::AddItem(const QString & sText)
    {
    m_comboBox->addItem(sText);
    }

    QString SpeedSearch::itemText(int idx)
    {
    return m_comboBox->itemText(idx);
    }

    void SpeedSearch::hideSubcontrol()
    {
    m_comboBox->setStyleSheet(“QComboBox::drop-down { subcontrol-origin: padding; width: 0px; height: 0px; image: none; }”);
    }

    void SpeedSearch::setPlaceholderText(QString & sText)
    {
    m_comboBox->insertItem(0, “”);
    m_comboBox->setItemText(0, sText);
    }

    int SpeedSearch::Count()
    {
    return m_comboBox->count();
    }

    void SpeedSearch::slotCurrentIndexChanged(const QString &str)
    {
    qDebug() << str;
    //hide();
    emit currentIndexChanged(str);
    }

    void SpeedSearch::showEvent(QShowEvent *event)
    {
    QWidget::showEvent(event);
    // m_comboBox->setCurrentText(“”);
    m_comboBox->setFocus();
    }

    //注意如果不想用qcombobox 也可以使用qlineEdit替换
    这个功能主要关键的一点技术 使用QCompeter
    QCompleter *m_completer;
    m_completer = new QCompleter(strList, this);
    m_completer->setFilterMode(Qt::MatchContains);
    m_comboBox->setCompleter(m_completer);

  • 相关阅读:
    freertos信号量之二值信号量
    java知识3-----核心2-面向对象高级 续1--对象多态性
    c语言练习95:练习使用双向链表(实现增删改查)
    计算机毕业设计选题推荐-车险理赔信息管理系统-Java项目实战
    HTML5+CSS3+JS小实例:仿优酷视频轮播图
    【git 学习】--- ubuntu18.04 搭建本地git服务器
    【Java|golang】2351. 第一个出现两次的字母
    谷粒学院16万字笔记+1600张配图(十三)——搭建前台环境、首页数据显示
    centos安装NIS
    【Hack The Box】windows练习-- Fuse
  • 原文地址:https://blog.csdn.net/u011533780/article/details/139283934