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

本人做了一个自定义控件SeepedSearch 用于快速检索匹配的字符的下拉框 方便查找目标

直接上源码

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
:
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);

相关推荐
总要学点什么9 分钟前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质
田甲24 分钟前
做一款 Type-C 母座读卡器:GL3224 双卡方案实测
c语言·开发语言
严肃小白兔40 分钟前
MATLAB 绘图与科研论文插图制作:图形设计、统计表达与矢量导出
开发语言·matlab·科研绘图
Funlang2 小时前
给机器写的 JavaScript 造个笼子
开发语言·javascript·ecmascript
普通人63 小时前
PHP文件读写完全指南
开发语言·php·1024程序员节
坤坤子吖3 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
一晌小贪欢4 小时前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
一条大祥脚5 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
FRing036 小时前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2